通过CM集群管理的openGauss数据库选主策略

发布时间 2023-07-19 15:56:18作者: y_dou

通过CM集群管理的openGauss数据库选主策略

前提条件:集群内参与选主的备实例数量超过集群实例总数的一半
细分策略:
(1)cma会尝试拉起数据库集群原始主实例,6s内成功拉起则无需新一轮仲裁
(2)local_term最大的
(3)local_last_xlog_location最大的
(4)静态主 local_static_role
(5)与静态主同AZ的节点
(6)AZ riority最小
(7)Instance ID最小

脑裂故障及处理思路
前提条件
CM集群正常,能够对数据库集群实例执行主备角色仲裁
网络隔离场景
(1) CM集群
剩下的cm若不满足多数派则会主动降备。
若满足多数派则会触发选主流程,确保该分区中CM子集群可用性。
一旦网络分区故障消失,CM集群将基于DCF实现多主决策完成CM集群脑裂故障恢复,最终使得CM集群恢复正常。
(2)数据库集群
Quorum仲裁:
仅存在CM集群主实例的分区内才会执行数据库集群实例的主备角色仲裁,无CM集群主实例的分区内的所有数据库集群实例均会降备。
一旦网络分区故障消失,CM集群主实例将基于数据库集群实例的term执行多主决策。若term能区分大小则重启term小的数据库主实例,若term相等则重启所有数据库主实例,进入新一轮的仲裁流程。

脑裂预防
CM 认为集群的正常状态为 CMA 正常定时上报 DN 主状态,否则为异常状态,如:

CMA 不能上报,DN 主存在,且与 DN 备连接正常

首先 CMS 认为主故障,启动选主。由于 DN 主与备机连接正常,会导致备机 LOCK1 失败。超时后 CMS 将通过 SSH 向 DN 主远程发送 KILL 命令,杀死原主,选主流程正常进行。超时阈值设置的公式为:
cmsNum _ agent_connect_timeout _ agent*connect_retries + agent_heartbeat_timeout + 10

CMA 不能上报,DN 主存在,但与 DN 备断连

此时 CMS 认为主故障,启动选主。若完成升主后,CMA 恢复上报,将出现双主,CMS 将杀死原主。

网络隔离处理
多 AZ 部署时,若某个 AZ 被网络故障隔离,剩余的 CMS 节点如仍满足多数派条件,则可以触发自仲裁选主和 DN 仲裁选主流程,即在多数派的节点中产生新的 CMS 主和 DN 主。被隔离的少数派中的 CMS 主将主动降备,并杀死被隔离的 DN 主。若网络隔离快速恢复,被隔离的 DN 主还未被杀死,该 DN 主将被新 CMS 主杀死。

简单说:如果出现脑裂双主的情况,CM是根据多数派来确定集群主是哪台的。这种情况就有可能会出现数据丢失的风险。