HA(High Avaliablity,高可用)集群的出现是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性所带来的损失。如果某个节点失效,它的备援节点将在几秒钟的时间内接管它的职责。


一、高可用原理简述

    我们在要做高可用的节点上安装好实现高可用功能的程序,这些程序最核心的包括两个部分:心跳监测部分和资源管理部分;通过资源管理器的配置接口定义资源,并将配置文件同步到其它节点,节点之间在心跳监测层通过相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时会启动资源管理模块来接管运行在对方主机上的资源或者服务


二、HA的框架和要点

postgresql 高可用集群方案 高可用集群的工作原理_高可用

Messaging与Membership层:Messaging层主要用于节点之间传递心跳和集群事务信息,可以使用广播、组播、单播、串行链路等方式,集群节点之间的心跳信息也要做认证。成员关系(Membership)层最重要的作用是主节点通过Cluster Consensus Menbership Service(CCM或者CCS)这种服务由Messaging层提供的信息,来产生一个完整的成员关系。

      解决方案:heartbeat, corosync, cman(openais)

      注:有时候,接收不到节点的心跳信息可能并非是节点出现故障,也有可能是节点很繁忙,因此建议节点上至少配两张网卡,一张网卡专门用来传递心跳信息,另外一张网卡即用于对外提供服务,也可作为传递心跳信息的备用网卡

     

CRM:cluster resource manager,集群资源管理器,工作在Messaging Layer之上。资源管理器的主要工作是根据messaging Layer传递的健康信息来决定服务的启动、停止和资源的定义、转移、分配。每一个节点上都包含一个CRM,在CRM中还包含LRM和DC等组件

      解决方案:   

        haresources(heartbeat v1):

          配置接口:配置文件,文件名也叫haresources,在一个节点完成配置后,再手动将配置文件同步到其它节点;

        crm(heartbeat v2):

          运行为守护进程mdmtd,监听在5560/tcp;配置文件cib(cluster information base),为xml格式;配置接口:命令行客户端crmsh,GUI客户端hb_gui,在一个节点完成配置后,配置文件会自动同步到其它节点;

        pacemaker(heartbeat v3):

          运行为守护进程;配置文件cib.xml;配置接口:CLI(crm,pcs), GUI(hawk,LCMC,pacemaker-mgmt);

        rgmanager:运行为守护进程,配置文件为/etc/cluster/cluster.xml,配置接口:clustat, cman_tool, Conga(Web GUI):控制端luci+被控制端ricci(运行于各节点)


  3、LRM:local resource manager,它是CRM的一个子组件,用来获取某个资源的状态,并且管理本地资源


  4、RA:resource agent,是实际负责操纵(启动、停止、监控等)资源的,LRM用来管理本地资源的,但是不能操纵资源,当需要操纵资源时会调用RA来执行,RA通常是脚本文件,在一个节点上可能有多个RA。

RA的类型

        heartbeat legacy:heartbeat的传统类型,通常是/etc/ha.d/haresources.d/目录下的脚本

        LSB:/etc/init.d/*

        OCF(open cluster framework):比LSB更强大的一种脚本,支持更多的参数

        STONITH:一种特殊的RA,主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性和完整性


分裂状况(分组)。并且都运行着相关服务,因此就会发生资源争夺的状况。因此,事务协调员在这种情况下应运而生。事务协调员会根据每个组的法定票数来决定哪些节点启动服务,哪些节点停止服务。例如高可用集群有3个节点,其中2个节点可以正常传递心跳信息,与另一个节点不能相互传递心跳信息,因此,这样3个节点就被分成了2组,其中每一个组都会推选一个DC,用来收集每个组中集群的事务信息,并形成CIB,且同步到每一个集群节点上。同时DC还会统计每个组的法定票数(quorum),当该组的法定票数大于总票数二分之一时,则表示启动该组节点上的服务,否则放弃该节点上的服务。对于某些性能比较强的节点来说,它可以投多张票,因此每个节点的法定票数并不是只有一票,需要根据服务器的性能来确定,DC位于主节点上。     

      PE和TE也是DC的子组件,其中:

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

        TE(Transition Engine):执行PE做出的策略。


  6、仲裁设备:偶数个集群节点分裂时可能出现两组票数相同的情况,这时候就需要借助仲裁设备(ping node, ping group或quorum disk)来决定服务该在哪个节点上启动。


  7、集群分裂场景中,without quorum之时,如何采取对资源管控的策略:






资源:启动一个服务需要的子项目。例如启动一个web服务,需要ip、服务程序、文件系统(用来存储数据),这些都可以统称为资源。


  9、资源隔离机制:

      节点级别:STONITH,这种方式直接操作电源开关,当一个节点发生故障时,另一个节点如果能侦测到,就会通过网络发出命令,控制故障节点的电源开关,通过暂时断电,而又上电的方式使故障节点被重启动或者直接断电, 这种方式需要硬件支持

        电源交换机

        服务硬件管理模块

      资源级别:例如:使用FC SAN switch可以实现在存储资源级别拒绝某节点的访问

      应用场景:集群分裂

postgresql 高可用集群方案 高可用集群的工作原理_数据库_02


资源类型

       primitive, native:主资源,其仅能运行于某一节点

       group:组资源,可用于实现限制多个资源运行于同一节点及对此些资源统一进行管理

       clone:克隆资源,一个资源可以运行于多个节点;

          应该指定:最大克隆的份数,每个节点最多可以运行的克隆;

       master/slave主从资源,特殊的克隆资源;


  11、资源运行的倾向性(资源转移倾向性):

       rgmanager:

         failover domain, node priority

       pacemaker:

         资源黏性:资源倾向于留在当前节点的分数;通常使用score来定义,当score为正数表示乐意留在当前节点,负数表示不乐意留在当前节点

资源约束

            位置约束:资源对某节点运行的倾向性

               inf:正无穷, -inf:负无穷

               n, -n

            排列约束:定义资源彼此间的倾向性

               inf, -inf

               n, -n

            顺序约束:属于同一服务的多个资源运行在同一节点时,其启动及关闭的次序约束;

               启动:A→B→C

               关闭:C→B→A

               例如:定义高可用的mysql服务,需要三个资源vip、mysqld、nfs,合理的启动次序应该是vip→nfs→mysqld

        要定义资源同进同退,有两种方式:排列约束和组资源,常用后者。


  12、HA集群的工作模型:

       A/P:两节点,active/passive,主备模型;

       A/A:两节点,active/active,双主模型,两个节点各自运行一个集群服务,彼此把对方当作备用节点

       N-M:N>M, N个节点,M个服务;活动节点数为N,备用节点数为N-M

       N-N


  13、根据messagin层程序和CRM层程序的不同组合,CentOS或RHEL系统高可用集群的解决方案有:

       CentOS 5:

         RHCS:cman+rgmanager

         选用第三方方案:corosync+pacemaker, heartbeat(v1或v2), keepalived

       CentOS 6:

         RHCS:cman+rgmanager

         corosync + rgmanager

         cman + pacemaker

         heartbeat v1(自带haresources), v2(自带crm), v3(自带pacemaker)

         keepalived