有两个节点运行webserver集群,RS1平时响应客户请求,RS2做备用在RS1节点故障的时候来取代它来响应用户请求,但是RS2怎么知道RS1出现故障了呢?
方法:
1> 每隔几秒钟RS2去检测RS2的状态,如果检测不到RS2就取代它;
2>两台主机用心跳线连接起来,大家相互传递心跳信息(通过UDP),如果在某一个时候感受不到RS1的心跳信息了,RS2就去取代它响应客户请求。
假如每3秒进行探测一下,那么当刚检测完,服务挂了,那么有3秒的空闲,所以在高可用的时候更多使用的是第二种方法,所有集群用心跳线连接,平时在心跳线传递心跳状态信息,当某台主机出现状况,其他节点随时可知道它的状况,在逻辑上这个称为信息层(Messaging Layer);
逻辑上它是信息层,但是我们需要用软件来实现这个功能,而且这个软件运行在每一个节点上,平时他们通过心跳线传递着健康状态信息,常见的软件有:
1>HeartBeat
2>Keepalived
3>ultramonkey
4>Corosync(OpenAIS的子项目)
HeartBeat是比较常用的软件,Keepalived配置相对来说比较简单,ultramonkey使用的比较少,而Corosync的功能要比Heartbeat要强大;
但是知道信息层仅传递状态信息,对于服务或主机出现问题他不负责解决,但是他为其他程序提供了API,可供其他程序调用,来实现服务的转移,这个软件在逻辑层上称之为集群资源管理器(Cluster Resource Manager);
在每一个节点上CRM都维护有一个CIB(集群信息库 XML文档)和LRM(本地资源管理器)组件。
对于CIB,只有工作在DC(主节点)上的文档是可以修改的,其他CIB都是复制DC上的那个文档而来的。
对于LRM,是执行CRM传递过来的在本地执行某个资源的执行和停止的具体执行人。当某个节点发生故障之后,是由DC通过PE(策略引擎)和TE(实施引擎)来决定是否抢夺资源。
PE(Policy Engine):策略引擎,来定义资源转移的一整套转移方式,但只是做策略者,并不亲自来参加资源转移的过程,而是让TE来执行自己的策略。
TE(Transition Engine): 就是来执行PE做出的策略的并且只有DC上才运行PE和TE。
实现功能的软件有:
1>Cman(RedHat开发的,主要可能会在5系列上看到)
2>pacemaker(这个是非常常见的一个)
集群资源管理器来决定集群资源的启动与停止,又因为资源之间是有相互关系的,比如集群资源有:IP,Httpd,共享存储,首先应该有共享存储,然后启动Httpd服务,这样那个才是一个正常的启动状态,所以对资源定义了约束,常见的约束有:
资源约束: Constraint
排列约束:location
定义资源是否能够运行在同一个节点
正值:可以在一起
负值:不能在一起
位置约束:coloation
正值:倾向于此节点
负值:倾向于逃离此节点
可以用资源粘性来看待;
顺序约束:order
定义资源启动或关闭时的次序
资源粘性:资源对某点的依赖程序,通过score定义
资源更倾向于运行于哪个节点(体现在两个调度器上,调度器A是主调度器,由于故障那么将要转到B调度器上,由于整体成本的考虑,B的性能要不如A,那么,当A一旦好了,就要重新转移到A调度器上)
我们知道CRM是来决定各个资源的启动与终止的,有这种情况,RS1和RS2平时用共享存储,平时RS1挂在着共享存储,来响应客户的请求,假如RS1出现了故障,RS1不能检测它的状态信息了,这个时候假如RS1仍可以继续工作只是联系不上RS2了,这个时候RS2上,那么会出现资源争夺,所以需要资源隔离:
资源隔离:
节点级别:STONITHM
资源级别:
例如:FC SAN switch可以实现在存储资源级别拒绝某节点访问
比如出现了这种状况总共5个节点,由于某种原因分为了两个组,一个组3个节点,另一个组2个节点,那到底哪个组启动服务呢,这个时候引入quorum,即法定票数.在一个集群中会有一个角色叫DC(推举的事物协调员),他负责统计整个集群的事物信息,然后形成CIB(集群信息库),然后同步到各个节点上,当节点出现分裂后,每个组将会推选DC,由他来统计各个组的法定票数quorum,大于原来总票数的1/2的一组将提供服务,小于的将停止.另外每个节点可投的票数可能不一样,例如2个节点的某一个机器性能强悍,就可以多提供几票,使其结果大于3个节点的。
接着,集群资源管理器来决定是否集群继续或停止,如果满足策略,将会继续运行,这个时候怎样来启动呢,CRM将会调用RA(Resource Agent)资源代理来实现资源的启动或停止;例如常见的RA:
RA:
1>LSB(Linux Standard Base):这个就是/etc/init.d/*
2>OCF(Open cluster framework):OCF脚本是一种比LSB更加强大的脚本;
3>STONITH:直接终止主机的RA设备,比如电源交换机。
在做MySQL双主的时候,MySQL共享一台存储设备,这个时候肯定会好奇,不是会产生资源紊乱么,这个其实可以到文件系统那层来解决,由于常用的文件系统不支持多个服务共享一个存储设备,那么如果能对其加锁,当一个MySQL写的时候,另外一个不能进行写,那么就可以,这样的文件系统称之为cluster filesystem;
常见的cluster filesystem有:
1>GFS
2>OCFS2
但是,这样的集群文件系统只是用在DAS和SAN上,不能用于NAS设备上;
更多可直接参考这个:
http://freeloda.blog.51cto.com/2033581/1265304
##################建议一定要看#####################
Linux高可用集群之Heartbeat详解