一、高可用集群层次 

HA高可用集群基础概念和原理_第1张图片

    说明:高可用集群可分为三个层次结构,分别由红色部分的Messaging与Membership层,蓝色部分的Cluster Resource Manager(CRM)层,绿色部分的Local Resource Manager(LRM)与Resource Agent(RA)组成,下面我们就来具体说明(如上图),

    1.位于最底层的是信息和成员关系层(Messaging and Membership),Messaging主要用于节点之间传递心跳信息,也称为心跳层。节点之间传递心跳信息可以通过广播,组播,单播等方式。成员关系(Membership)层,这层最重要的作用是主节点(DC)通过Cluster Consensus Menbership Service(CCM或者CCS)这种服务由Messaging层提供的信息,来产生一个完整的成员关系。这层主要实现承上启下的作用,承上,将下层产生的信息生产成员关系图传递给上层以通知各个节点的工作状态;启下,将上层对于隔离某一设备予以具体实施。

    2.集群资源管理层(Cluster Resource Manager),真正实现集群服务的层。在该层中每个节点都运行一个集群资源管理器(CRM,cluster Resource Manager),它能为实现高可用提供核心组件,包括资源定义,属性等。在每一个节点上CRM都维护有一个CIB(集群信息库 XML文档)和LRM(本地资源管理器)组件。对于CIB,只有工作在DC(主节点)上的文档是可以修改的,其他CIB都是复制DC上的那个文档而来的。对于LRM,是执行CRM传递过来的在本地执行某个资源的执行和停止的具体执行人。当某个节点发生故障之后,是由DC通过PE(策略引擎)和TE(实施引擎)来决定是否抢夺资源。

    3.资源代理层(Resource Agents),集群资源代理(能够管理本节点上的属于集群资源的某一资源的启动,停止和状态信息的脚本),资源代理分为:LSB(/etc/init.d/*),OCF(比LSB更专业,更加通用),Legacy heartbeat(v1版本的资源管理)。

HA高可用集群基础概念和原理_第2张图片

核心组件的具体说明(如上图):

    1.ccm组件(Cluster Consensus Menbership Service):作用,承上启下,监听底层接受的心跳信息,当监听不到心跳信息的时候就重新计算整个集群的票数和收敛状态信息,并将结果转递给上层,让上层做出决定采取怎样的措施,ccm还能够生成一个各节点状态的拓扑结构概览图,以本节点做为视角,保证该节点在特殊情况下能够采取对应的动作。

    2.crmd组件(Cluster Resource Manager,集群资源管理器,也就是pacemaker):实现资源的分配,资源分配的每个动作都要通过crm来实现,是核心组建,每个节点上的crm都维护一个cib用来定义资源特定的属性,哪些资源定义在同一个节点上。

    3.cib组件(集群信息基库,Cluster Infonation Base):是XML格式的配置文件,在内存中的一个XML格式的集群资源的配置文件,主要保存在文件中,工作的时候常驻在内存中并且需要通知给其它节点,只有DC上的cib才能进行修改,其他节点上的cib都是拷贝DC上。配置cib文件的方法有,基于命令行配置和基于前台的图形界面配置。

    4.lrmd组件(Local Resource Manager,本地资源管理器):用来获取本地某个资源的状态,并且实现本地资源的管理,如当检测到对方没有心跳信息时,来启动本地的服务进程等。

    5.pengine组件:

    PE(Policy Engine):策略引擎,来定义资源转移的一整套转移方式,但只是做策略者,并不亲自来参加资源转移的过程,而是让TE来执行自己的策略。

    TE(Transition Engine): 就是来执行PE做出的策略的并且只有DC上才运行PE和TE。

    6.stonithd组件

    STONITH(Shoot The Other Node in the Head,”爆头“), 这种方式直接操作电源开关,当一个节点发生故障时,另 一个节点如果能侦测到,就会通过网络发出命令,控制故障节点的电源开关,通过暂时断电,而又上电的方式使故障节点被重启动, 这种方式需要硬件支持。

    STONITH应用案例(主从服务器),主服务器在某一端时间由于服务繁忙,没时间响应心跳信息,如果这个时候备用服务器一下子把服务资源抢过去,但是这个时候主服务器还没有宕掉,这样就会导致资源抢占,就这样用户在主从服务器上都能访问,如果仅仅是读操作还没事,要是有写的操作,那就会导致文件系统崩溃,这样一切都玩了,所以在资源抢占的时候,可以采用一定的隔离方法来实现,就是备用服务器抢占资源的时候,直接把主服务器给STONITH,就是我们常说的”爆头 ”。


二、高可用集群常见的软件组合

1)Messaging layer常见的软件有:

    1.Heartbeat (其中v2 版本包括Messaging layer层和pacemaker,V3将分为heartbeat+pacemaker+cluster-glue)

    2.keepalived

    3.ultramonkey

    4.Corosync(openAIS的子项目)

    Heartbeat 是比较常用的软件,Keepalived配置先对比较简单,而ultramonkey好像不怎么常用,Corosync比heartbeat功能还要强大,功能更加丰富。

2)集群资源管理器(Cluster Resource Manage)

    Heartbeat V1(legacy) 提供haresources

    Heartbeat V2 提供crm和haresources(这个是为了兼容v1版本)

    Heartbeat V3(Pacemaker)  + Cluster-glue

    Cman(Cluster manager)

    web界面:RHCS:luci/ricci,SUSE:hawk  


    Heartbeat V1 版也就是legacy版可以提供配置文件haresource.cf来管理服务的转移。

    Heartbeat V2 版名字就叫CRM,它提供了一个监听端口,可以用其它GUI工具来配置管理集群。

    Heartbeat V3 版后资源管理器独立出来,而不是作为Heartbeat的一部分了,它的名字叫Pacemaker功能异常强大,还提供了命令行工具来管理集群。

    Cman 是红帽开发的一个资源管理器,在红帽5.X版本上可能遇到,6.x版本后红帽也开始使用强大的pacemaker

    Luci/ricci红帽开发的web界面资源管理器,hawk SUSE他们开发的没接触过。

3)常见的集群软件组合:

    heartbeat v2+haresource(或crm) (一般常用于CentOS 5.X)


    heartbeat v3+pacemaker (一般常用于CentOS 6.X)


    corosync+pacemaker (现在最常用的组合)


    cman + rgmanager (红帽集群套件中的组件,还包括gfs2,clvm)


    keepalived+lvs (常用于lvs的高可用)

三、高可用资源


    什么是资源,源说白了就是一个完整服务需要用到的子项目 如:要运行web服务,IP地址,http的进程得需要吧,我们把这些子项目称之为集群资源。这些资源也是有类型的,可以分这么几类:


        primitive 也称之为local类型,同一时刻只能运行在一个节点

        group 组资源,组资源运行在一个节点上

        clone 需要在每个Node上运行的资源

        Master-Slave 只能运行在两个节点,一主一从

    资源之间是需要约束的,例如,web服务中httpd和共享存储(NFS等)。这两个资源之间是需要有顺序的,首先要将共享的存储挂载到本机,然后才能开启httpd服务,所以也就有了资源约束。

    位置约束(location) 它定义了某个资源流在哪个节点的倾向性,举个例子,三个节点RS1,RS2,RS3,假如RS1挂了,资源应该向哪个节点转移?也就是资源更倾向于谁

    顺序约束(collation) 它定义了资源的启动顺序。比如:共享存储要先于httpd启动吧。

    排列约束 (order)它定义了资源间的排列关系。比如:IP资源与httpd资源能不能运行在一起,还是必须在一起。

    注意:资源最终要向哪个结点进行转移是要看看位置约束的,其中转移左对齐是说都能够进行转移,只有一两个不能够进行转移,转移右对称是默认的都不能够进行转移,而只有一两个能够进行转移。红帽中有failover domain的故障转移域的说法,就是能够将一些资源转移到一个范围内的节点上。

    当一个结点联系不到另外一个结点的时候,那么资源转移到一个主机的时候如何保证原来的结点释放弃了这个结点,这个是保证不了的,只能够是对原来的结点进行隔离,隔离的种类有以下两种:

    资源隔离 :就是让被隔离资源不能能再使用这个资源。

    主机隔离 :就是直接让改主机关机。

    集群分裂之后,就是说有一组无法联系到另外一组的结点之后,如何办?那一部分结点继续运行,那一部分停止运行。

    有三种方法:

1)仲裁磁盘,如果有一方无法对仲裁磁盘进行读写,那么就将自动的退出集群。

2)WatchDog 用看门狗程序做仲裁,用来对同一个结点的同一个进程进行写数据,如果不能够,那么就重启服务。经过改造的watchdog是能够进行对多个结点的同一个进程进行读写的。

3)法定票数,这个是比较常用的。

    比如出现了这种状况总共五个节点,由于某种原因分为了两个组,一个组3个节点,另一个组两个节点,那到底哪个组中节点启动服务呢?这个时候就要引入quorum,即法定票数。在一个集群中会有一个角色叫DC(事务协调员),它负责统计各整个集群的事务信息,然后形成CIB(集群信息库),然后同步集群信息库到各个节点上。当节点出现分裂后,每个组会推选出DC,由它来统计各个组的法定票数quorum,大于原来总票数的二分之一的一组继续运行服务,小于二分之一的停止服务。每个节点可投的票数可以使不一致的,比如2个节点的一组的某个机器性能异常强大,我们就可以给这个节点多分配几票,而那3个节点都是1票,出现这种分裂,那2个节点运行服务,而那3个节点的组终止服务。集群能否继续存在的一个策略就是看quorum是否大于总票数的二分之一。

    注意:有时候,如果两方面的法定票数是一样的,那么就要有without_quorum_policy 这个属性可以有freeze(冻结),stop(停止),ignore(忽略)。

四、RA资源代理

    最后,如何能够在特定的结点上保证资源的接收、启动和关闭,这个就是资源代理RA的作用,说白到了,RA就是一些能够重启某些服务、关闭某些服务的脚本。这些的脚本主要有以下的几种类型:

    LSB(Linux standard base):这个就是我们常见的/etc/rc.d/init.d下的标准Linux脚本

    Heartbeat V1 :Heartbeat V1上提供的脚本

    OCF(Open Cluster Framwork):OCF脚本是比LSB更强大的一种脚本,支持更多的参数

    STONITH:直接终止主机的RA设备,比如电源交换机。

STONITH设备主要有以下几种设备:

    1)Power Distribution Units (PDU电源交换机)

    2)Uninterruptible Power supplies(UPS)不间断电源

    3)BladePower Control Devices(刀片机电源控制设备)

    4)Lights-out Device 轻量级管理模块

    5)Testing Devices 测试设备

    6)meatware 这个就是手动进行隔离

    STONITH实现主要是靠stonithd服务进行监控stonith资源,其中的stonith plug-ins插件是厂商提供的。对于stonith的管理策略是如果没有stonith就不能够直接开启高可用的服务。