最近测试发现,之前AWS RDS可以创建cross-region replica的选项没有了.(北京和宁夏区域都不可以了)。这个功能经常是时有时无。据说是考虑合规性原因,该功能不在Console中直接可见了。
办法总是比困难多。没有console,我们还有cli,方法总还是有的。
经测试,方法如下:
-
首先参考官方cli文档
创建cross-region replica 命令行方式
https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html -
如果跨region,其中有arn部分的填写要求
构建 Amazon RDS 的 ARN
https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_Tagging.ARN.html#USER_Tagging.ARN.ConstructingRDS example: arn:aws:rds:<region>:<account number>:<resourcetype>:<name>
注意,中国区是arn:aws-cn..... 这里是个小坑。最好根据自己已有的RDS,在configuration中查找arn,进行修改。
- 实际测试有效的输出:
下面命令,是aws cli连接到cn-north-1(北京),远程调同账号下的cn-northwest-1(宁夏)的数据库testdb,创建replica到北京。
测试为目的,更多可选参数,我没有添加,计划后续通过控制台修改。aws rds create-db-instance-read-replica \ --db-instance-identifier cli-create-xx \ --source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \ --db-instance-class db.m4.large \ --source-region cn-northwest-1
结果截图:4. 如果创建同region的replica,就简单一些,不用写arn,只要写master和replica的名字即可
aws rds create-db-instance-read-replica \
--db-instance-identifier cli-create-testdb2 \
--source-db-instance-identifier mysql57 \
--db-instance-class db.m4.large \
--source-region cn-north-1
注释:aws cli方式创建cross-region replica,需要设定aws configure环境,连接到计划创建replica的region(我就是连接的北京,replica也就创建在北京)。原因是由于db-instance-identifier不能指定arn,而source-db-instance-identifier 可以指定arn。 而只有通过arn,在配合source-region参数,才能跨region去寻找资源。
- 举例说明:
需求:
Master 在北京
Replica在宁夏
实际操作:
aws configure配置中,选择连接北京
aws configure
AWS Access Key ID [****************ZFFF]:
AWS Secret Access Key [****************HfnD]:
Default region name [cn-north-1]:
Default output format [None]:
然后开始执行第3步的创建命令。
以下是更多VPC,security group,db-subnet-group等参数的添加测,更全的参数选择和指定,才具有生产实际使用的价值
-
指定VPC,安全组
aws rds create-db-instance-read-replica \ --db-instance-identifier replica-zhy-1 \ --source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \ --db-instance-class db.m4.large \ --source-region cn-northwest-1 \ --availability-zone cn-north-1b \ --vpc-security-group-ids sg-0df896e1034f08331 \ --db-subnet-group-name replica-subnet-group
创建完成截图,
注释:图中红框内信息,都是需要在命令行中使用的。增加公网访问,存储类型,multi-AZ等
aws rds create-db-instance-read-replica \ --db-instance-identifier replica-zhy-2 \ --source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \ --db-instance-class db.m4.large \ --source-region cn-northwest-1 \ --availability-zone cn-north-1b,cn-north-1a \ --vpc-security-group-ids sg-0df896e1034f08331 \ --db-subnet-group-name replica-subnet-group \ --vpc-security-group-ids sg-0df896e1034f08331 \ --multi-az \ --publicly-accessible \ --storage-type standard \ --deletion-protection \ --tags Key=Name,Value=test-OK
遇到错误
An error occurred (InvalidVPCNetworkStateFault) when calling the CreateDBInstanceReadReplica operation: Cannot create a publicly accessible DBInstance. The specified VPC does not support DNS resolution, DNS hostnames, or both. Update the VPC and then try again
上面的错误,以下参考文档,需要启用 Amazon VPC 的 DNS 主机名和 DNS 解析属性。
VPC 网络属性 enableDnsHostnames 和 enableDnsSupport 必须设置为 true.要查看和修改这些属性,请转到位于 https://console.aws.amazon.com/vpc/ 的 VPC 控制台。
https://aws.amazon.com/cn/premiumsupport/knowledge-center/rds-launch-in-vpc/?nc1=h_ls
https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/vpc-dns.html - 解决完VPC问题,重新执行,继续发现错误。--multi-az和--availability-zone不能同时出现,即使我吧两个AZ都列上了,还是不行。
aws rds create-db-instance-read-replica \ --db-instance-identifier replica-zhy-2 \ --source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \ --db-instance-class db.m4.large \ --source-region cn-northwest-1 \ --availability-zone cn-north-1b,cn-north-1a \ --vpc-security-group-ids sg-0df896e1034f08331 \ --db-subnet-group-name replica-subnet-group \ --vpc-security-group-ids sg-0df896e1034f08331 \ --multi-az \ --publicly-accessible \ --storage-type standard \ --deletion-protection \ --tags Key=Name,Value=test-OK
An error occurred (InvalidParameterCombination) when calling the CreateDBInstanceReadReplica operation: Requesting a specific availability zone is not valid for Multi-AZ instances.
8.去掉availability-zone参数,执行成功
aws rds create-db-instance-read-replica \
--db-instance-identifier replica-zhy-2 \
--source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \
--db-instance-class db.m4.large \
--source-region cn-northwest-1 \
--vpc-security-group-ids sg-0df896e1034f08331 \
--db-subnet-group-name replica-subnet-group \
--multi-az \
--publicly-accessible \
--vpc-security-group-ids sg-0df896e1034f08331 \
--storage-type standard \
--deletion-protection \
--tags Key=Name,Value=test-OK
-
增加磁盘类型IO1,IOPS参数,option-group-name测试
aws rds create-db-instance-read-replica \ --db-instance-identifier replica-zhy-5 \ --source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \ --db-instance-class db.m4.large \ --source-region cn-northwest-1 \ --vpc-security-group-ids sg-0df896e1034f08331 \ --db-subnet-group-name replica-subnet-group \ --no-multi-az \ --port 3316 \ --publicly-accessible \ --vpc-security-group-ids sg-0df896e1034f08331 \ --storage-type io1 \ --iops 1000 \ --deletion-protection \ --tags Key=Name,Value=test-OK \ --option-group-name mysql8-replica
输出可以看到port修改是有效的
选项组也是有效的 - 使用gp2存储测试。
注释:如果设置--storage-type standard,默认使用io1,iops 1000的设定了。其实,即使在aws console控制台,也是不能选择普通磁盘了。(如果有哪位大神测试过好用的设置方法,欢迎在文章底部留言,谢了)aws rds create-db-instance-read-replica \ --db-instance-identifier replica-zhy-6 \ --source-db-instance-identifier arn:aws-cn:rds:cn-northwest-1:027807615311:db:testdb \ --db-instance-class db.m4.large \ --source-region cn-northwest-1 \ --vpc-security-group-ids sg-0df896e1034f08331 \ --db-subnet-group-name replica-subnet-group \ --multi-az \ --port 3316 \ --publicly-accessible \ --vpc-security-group-ids sg-0df896e1034f08331 \ --storage-type gp2 \ --deletion-protection \ --tags Key=Name,Value=test-OK \ --option-group-name mysql8-replica
输出如下,经过多次测试,--storage-type无论设置什么值(包括不设置),都是使用IO1的磁盘,100G,1000IOPS的默认设置。
总结,通过命令行创建replica,很快就能创建完成,但是有很多参数,是在replica创建完成之后,再次modify的,需要一段时间调整。
下面几个参数,是后面再改的(当然,都是系统自动完成的)。
--multi-az
--port 3316
--storage-type gp2
经过多次测试,--storage-type无论设置什么值(包括不设置),都是使用IO1的磁盘,100G,1000IOPS的默认设置。最后会修改为--storage-type指定的类型。
参考下截图,最终完成时间,主要是看数据量大小.
至此,就完成replica的创建。