AWS CDK为Amazon Aurora添加只读副本时如何获取IDatabaseInstance
问题根因
DatabaseInstanceReadReplica 构造函数仅适用于非集群版的单机RDS实例创建只读副本,不适用于Amazon Aurora集群架构。
Aurora是计算存储分离的分布式集群架构,只读副本是集群内的原生读计算节点,和写节点共享底层集群存储,不是独立于集群存在的单实例资源,因此该构造函数要求的IDatabaseInstance类型入参和DatabaseCluster类型天然不匹配,直接传集群实例必然报类型错误。
正确配置方法
不需要使用DatabaseInstanceReadReplica,根据你的需求二选一即可:
- 方案1:初始化集群时直接指定总实例数
你原有代码中的instances参数代表集群内的总数据库实例数,默认值1代表仅创建1个写实例。如果需要N个只读副本,直接将该参数值设置为1+N,CDK会自动完成1个写节点+N个只读副本的集群创建,所有读节点默认接入集群读终端节点,内置读写分离能力。 - 方案2:集群创建完成后单独追加自定义配置的只读副本
调用DatabaseCluster实例自带的addReader方法即可添加自定义配置的只读副本,替换原有错误代码如下:
const dbCluster = new rds.DatabaseCluster(this, 'Database', { parameterGroup, engine: engine, credentials: rdsCredentials, cloudwatchLogsExports:['slowquery','general','error','audit'], backup: backupProps, instances: 1, // 初始化仅创建1个写实例 storageEncrypted:true, removalPolicy: cdk.RemovalPolicy.DESTROY, clusterIdentifier: dbInfos['cluster'], defaultDatabaseName :dbInfos['database'], instanceProps: { instanceType: instanceType, vpcSubnets:props.vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_ISOLATED }), vpc:props!.vpc, securityGroups:[dbSecurityGroup], }, subnetGroup:subnetGroup }); // 为Aurora集群添加只读副本 dbCluster.addReader('ReadReplica', { instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.SMALL), // 支持自定义可用区优先级、故障转移优先级等读节点专属配置 });
补充说明:Aurora只读副本和单机RDS只读副本的实现逻辑有本质区别:单机RDS只读副本是基于Binlog日志复制的独立数据库实例,有独立的存储资源;而Aurora只读副本直接共享集群底层分布式存储卷,复制延迟通常在100ms以内,属于集群的组成部分,无法脱离集群单独创建。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

