一、Heartbeat的主要组件介绍
集群资源管理器(CRM,ClusterResourceManager):
CRM是集群系统中最主要的管理进程,它负责对整个集群资源的管理和约束,包括资源的配置及相互间依赖关系,并决定资源运行的状态、位置和顺序等.另外它还负责监控本地资源管理器完成这些工作,CRM通过与系统的每一个组件通信来相互作用和协调操作,CRM通过heartbeat通讯模块进行节点间通讯,从CCM(ConsensusClusterMembership)接受当前集群的成员信息,指令STONITHDaremon如何工作,负责记录系统日志等;
策略引擎(PE,CRMPolicyEngine):
PE是CRM的一个组件,只能在主节点上运行.PE的功能是根据当前集群的状态及集群资源的约束配置计算出集群的下一个状态,即为TE生成将要执行的计划和策略;
(3)执行引擎(TE,CRMTransitionEngine):
TE也是CRM的一个组件,只能在主节点上运行.TE的功能是按照PE生成的集群状态变化计划和策略,指令集群节点上的LRM对具体的集群资源进行操作;
(4)集群信息库(CIB,ClusterInformationBase).
作为CRM的一个组件,CIB进程实际上是自动复制的、由CRM收集的关于集群资源和节点信息的副本,为了方便使用,这个副本的所有信息都将写入cib.xml文件;
(5)集群成员一致性(CCM,ConsensusClusterMembership).
CCM主要负责对集群节点变化的监控,集群状态的变化很大程度上取决于资源运行节点的状态变化;
(6)本地资源管理器(LRM,LocalResourceManager)
LRM实际上是一种抽象的资源代理,在CRM的控制下,通过相应的资源代理对本地资源进行操作.由于具有插件式的结构,LRM支持多种类型的资源代理(对应的规范不同):OCF(OpenClusterFramework)类,heartbeat类,LSB(LinuxStandardsBase)类和STONITH类;
(7)STONITH
STONITH代理的功能是对集群中节点通过调用STONITHAPI实施隔离,确保STONITH设备(或资源)仅被集群中的某个节点子集访问;
(8)MessagingLayer:
heartbeat的底层通讯模块,主要负责各节点间的集群信息传递,能够在多种传输媒介以多种传输方式通信。
一个负载均衡集群可以提供一定程度上的高可用性,这需要建立在director对后端服务器的健康状况进行探测的情况下,但这也不是完整意义上的高可用,如果集群中的某台设备宕机,此时的连接到此服务器上的会话会断开,会丢失一些数据;如果能共享用户会话的话,数据基本上可以保持完整,如果Director宕机,会发生什么情况,整个集群就停止工作了,所以各个系统的高可用就显得非常必要了。
二、高可用集群具备什么条件:
1、节点之间的认证功能,防止非法节点随意加入集群;
节点之间进行认证的常用做法是采用HMAC机制,原理是在节点上配置相同的预共享秘钥,然后将此秘钥HASH之后,在节点间传送,当节点收到keepalive包时,检查此字段。
2、当某个节点离线之后,必须做出决策,是否继续提供集群服务;
当某节点离线之后,剩余的节点采取一种有效的投票机制,如票数必须大于总数的半数以上,才可以继续提供服务,每个节点可以根据性能决定单个节点可以独自提供多于其他节点的票数;如果不能提供这种机制,将会发生资源争用,对应共享存储,这种影响后果很严重;
当主机发生故障时,所拥有的资源转移到备用主机上,称为failover,如果主机恢复,又把转移出的资源抢回来,叫failback;有时需要这种机制,比如,备用设备性能较差,只能临时使用。有时不能failback,因为资源转移时必然会影响客户体验。那么主备节点之间如何知道对方的健康状况的呢?那就需要应用程序不间断的向外通告自身状况。大部分的应用程序服务本身不具备高可用的能力,但我们通常会期望他具有这种能力,怎么办?
如apache程序如何得知集群节点故障的呢,又是如何进行故障转移的呢?应用程序通过什么方式获取信息的呢?显然应用程序暂时不具备这种能力,既然有很多程序需要高可用,那么我们就把这种功能独立出来,作为向库文件一样的作用;集群的基础架构层(Cluster Infrastructure Layer,也称Messaging Layer)的作用是传递各个成员之间的健康状况;其实应用程序跟信息层之间还有一层叫资源管理层,作为应用程序的代理,把应用程序的需要的各种服务当做资源来管理,同时还要跟信息层通信,当故障发生时,决定在哪台设备上运行,以及管理集群成员关系,选举出一个节点作为管理者,处理集群事务
资源管理层为服务器提供了一种属性叫资源黏性,每一种资源对于某台主机而言都定义了三种资源约束:(定义资源的倾向性)
位置约束:更倾向于运行在哪台主机上或更倾向于离开哪台主机,用负无穷和正无穷表示两个极端;负无穷表示只要有其他选择就不会运行在此主机上,正无穷表示只要此主机存在就运行在此主机上;
排列约束:用于定义资源和资源之间的关系,是否可以运行在一起的倾向性;
顺序约束:用于定义资源之间的启动和关闭顺序
故障(资源)转移域:定义故障转移的范围,对有些集群来讲,通过左对称或右对称的方式进行转移,左对称就是转移到指定主机,右对称就是不能转移到指定主机
CRM在每个节点上提供了一系列完成启动资源的代理,(一般是命令或脚本),定义为集群的各服务一定不能开机启动,必须由CRM来控制。
当集群中新加入一个节点后,须由资源管理器通过代理进行启动,CRM不会直接跟RA打交道,是通过LRM(local resource manager),每个节点有对应的LRM,当一个节点出现故障时,DC通知某主机对应的LRM,再有LRM通知RA来启动相应的服务,以提供故障转移服务
RA(Resource Agent )有LSB(Linux Standard Base)脚本,也就是位于/etc/init.d/下的脚本;OCF(Open ClusterFramework)格式,当服务器某个资源不能正常工作时,每个资源代理启动资源后,还能定期监控资源的运行状况,一旦发生故障,立即通知CRM,然后采取相应动作,如重启,或转移。
至此整个HA的轮廓已然呈现在我们面前。
每个节点都安装了底层心跳传输工具,定期向其他节点传输健康状况,此功能有信息层来完成,资源管理器通过收集底层信息,来确定节点状况,从节点中选择一个节点作为主节点来协调整个集群,这个节点称为DC(DesignatedCoordinator,指定协调员)。
提供MessagingLayer的工具有
heartbeat、、corosync 、RHCS套件中cman,(openAIS的实现)、keepalived
提供CRM功能的软件:
heartbeatV1 ----> Haresources
heartbeatV2 ---->CRM
heartbeatV3 ---->pacemaker
RHCS 套件中 resource group manager ,对资源进行分组管理,
RA类型:
LSB、OCF、heartbeat ,stonith、linbit、pacemaker
当出现故障时,系统对资源的处理方式有如下几种:
stopped、ignore、freeze、suicide,
当集群出现分裂时,占有多数席位的一方会将对方隔离、防止发生资源争用
资源类型分为:
主资源(primitive、native),只能在一个节点上运行的资源、
group,将多个资源分成一组
clone,在多个节点上同时运行的,如stonith,clusterfilesystem
主从资源(master、slave),drbd
集群运行模式又分为:
active/active
active/passive
对于双节点集群,可以使用以下方式防止集群做出错误决定
1、ping node方式
2、qdisk (quorum disk,仲裁磁盘)