使用 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 条目更新为指向最新的写入器端点。

指定的 AURORA_GLOBAL_CLUSTER 必须在 AWS 帐户中唯一,并遵循为 "DB 集群标识符" 概述的约定。

将 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"

将 ROSA 集群与 Aurora 集群断开连接

要删除 ROSA 和 Aurora VPC 之间的对等连接,请执行 ./provision/aws/rds/aurora_delete_global_peering_connection.sh 并使用以下环境

AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
CLUSTER_NAME= # The name of the ROSA cluster to remove the peering connection from

删除 Aurora 集群

在删除 Aurora 集群之前,必须先删除与 ROSA 集群建立的所有对等连接。

要删除 Aurora 集群,请执行 ./provision/aws/rds/aurora_delete_global_db.sh 并使用以下环境

AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster