最近测试发现,之前AWS RDS可以创建cross-region replica的选项没有了.(北京和宁夏区域都不可以了)。这个功能经常是时有时无。据说是考虑合规性原因,该功能不在Console中直接可见了。
AWS RDS 跨区域 Replica 命令行创建方法

办法总是比困难多。没有console,我们还有cli,方法总还是有的。
经测试,方法如下:

  1. 首先参考官方cli文档
    创建cross-region replica 命令行方式
    https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance-read-replica.html

  2. 如果跨region,其中有arn部分的填写要求
    构建 Amazon RDS 的 ARN
    https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/USER_Tagging.ARN.html#USER_Tagging.ARN.Constructing

    RDS example:
    arn:aws:rds:<region>:<account number>:<resourcetype>:<name>

    注意,中国区是arn:aws-cn..... 这里是个小坑。最好根据自己已有的RDS,在configuration中查找arn,进行修改。

  3. 实际测试有效的输出:
    下面命令,是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  

结果截图:
AWS RDS 跨区域 Replica 命令行创建方法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 RDS 跨区域 Replica 命令行创建方法

注释:aws cli方式创建cross-region replica,需要设定aws configure环境,连接到计划创建replica的region(我就是连接的北京,replica也就创建在北京)。原因是由于db-instance-identifier不能指定arn,而source-db-instance-identifier 可以指定arn。 而只有通过arn,在配合source-region参数,才能跨region去寻找资源。

  1. 举例说明:
    需求:
    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等参数的添加测,更全的参数选择和指定,才具有生产实际使用的价值

  1. 指定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    

    创建完成截图,
    注释:图中红框内信息,都是需要在命令行中使用的。
    AWS RDS 跨区域 Replica 命令行创建方法

    增加公网访问,存储类型,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

  2. 解决完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

AWS RDS 跨区域 Replica 命令行创建方法
AWS RDS 跨区域 Replica 命令行创建方法

  1. 增加磁盘类型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修改是有效的
    AWS RDS 跨区域 Replica 命令行创建方法
    选项组也是有效的
    AWS RDS 跨区域 Replica 命令行创建方法

  2. 使用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指定的类型。

参考下截图,最终完成时间,主要是看数据量大小.
AWS RDS 跨区域 Replica 命令行创建方法
AWS RDS 跨区域 Replica 命令行创建方法
至此,就完成replica的创建。