HA集群架构
每个节点上都有 信息层和集群管理层
唯一区别的是: DC被推举出来运行资源的主机才有,只有DC上才有PE,TE、D
当DC上通过PE决策引擎改变了CIB配置文件后,会自动同步到每个节点的CIB(RA脚本定义到CIB库中)上去。
所以,每个节点上都要安装 corosync 和 pacemaker
高可用宏观工作机制:
首先,通过信息层(Msssaging Layer)获取各节点间的信息,这些信息通过资源管理器(CRM)来进行管理。
如果某一节点出现故障,DC(当前正在运行资源的那个节点才单独有的,如果不幸正在运行资源的那个节点挂了,那就要重新推选出一个DC)来计算剩下的票数,PE(Policy Engine 策略引擎)判断各节点是否能够作为一个集群进行运行,如果可以运行,它将通知给TE,TE就要根据这一结果指挥着LRM(每个节点上都有LRM,TE将决策结果传递给其他被选中的节点)来进行资源的转移或者动作,而RA(Resource Agent资源代理)则是提供执行这一动作的脚本,而这一系列的动作到保存在CIB库中。
这一问题解决了,我们接着回到CRM资源管理层上,在CRM上有几个相关概念:
CIB: 在CRM中,要知道一个节点上到底有哪些资源,资源间的约束关系有哪些以及刚刚我们提及的一个节点故障后剩余节点还有多少票等待,在CRM中都要定义其相关的配置文件,这个配置文件就叫做CIB—cluster information base :集群信息库,也可以理解为它是在每个节点上运行的一个进程,它在每个节点上都要保持一致。
PE: 集群策略引擎,它负责收集信息层中各节点信息,并判定接下来的节点还能否成为一个集群继续运行;
TE:集群事务引擎,PE是负责判定能不能运行,它则是负责将PE计算的结果指挥着各资源代理进行响应的操作;
LRM:本地资源代理,它即是TE要通知的代理,管理各资源的启动;
LRM,CIB是运行在各个节点上的,而PE,TE 是运行在DC上的
1) 共享信息层
在基础架构上实现心跳信息探测。双方节点可以随时探测到对方的心跳信息,以实现对对方主机工作状态的探测。三类控制信息:心跳(Heartbeats),集群事务信息(Cluster Transition Messages),重传信息(Retransmission Request)。 配置文件:/etc/ha.d/ha.cf。各节点间域共享密钥,实现节点间互相通信的认证。加密方式:MD5,HMAC-SHA1 。常用实现软件:HeartBeat、keepalived、ultramonkey、openais/corosync。红帽官方提供的集群套件RHCS底层使用的通信机制就是openais/corosync。
2) 资源分配子层
在资源分配上定义资源种类,界定资源归属,每个服务需要哪些资源及这些资源之间的前后次序。
集群资源管理器(CRM,常用软件pacemaker),管理双方向外提供服务所需用到的资源,包括IP地址、Web服务、共享存储等等。而这些资源需要依靠集群信息库CIB(XML文件)来定义,同时还必须保证一旦某个节点上的XML文件更新,即刻通知其他节点上的XML也要及时更新。
策略引擎(PE Policy Engine):定义法定人数以及根据法定人数所做出的动作等等。
本地资源管理器(LRM Local Resource Manager):监控本地某个资源的工作状况。
3) 资源层
本地资源代理(Resource Agent),脚本文件,一旦集群资源管理器发现某个资源工作异常,立即通知本地资源代理重启服务。常用方法:
(1)Heartbeat v1;
(2)使用脚本LSB scripts (Linux Standards Base );
(3)OCF Open Cluster Format 开放集群格式(最佳方式)。
3.1.2 高可用集群常用架构模型
(1)一主一从架构;
(2)互为主从架构:两台主机分别提供两种不同的服务;
(3)多主机架构:N台主机组成一个集群,分别提供不同的服务,一台服务器空闲做备节点。或者全部处于工作状态,一台服务器出故障,立刻将服务转移到其他主机上。各节点之间需要以多播的形式将自己的健康情况发送给其他主机。
故障转移域,如果一台主机发生故障,会将主机上的服务转移到域内的另一台主机上。
法定人数(Quorum) 集群超过这个值会正常工作,低于这个值会停止工作,同时也避免出现资源争用的情况。
脑裂和仲裁:在某种情况下,由于底层通知错误,或者传递信息的介质出现故障,会出现资源争用的情况,称之为脑裂。此时,每个部分都想取得对集群资源的控制权,以保证集群的高可用,这将破坏集群资源的完整性和一致性,导致整个集群瘫痪,硬件被破坏等严重后果。为防止脑裂的放生,将由仲裁协议即法定代表人数来决定哪个部分取得对集群资源的控制权。
STONITH (Shoot The Other Node In The Head ):避免出现资源争用的情况,为了防止错误操作的节点对集群资源进行破坏性控制和操作,使其不断重新启动或关机,从而使其无法取得对集群资源的控制权。