1.1 概念

        高可用集群,英文原文为High Availability Cluster,简称HA Cluster,简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统 就是集群的节点(node)。

       高可用集群的出现是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性所带来的损 失。如果某个节点失效,它的备援节点将在几 秒钟的时间内接管它的职责。因此,对于用户而言,集群永远不会停机。高可用集群软件的主要作用就是实现故障检查和业务切换的自动化。

       只有两个节点的高可用集群又称为双机热备,即使用两台服务器互相备份。当一台服务器出现故障时,可由另一台服务器承担服务任务,从而在不需要人工干预的 情况下,自动保证系统能持续对外提供服务。双机热备只是高可用集群的一种,高可用集群系统更可以支持两个以上的节点,提供比双机热备更多、更高级的功能, 更能满足用户不断出现的需求变化。

  • 节点

     运行ha软件的主机成为节点。在ha集群节点中有主次之分,分别称为:主节点/备份节点,.每个节点上都有自己的一组资源。一般情况下主几点提供应用服务,备份节点提供监控模式。

  • HA资源(resource)

     资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其它节点接管(failover资源转移),heartbeat中,可以当做资源的实体有:磁盘分区、文件系统、IP地址、应用程序服务、NFS文件系统等。

  • 事件(event)

     也就是集群中可能发生的事情,例如节点系统故障、网络连通故障、网卡故障、应用程序故障等。这些事件都会导致节点的资源发生转移,HA的测试也是基于这些事件来进行的。

  • 动作(action)

    事件发生时HA的响应方式,动作是由shell脚步控制的,例如,当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动。进而接管故障节点的资源。

1.3 HA逻辑层

      通常一个集群由3个层次组成:messagelayer(通信层)、CRm集群资源管理层,Resource agent资源代理层。

ha


  •   通信层 :(Messaging Laye):

        用来专门传输2个集群节点的信息事物,为了加快传输的利用率,使用UDP的方式进行通信。通信层传输中的集群事物包括:心跳信息,资源粘性比较信息(资源更倾向于那个节点),资源的转移信息等。至于为什么会有资源粘性,主要是为了当服务器A,B 2个节点的时候,节点A和几点B的性能可能不同,通过资源粘性的方法来决定资源更倾向于在那个节点上运行。当资源通过资源粘性转移到某个节点时,我们把这种情况成为failback。在heartbeat中主要分2种通信结构: 1.HBcomm 通信层 (节点之间的进程通信)通过PILS动态连接库加载。比如支持多播,单播,串口等通信方式。所有节点间通信PLUGIN模块放在lib/plugins/hbcomm/路径下。2.Unix Domain Socket (节点内通信)。在通信层中只负责信息的传递,并不对信息进行比较。假如在资源粘性中A主机节点的粘性为100,B节点的资源粘性为200.在通信层中只负责粘性数据的传递,并不对资源粘性100和200进行比较。(显然正常情况下资源粘性数字大的节点应该接管资源)。

  • 集群资源管理层:(Cluster Resource Manger Layer):

       产生的集群事物进行收集,并且把收集的信息进行比较运算,然后决定资源运行在那个节点上。Crm需要在每个节点上面都运行,并且通过通信层通信。Crm通过dc来进行协调资源运行在那个节点上。Dc本身包括2个组件:集群策略引擎(Cluster policy engine),集群转移引擎(Cluster transition engine)。集群策略引擎负责对接受到的信息进行计算并且得出结果。集群转移引擎用通过策略引擎计算的结果指挥相关资源进行资源转移等操作。为了对每个节点的本地资源进行管理,crm通过lrm进行管理,lrm负责接受pe信息并且执行相关动作。

  • 集群代理层:(Resource agent Layer)

      在CRM中的lrm中,lcrm是通过调用相关脚本来进行对资源进行操作的。脚本是有固定格式的,必须遵守LSB规则。在linux中/etc/init.d中的文件一般是遵循LSB规则的。在LSB脚本中必须传递start,stop,restart,status参数。我们通过参数返回的结果来判断资源是否正常运行。HA集群中还可以通过OCF格式的脚本进行对资源进行操作。在HA集群中我们把资源管理的脚本称做集群资源代理。

     在HA集群中,每个层次是单独的。比如通信层的软件可以单独是一个软件,CRM层的软件可以是单独的软件。

1.3资源组RG(resource group )

心跳

                                          图1.3.-1

       在图1.3-1 lamp环境中我们把mysql,mount,httpd,ip设置为一个资源组。试想一下如果我们不设置资源组的时候,有可能出现资源转移时只转移某个单独的资源。例如主服务器的http服务down的时候,有可能备份服务器转移http服务资源,然而对于的挂载点,ip地址,数据库等资源并没有转移过来。造成lamp环境运行失败。如下图所示:

haover

  • 多资源组实例图

  • groupok

group

1.4 资源约束

        资源属性用来对资源进行约束,定义资源之间的倾向性。在图1.3-1中我们通过定义资源组的方式来保证lamp环境下的各个资源相互依赖。资源和节点之间的倾向性通过资源粘性来定义。资源与资源之间的关系通过资源约束来定义。通常有3种约束方法:排列约束、位置约束、顺序约束。位置约束:正值倾向于次,负数倾向于逃离次,例如在图1.3-1中档httpd服务down的时候,假如备份服务器的位置约束对于mysql,mount,ip等为正值的话则转移到备份服务器上。顺序约束:定义资源启动或关闭的顺序。例如在lamp中先启myql后启动httpd。先关闭httpd后关闭mysql。排列约束:用来定义资源是否可以运行在同一节点,正值可以在一起,负值不可以在一起。所有3重资源约束是通过正负整数值来决定的其中-inf表示 负无穷,inf表示正无穷。




1.5 脑裂与资源隔离:

         在“双机热备”高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了 联系,都以为是对方出了故障,2个节点上的HA软件像“裂脑人”一样,“本能”地争抢“共享资源”、争起“应用服务”,就会发生严重后果:或者共享资源被 瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

         实际上脑裂正常情况下是无法见到的,现代集群都应该有保护机制来避免这种情况发生。例如RHCS引入的fence的概念。 具体情况是这样,例如2个节点集群,当心跳断开导致节点之间互相无法通信的时候,每个节点会尝试fence掉对方(确保对方释放掉文件系统资源)后再继续运行服务访问资源。这样,就可以确保只有一个节点可以访问资源而不会导致数据损坏。所以这个也是RHCS为什么必须有fence设备的原因。到底要不要fence,官方讲法是,如果你跑生产,要保证数据不受损坏,就必须有fence设备。

1)添加冗余的心跳线,例如双线条线。尽量减少“裂脑”发生机会。

2)通过资源隔离的方式。资源隔离的方式分2中级别:节点级别:STONITN设备。资源级别:fc san swith交换机可以实现资源级别的资源隔离。