GaussDB (DWS) 集群管理系列: CMS通信机制介绍
CMS即GaussDB(DWS)集群管理模块(Cluster Manager Server)缩写,是管理和监控分布式系统中各个功能单元和物理资源运行情况,确保整个系统稳定运行的组件。
CMS模块分为CMS_Primary和CMS_Standby,作为高可用的一部分,CMS主在故障后,备CMS会自动升为主CMS,避免出现CMS单节点故障。此外,CMS能够对CMAgent上报的集群实例状态做仲裁,判断当前状态是否正常,是否需要修复,并下发指令给CMAgent执行。
CMS通信对象
集群管理中,CM通信主要分为三个对象,分别为:
1、CMA:CMA周期性上报实例GTM,CN,DN状态给CMS,并发送心跳,CMS将仲裁结果下发command给CMA,实现实例重启、主备倒换、failover升主、实例build等操作,其中使用消息类型对各个command进行区分。
2、cm_ctl:cm_ctl查询集群状态,做switchover、build、query等操作时,需要与cms通信,查询操作由cms返回相关数据,集群使能操作通过cms进行转发。
3、CMS主备间通信:CMS主备间通信涉及到集群HA特性,主要用于同步对集群状态监控的数据,并且作为选主操作时候同步信息。
CMS通信的基本方式
CMS底层使用TCP/IP协议进行通信,socket的建立以及通信过程中的收发使用内部通信库完成。其中CMS会建立两个socket端口,如下图所示,其中端口号小的与CMA和cm_ctl进行通信,端口号大的与cms进行主备通信,两个socket可以区分开来,实现通信模型上互不干扰。
tcp 0 0 192.168.233.17:6850 0.0.0.0:* LISTEN 26087/cm_server
tcp 0 0 192.168.226.35:6851 0.0.0.0:* LISTEN 7632/cm_server
此外,由于CMS主备通信的连接数有限,但是CMA和cm_ctl的连接数较多,所以会使用不同的通信模型。其中前者使用select模型,后者使用epoll模型+线程池技术。两者都是典型的I/O多路复用技术,即当socket具备读或者写的状态,会触发相应的事件通知,这样多个文件描述符就能够并行的完成相应的工作,提高系统的并发程度。
CMS通信的实现
1、线程池模型
为了提高系统的并发程度和效率,当集群节点数增多,并且在运行过程中需要频繁查询集群状态时候,需要有大量的CMA和cm_ctl对CMS进行访问。CMS为此开辟了专门的线程负责线程池的管理工作,并使用epoll IO多路复用机制。具体线程池接入流程如下图所示:
1)cms主线程
2)CMS线程池事件处理流程
以上流程图可以看出,CMS主线程主要负责分发事件,每个cm_ctl、cma的连接由线程池内线程去完成。
2、select方式
CMS主备之间由于通信压力不大,只有两个实例之间通讯,所以主要采用select轮询的方式。每一个HA线程周期,从socket中select已经具备通信条件的文件描述符,完成消息的收发,实现命令消息同步和选主消息的发送。
- 点赞
- 收藏
- 关注作者
评论(0)