Kubernetes上的多集群数据库:架构与部署

Kubernetes上的多集群数据库:架构与部署

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

本文介绍如何在Kubernetes上构建多集群MongoDB部署,以应对区域性故障。通过Percona Operator实现主站点和副本站点架构,利用MCS API连接集群,并采用2+2+1投票模式确保故障时能自动选举新主节点。该方案支持灾难恢复、实时迁移和无停机维护,故障切换通常在12秒内完成。

🔎

延伸解读

2+2+1投票模式的关键作用

文章强调,MongoDB副本集需要严格多数投票才能选举主节点并接受写入。在双集群部署中,若两个站点各有两个投票成员,网络分区时任何一侧都无法达到多数,导致数据库停止写入。通过在第三个位置添加第五个投票成员,形成2+2+1模式,确保故障时一侧能获得3票并选举新主节点。这一设计是跨集群高可用性的核心,理解它有助于评估其他分布式数据库的容灾方案。

主站点与副本站点的角色划分

为避免两个Kubernetes控制平面冲突,文章将集群分为主站点和副本站点。主站点由Operator完全管理,负责生成证书和用户凭证;副本站点以unmanaged模式运行,不初始化新副本集,而是复制主站点的TLS密钥和凭证以加入现有副本集。这种角色分离防止了多个Operator同时控制同一数据库导致的“脑裂”问题,是跨集群部署的关键设计决策。

MCS API的依赖与前提条件

文章指出,Kubernetes多集群服务API(MCS API)并非标准安装的一部分,需要额外实现,如Submariner、Cilium ClusterMesh或GKE原生MCS。在部署前,必须先配置跨集群网络连接,否则Operator无法创建有效的ServiceExport和ServiceImport资源。这意味着采用此方案前,需评估现有基础设施是否支持MCS API,并做好网络层面的准备。

故障切换后的降级状态与风险

文章明确说明,区域故障后数据库虽能自动选举新主节点并继续运行,但会进入“降级”状态:仅剩最少节点数维持多数,冗余度降低,容错能力几乎为零。若再丢失一个节点,数据库将失去多数并进入只读模式。因此,运维人员需在故障后尽快恢复集群,并考虑应用层重试写入以应对切换期间的短暂不可用。

Q&A

如何在Kubernetes上实现MongoDB的多集群部署以应对区域性故障?

通过Percona Operator for MongoDB,利用Kubernetes多集群服务API(MCS API)连接多个集群,并采用2+2+1投票模式(即5个投票成员分布在三个位置)来确保在区域性故障时能自动选举新主节点,从而实现高可用。

什么是2+2+1投票模式?为什么需要它?

2+2+1模式是指将MongoDB副本集的5个投票成员分布在三个位置:两个在主站点,两个在副本站点,一个在第三个位置。这样当网络分区或区域性故障发生时,总有一方能够获得多数票(3票)来选举主节点,避免脑裂和写入中断。

Percona Operator for MongoDB中主站点和副本站点的角色有何不同?

主站点由Operator完全管理,负责生成TLS证书、用户凭据和副本集配置,并持有主节点处理写入。副本站点以unmanaged模式运行,不生成证书或凭据,而是从主站点复制这些信息,节点加入现有副本集,避免两个Operator同时控制数据库。

如何配置Percona Operator for MongoDB以启用多集群服务发现?

在cr.yaml中设置multiCluster.enabled: true,并指定DNSSuffix为svc.clusterset.local。Operator会创建ServiceExport和ServiceImport资源,使不同集群的节点通过共享DNS域进行发现和通信。

多集群部署支持哪些核心场景?

支持灾难恢复(DR)、实时迁移和无停机维护。灾难恢复指区域性故障时副本站点自动接管;实时迁移允许在云迁移时逐步切换流量;无停机维护指可以完全排空和升级一个集群而不影响数据库写入。

在2+2+1模式下,如果主站点完全故障,故障切换需要多长时间?

默认配置下,故障切换的中位时间通常不超过12秒,包括故障检测和选举时间。跨区域网络延迟可能延长此时间,建议应用程序使用可重试写入以应对短暂的无主节点窗口。

部署多集群MongoDB时,如何连接不同Kubernetes集群的网络?

需要先安装MCS API的实现,如Submariner、Cilium ClusterMesh或云提供商的原生解决方案(如GKE Fleet)。这是前提条件,因为MCS API需要这些实现才能创建有效的ServiceExport和ServiceImport资源。

在Percona Operator中,如何配置外部节点以实现2+2+1模式?

在cr.yaml中,通过replsets下的externalNodes字段添加外部节点,指定主机名、投票数和优先级。例如,在副本站点添加两个投票成员(votes: 1, priority: 1)和一个非投票成员(votes: 0, priority: 0),并在主站点和副本站点互相添加对方节点。

🏷️

标签

➡️

继续阅读