1 客户价值与功能
为了满足数据库集群实例的高可用决策和故障自动切换需求, MogDB 3.0引入CM(Cluster Manager)集群管理组件,其主要功能如下:
•数据库实例主备角色仲裁
•CM自身高可用仲裁
•数据库实例运行状态监控
•数据库实例所在节点资源检测
•数据库集群、节点、实例的启动、停止
•数据库集群状态查询、状态更新
数据库集群数据库实例switchover、failover
2 CM 集群管理组网
cm_server是整个集群管理的核心模块,负责集群中各mogdb实例状态的检测,以及对每一组mogdb服务主备高可用角色的仲裁。基于此,一旦mogdb主实例故障,cm_server将触发故障切换机制使得备实例升主,确保集群的可用性。

3 CM 集群管理模块简介
CM集群管理分为om_monitor, cm_ctl, cm_server, cm_agent四大模块,依赖DCF, DCC两大模块实现自研高可用仲裁。其中cm_server服务无需在每个节点进行部署,可以依据需求多个节点共用一个,但需要确保自身高可用。

3.1 CM 集群管理模块之om_monitor
om_monitor进程由Linux crontab定时任务管控,其功能如下:
(1) 监测om_monitor进程自身的运行状态:一旦发现其状体为T则强制kill,待定时任务拉起;
(2) 读取配置文件并监控进程打开的文件描述符数量;
(3) 启动cm_agent进程并监测其运行状态: 监测时间间隔1s;
(4) 监测ETCD进程运行状态(未使用);
3.2 CM 集群管理模块之cm_server
cm_server进程由cm_agent进程管控,其功能如下:
•主线程
注册消息接口,接收客户端口的连接及请求:cm_ctl, cm_agent, other clients
初始化DCC模块,并实现对DCC特定Key的读写操作
•线程池
响应cm_ctl连接请求
响应cm_agent连接请求,接收上报消息,执行数据库实例仲裁
•监控线程
switchover/failover/cluster start/cluster init是否超时,监控数据库实例状态
•HA线程
生命周期同cm_server,与DCC交互,实现cm_server的高可用仲裁
3.3 CM 集群管理模块之cm_agent
cm_agent进程由om_monitor进程管控,其功能如下:
•注册消息接口,接收cm_server指令,调用响应接口执行指令
•管控cm_server进程和mogdb进程
启动/停止:共享一个线程,每隔一秒监测进程是否需要启动/停止。且在启动进程之前会检测磁盘是否损坏、磁盘使用率是否达到预设的阈值、文件系统是否可写、 网卡是否启动。
查询:独立线程,每隔一秒查询一次实例状态并上报给cm_server
•进程僵死检测
监控进程的T/D/Z状态,判定是否僵死(超过一定次数则强制kill)
•故障检测
网卡故障检测
高可用仲裁之cm_server自仲裁
•基本原理
cm_server自仲裁由独立HA线程基于DCF实现,涉及两个主要配置文件:静态配置文件clusterconfig.xml、动态配置文件custer_dynamic_configfile。
•自仲裁场景
(1) cm_server重启
cm_server每次重启均会判定升主模式、启动模式和仲裁模式。同时会基于DCF的判定(g_ddbRole)和前一次角色(g_HA_status->local_role)来断定当前角色,进一步实施升主或者降备。
(2) cm_server终止
异常场景导致原始cm_server primary停止服务(此时cm_server集群无主),DCF将基于心跳超时机制触发选主流程,最终dcf_leader所在节点上的cm_server将被提升为新主。

4 高可用仲裁之mogdb仲裁(Quorum模式)
•前提条件
集群内可参与选主的备机实例数量超过集群节点个数的一半
•细分策略
需要注意的是,当一个mogdb实例被仲裁之前,cma会尝试拉起mogdb实例(超时时间默认6s)

5 脑裂故障处理
•前提条件
cm_server primary必须存在,仅有其能够执行mogdb选主操作(mogdb经由cma上报状态时)。
•场景
1.网络隔离
(1) CM集群
拥有原始主实例的分区,若满足多数派则该分区中CM子集群正常运行;若不满足多数派则会主动降备。不存在主实例的分区,若满足多数派则会触发选主流
程,确保该分区中CM子集群可用性。
一旦网络分区故障消失,CM集群将基于DCF实现多主决策完成CM集群脑裂故障恢复,最终使得CM集群恢复正常。
(2) mogdb
Quorum仲裁:
仅存在CM集群主实例的分区内才会执行数据库集群实例的主备角色仲裁,无CM集群主实例的分区内的所有数据库集群实例均会降备。
一旦网络分区故障消失,CM集群主实例将基于数据库集群实例的term执行多主决策。若term能区分大小则重启term小的数据库主实例,若term相等则重
启所有数据库主实例,进入新一轮的仲裁流程(参照“数据库集群高可用仲裁”)。
DCF仲裁:
参考CM集群高可用自仲裁
2.人为制造脑裂
集群正常状态下,人工强制将一个备升级为主导致的脑裂场景。CM会将两个数据库主实例都kill掉,然后触发新的选主流程。
7 常用命令
•集群级别
启动:cm_ctl start
停止:cm_ctl stop
查询: cm_ctl query -Cvip -z ALL
参数设置:cm_ctl set --param --agent|--server [-n <nodeid>] -k <PARAMETER>=“<value>”
参数更新:cm_ctl reload --param --agent|--server
•节点级别
启动:cm_ctl start -n <nodeid>
停止:cm_ctl stop -n <nodeid>
•数据库实例级别
启动:cm_ctl start -n <nodeid> -D <datapath>
停止:cm_ctl stop -n <nodeid> -D <datapath>
运维切换:cm_ctl switchover –n <nodeid> -D <datapath>
7 已知限制
•不支持VIP
•两节点部署时,集群仅支持启动、停止,一旦故障则不再具备高可用能力
•DCF仲裁模式下不支持AZ相关的switchover




