天天看点

高可用集群1 HA基础概念一、高可用出现的原因二、高可用的引出三、高可用集群的层次四、资源管理的相关概念

一、高可用出现的原因

整个IT业务系统在运行过程中,软硬件都有可能发生故障;按照墨菲定律,当一件事有发生的可能性时,则这件事必然会发生。软硬件发生的故障主要有以下几类:

1.硬件故障:

1、产品设计缺陷

2、使用时间累计造成的自然损耗

3、人为故障,例如支付宝光纤被挖断事件

2.软件故障:

1、软件设计缺陷

2、软件中存在bug

3、人为误操作,典型代表为2015年5月携程大规模宕机事件

3.系统可用性

衡量一个系统的可用性可以用如下公式来表示:

A=MTBF/(MTBF+MTTR),

A为Availability可用性

MTBF为Mean Time Between Failure平均可用时间

MTTR为Mean Time To Repair平均修复时间

A的取值范围是0<A<1,提高可用性就是要增加MTBF和减小MTTR。除了使用各种自动化运维监控工具提高排障效率,普遍方法是提供冗余备份。以下讲的主要是主机层面的冗余,对于网线、交换机、甚至电源的冗余,这由专门的网络工程师和机房运维负责,这里不做讨论。

二、高可用的引出

1.高可用术语

在提供了冗余主机的业务系统中,备用主机每隔很短的时间,周期性不断探测活动主机当前状态的机制称为心跳机制,即heartbeat,负责传递心跳信息的线缆称为心跳线。当备用主机检测不到活动主机的状态,自己就取而代之,取代之前的活动主机并对外提供服务。但是活动主机有可能因为网络拥堵或者CPU繁忙导致备用主机收不到心跳信息,活动主机其实并没有宕机,所以备用主机不可能第一次检测不到心跳信息就取代活动主机,一般需要多次探测。这种为提升可用性,使用多台计算机构建的集群称为高可用集群High Availability Cluster,集群内每一个单独主机称为集群的节点Node。

对于HA集群提供的服务,都是由不同的资源组成。例如一个NFS的HA集群,对外需要提供一个ip地址和文件系统;LVS集群需要提供ip地址和ipvs规则,像ip地址、文件系统、ipvs规则等每个都是构成整个集群服务的组成部分,这称为集群的资源resource。HA集群提供了硬件冗余,但真正的高可用性在于当活动节点发生故障时,能够将服务的资源转移到备用节点,从而保证服务的高可用性。这个资源转移的过程称为故障转移failover。

在一个HA集群中,会出现以下情况,节点状态正常,心跳也正常,但提供的服务不一定可用,当资源服务不可用,如何解决服务高可用呢?可以首先尝试在故障节点重启服务,如果重启后不可用再转移资源。当故障主机修复好恢复之后,如果主备节点性能相当,则不用再度将资源转移回原主节点;如果一定要转移回原主节点,这个过程叫做failback。一般不建议这么做,因为在转移的过程中,服务是不可用的。高可用集群要做到能够监控资源的状态,以及资源出现故障时能够决策如何转移资源。

2.心跳传递机制

心跳信息并不是节点去探测对方获取,而是节点主动向对方发送心跳信息。传递心跳的介质有2种:串行线缆和以太网线;串行线路作用范围有限,不建议使用。

2节点集群:使用UDP协议单播传输(unicast),心跳传输报文都很小,使用TCP协议会降低传输效率

多节点集群:使用UDP协议组播传输(multicast)

3.组播地址

标识一个IP组播域,保证单个主机向这个组播域内发送的信息都能让域内的其他主机接受,实现一对多传输,地址范围:224.0.0.0-239.255.255.255,有以下几类:

永久组播地址:224.0.0.0-224.0.0.255,在互联网固定使用

临时组播地址:224.0.1.0-238.255.255.255,个人测试使用

本地组播地址:239.0.0.0-239.255.255.255,仅在特定本地范围内有效(不做深究)

配置HA集群,通常使用临时组播地址,网卡必须启用组播功能,否则就算配置了组播地址也不能传递接收信息

4.脑裂问题

运行的HA集群,由于某些网络故障或其他原因,导致主备节点之间收不到心跳信息,例如心跳线发生故障,备用节点收不到主节点的心跳,会认为主节点发生故障,并试图将资源转移到自己身上,而主节点认为自己没有故障,并不打算将资源转手他人,此时双方会发生资源争用。这种情况的出现表明集群出现了分区partition,或者出现分裂,一般称为脑裂split brain。例如在一个含有共享存储的集群,如果出现脑裂,主备节点争抢存储资源,同时对同一文件进行读写操作,会发生文件系统损坏,所以一定要避免脑裂。对于集群分裂,普遍使用投票系统vote system作为解决方案。

5.投票系统

HA各节点无法探测彼此的心跳信息,必然无法协调工作,这时候集群各节点进行投票,采用少数服从多数的原则,超过一半的集群节点可以代表集群继续工作。例如一个5节点构成的集群分裂为A和B两个分区,A分区有3个节点,B分区有2个节点,每个节点1票。A分区有3票,超过了5的一半,所以称A分区具备了法定票数,即with quorum,这部分可以代表集群继续工作;而B分区的2个节点,由于不具备法定票数,即without quorum,所以就被集群剔除。为了方便投票决策,集群要奇数个节点。如果是偶数个节点,而且恰好分裂的两部分数量相同,则要引入仲裁机制,使用第三方力量,例如仲裁盘quorum disk,或者网关。双方都向仲裁盘写数据,或者向网关发起ping操作,能写入数据或ping通网关的就认为具备法定票数。对于2节点的集群,必须使用仲裁机制。

