使用 Amazon 全球 Aurora PostgreSQL 集群
Amazon 全球 Aurora PostgreSQL 集群可以用作 Keycloak 在单站点或多站点配置中的基础数据库。目前,这仅支持在 ROSA 上部署 Keycloak。
Aurora 全球数据库跨越多个 AWS 区域,可以从整个 AWS 区域的停机中恢复。Aurora 自动处理将所有数据和更新从主 AWS 区域复制到每个辅助区域。
部署 Aurora 集群
可以通过执行 ./provision/aws/rds/aurora_create_global_db.sh
并使用以下环境来跨多个 AWS 区域部署 Aurora 集群
AURORA_GLOBAL_REGIONS= # A list of AWS regions for the Aurora cluster to span. The first region in the list is where the Primary cluster is hosted.
AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
AURORA_INSTANCES= # The number of Aurora db instances to create in each region, defaults to 1.
这将在每个区域创建一个 Aurora 集群,然后将其与全球 Aurora 集群 $AURORA_GLOBAL_CLUSTER
关联。该脚本将在所有区域集群及其实例可用之前等待,然后返回。如果全局集群已存在,则会显示一条消息,表示此情况,并且脚本将以退出代码 1 失败。
Aurora 全球数据库集群由多个区域集群组成,每个区域集群都有自己的专用写入器和读取器端点。为了抽象这一点,我们创建了一个 Route53 CNAME 条目,Keycloak 实例必须使用该条目才能连接到数据库。Route53 条目在 $AURORA_GLOBAL_CLUSTER.aurora-global.keycloak-benchmark.com
处公开主 Aurora 集群的写入器端点。
为了确保上述 Route53 条目在故障转移后反映主集群的写入器端点,我们在每个 $AURORA_GLOBAL_REGIONS
中部署了一个 AWS Lambda 函数。此函数在新的主集群所在的区域中的全球故障转移事件完成后触发,并将 CNAME 条目更新为指向最新的写入器端点。
指定的 |
将 ROSA 集群连接到 Aurora 集群
必须在 ROSA 集群和每个单独的 Aurora 集群之间建立对等连接。
要配置此类连接,请运行 ./provision/aws/rds/aurora_create_global_peering_connections.sh
并使用以下环境
AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
CLUSTER_NAME= # The name of the ROSA cluster to establish the peering connectin with
部署 Keycloak
通过各种任务文件部署 Keycloak 时,必须设置以下环境变量,以确保配置了正确的数据库端点。
AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
KC_DATABASE_URL=$AURORA_GLOBAL_CLUSTER.aurora-global.keycloak-benchmark.com
KC_DATABASE=aurora-postgres
模拟集群故障转移
可以通过执行 failover-global-cluster 命令,从主 Aurora 集群触发故障转移到辅助 Aurora 集群
aws rds failover-global-cluster \
--global-cluster-identifier ${AURORA_GLOBAL_CLUSTER} \
--target-db-cluster-identifier ${AURORA_CLUSTER_IDENTIFIER} \
--allow-data-loss
其中 AURORA_CLUSTER_IDENTIFIER
是您希望成为主机的辅助集群的 arn。以下命令输出全球 Aurora 集群所有成员的 arn
aws rds describe-global-clusters \
--query "GlobalClusters[?GlobalClusterIdentifier=='${AURORA_GLOBAL_CLUSTER}'].GlobalClusterMembers[*].DBClusterArn"