简介:
欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。
我将每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿云开发/架构技术基础解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS最佳实践,并应用到自己的日常工作里。本次我将介绍如何设计一个高可用的数据库RDS集群,包括数据库和只读副本实现读写分离,保证系统服务的高可用性,提升数据库查询性能。
方案所需基础知识
什么是 Amazon RDS?
Amazon RDS(Relational Database Service)是亚马逊云科技提供的一项托管关系型数据库服务。它简化了数据库的设置、操作和扩展,使用户能够专注于应用程序开发,而无需担心数据库的维护和管理。RDS 支持多种数据库引擎,包括 Amazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle 和 SQL Server。
为什么要创建高可用只读副本?
在 RDS 集群中创建高可用只读副本(Read Replica)有助于提高应用程序的性能、可用性和扩展性。
分担读负载:
只读副本可以分担主实例的读请求,减少主实例的压力,提高整体读性能和效率。
提升可用性:
只读副本可以在不同可用区或区域中创建,增强系统的容灾能力。如果主实例发生故障,只读副本可以迅速接管读请求,确保服务不中断。
数据库扩展性:
通过增加只读副本数量,可以轻松应对不断增长的读请求需求。只读副本的数量可以根据实际需求进行调整。
简化管理:
RDS 自动管理只读副本的备份、软件补丁和硬件维护,用户无需手动操作,降低运维成本。
本方案包括的内容:
1. 创建一个亚马逊云科技RDS数据库实例
2. 为RDS数据库实例配置只读副本,创建RDS集群
3. 为数据库集群进行数据备份
项目搭建具体步骤:
- 首先我们进入亚马逊云科技控制台,打开RDS服务。
- 点击左侧Database选项,点击"Create Database"创建一个数据库
- 选择MariaDB数据库引擎
- 选择需要的MariaDB版本,点击数据库部署模式为测试/开发模型
- 为数据库起名为"my-database",为数据库配置username和密码,用户名默认为admin
- 为数据库选择计算资源类型: 突增式资源类型"db.t3.xlarge",并配置硬盘存储类型为gp2,大小为20GiB。
- 为数据库的存储配置自动扩展功能,存储最大值扩展值1000GiB。并且选择部署模式为双区高可用,包括跨可用区只读副本。
- 选择RDS实例部署的defaultVPC网络环境和default子网,只允许数据库内网访问No Public Access,并且添加Security Group安全组防火墙。
- 添加MariaDB初始数据库名字"my_database",添加默认MariaDB数据库配置参数组。
- 开启RDS磁盘加密,添加KMS秘钥对其加密。
- 取消数据库集群自动更新维护,配置数据库更新维护窗口。我们在这里也可以看到我们将要创建的数据库实例每个月的价格为401.72美元。
12. 点击末尾的Create创建后,我们就可以看到我们的创建好的RDS数据库集群了。
如何通过cdk代码创建一个RDS数据库集群?
我们也可以利用亚马逊云科技提供的IaC(代码定义基础设施)的方式,用cdk代码创建一个RDS数据库集群,实例代码如下。
python
import * as cdk from 'aws-cdk-lib';
import { CfnOutput, Stack, StackProps } from 'aws-cdk-lib';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';
import { Construct } from 'constructs';
export class RdsStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// Create a VPC
const vpc = new ec2.Vpc(this, 'Vpc', {
maxAzs: 2
});
// Create a secret for the DB credentials
const dbCredentialsSecret = new secretsmanager.Secret(this, 'DBCredentialsSecret', {
generateSecretString: {
secretStringTemplate: JSON.stringify({ username: 'admin' }),
generateStringKey: 'password',
excludeCharacters: '"@/\\',
}
});
// Create the RDS cluster
const cluster = new rds.DatabaseCluster(this, 'Database', {
engine: rds.DatabaseClusterEngine.auroraMysql({
version: rds.AuroraMysqlEngineVersion.VER_2_09_1
}),
credentials: rds.Credentials.fromSecret(dbCredentialsSecret),
instanceProps: {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.XLARGE),
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE_WITH_NAT
}
},
instances: 1,
storageEncrypted: true,
storageType: rds.StorageType.GP2,
allocatedStorage: 20,
defaultDatabaseName: 'MyDatabase'
});
// Create a read replica
const replica = new rds.DatabaseInstanceReadReplica(this, 'ReadReplica', {
sourceDatabaseInstance: cluster.instanceIdentifiers[0],
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.XLARGE),
vpc,
storageEncrypted: true
});
new CfnOutput(this, 'DatabaseEndpoint', {
value: cluster.clusterEndpoint.socketAddress
});
new CfnOutput(this, 'ReadReplicaEndpoint', {
value: replica.dbInstanceEndpointAddress
});
}
}
const app = new cdk.App();
new RdsStack(app, 'RdsStack');
app.synth();
以上就是在亚马逊云科技上创建高可用数据库集群的全部步骤。欢迎大家关注0基础5分钟上手AWS系列,未来获取更多国际前沿的AWS云开发/云架构方案!