三、高可用集群的层次

高可用集群1 HA基础概念一、高可用出现的原因二、高可用的引出三、高可用集群的层次四、资源管理的相关概念

1.message (集群信息层)或infrustructure(集群架构层)

这是整个集群的最底层,在这一层中,所有节点上运行一个程序来传递信息,主机通过程序向其他节点发送心跳信息,使用多播方式传输,每个主机主动对外向特定的多播地址发送心跳。message layer不仅能传输心跳,还能传递集群事务信息,例如集群脑裂时,多数节点决定将少数节点剔除集群

2.cluster resource mananger(集群资源管理层CRM)

对于集群运行的服务程序,在开发过程中需要调用message层程序提供的API,服务通过message层传递心跳信息,还要通过这个message程序获取各节点的硬件性能,来决定在哪个节点运行,这样服务才能运行在高可用场景,才能在出现故障时做出资源转移的决策。

事实上,很多程序自身并不具备有高可用能力,例如使用httpd需要开发针对httpd的高可用功能,使用mysql需要开发针对mysql的高可用功能。为了减轻应用开发的负担,就有好事者在message层上开发出第二个层次,cluster resource manager。CRM可以根据管理员的配置去在对应节点上运行服务,还能监控资源状态,在故障时转移资源。CRM承上可以为不具备高可用的服务程序提供高可用,让其利用message层完成HA;启下可以利用底层message传递的心跳和集群事务信息,做出整个集群内部事务决策。对于可以直接调用message层的功能实现HA的资源,称为HA-aware资源;而必须借助CRM在集群上实现HA的资源,称为none HA-aware资源。

3.local resource manager(本地资源管理层LRM)

以web服务的高可用为例,需要的资源有ip地址、httpd服务甚至于页面文件。对于httpd服务可以使用符合LSB标准的脚本,使用start或stop等参数进行管理,但是对于ip地址等是没有这种方法进行管理,要么使用命令,要么使用配置文件。为了避免这种麻烦,在CRM之上,又提供一个层次,叫本地资源管理local resource manager,一般LRM都集成在CRM当中,LRM主要在本地节点上对资源进行决策管理。

4.resource agent(资源代理RA)

LRM只是起到决策功能,决定了一个资源在本地节点上究竟是启动还是关闭,还是转移,并不能直接对一个资源做出start或stop操作,需要借助于资源代理resource agent,由这个代理去进行操作。以RHEL6系统为例,在/etc/init.d/目录下众多服务的管理脚本,这些脚本就是一个个对应的资源代理,对于ip地址这种资源,只要安装了HA的软件,会自带管理ip地址的脚本。

四、资源管理的相关概念

1.资源的约束关系

1.1 location位置约束

定义资源对节点的倾向性,资源更倾向运行在哪个节点;用数值表示,范围是-∞到+∞,负无穷表示无论如何都不在这个节点运行,正无穷则是始终在这个节点。例如某一个节点的硬件性能很好,可以定义资源倾向在这个节点运行。

1.2 colocation排列约束

定义资源彼此间在一起的倾向性:数值表示,-∞到+∞,负无穷表示不在一起运行,有你没我,有我没他;正无穷表示二者始终在一起运行,相生相灭。例如一个web的高可用集群,ip地址和http服务必须启动在同一个节点,不能孤立存在于不同节点。在HA中有另一种方法,将多个资源绑定在一起,形成一个资源组,在这个资源组下的所有资源同进退,但是这个方法只能让多个资源在一起,不能让多个资源不在一起,所以不能在一起运行的多个资源还得由排列约束管理。

1.3 order顺序约束

定义资源在同一个节点上启动的先后顺序,例如一个NFS集群,必须首先挂载存储,然后才能启用ip地址。

2.资源类型

(1)Primitive:主资源,只能运行在集群内的单个节点,也叫做native资源

(2)Group:组资源,容器,包含一个或者多个资源,这个资源可以通过“组”这个资源进行统一调度

(3)Clone:克隆资源,可以在同一集群的多个节点运行,在这个类型下还有一种特殊类型

Master/slave:主从资源,在同一集群内的2个节点运行2份资源,一主一从

3.资源属性

(1)priority:优先级,一个集群要运行多个资源,但是集群整体的性能有限,可以配置优先级高的资源优先运行

(2)target-role:目标角色,资源配置到集群后是什么状态,有started、stopped、master等状态

(3)is-managed:是否允许集群管理此资源,布尔值

(4)resource-stickiness:资源粘性,指资源对当前所在节点的倾向性

(5)allow-migrate:是否允许迁移

4.资源隔离

集群主节点发生故障,将资源转移到其他节点,但故障节点只是突然出现假死,并没有彻底死绝,万一在某个时候又活了,会争抢集群资源;为了避免这个情况,需要给这个节点补一刀让其彻底死透,这个机制称为资源隔离。

隔离是有不同的级别,主要有2种:

(1)节点级别:将整个节点进行隔离,STONITH机制,shooting the other node in the head,即爆头。常用的解决方案是电源交换机,通过电源交换机把这个节点的电源关闭

(2)资源级别:隔离节点对资源的使用,fence机制;例如HA中使用的共享存储设备,默认情况只能由一个节点挂载,可以向连接存储设备的交换机发出命令,关闭故障节点与交换机连接的端口

继续阅读