HA集群的架构
图3.1 HA集群架构
1) 共享信息层
在基础架构上实现心跳信息探测。双方节点可以随时探测到对方的心跳信息,以实现对对方主机工作状态的探测。三类控制信息:心跳(Heartbeats),集群事务信息(Cluster Transition Messages),重传信息(Retransmission Request)。 配置文件:/etc/ha.d/ha.cf。各节点间域共享密钥,实现节点间互相通信的认证。加密方式:MD5,HMAC-SHA1 。常用实现软件:HeartBeat、keepalived、ultramonkey、openais/corosync。红帽官方提供的集群套件RHCS底层使用的通信机制就是openais/corosync。
2) 资源分配子层
在资源分配上定义资源种类,界定资源归属,每个服务需要哪些资源及这些资源之间的前后次序。
集群资源管理器(CRM,常用软件pacemaker),管理双方向外提供服务所需用到的资源,包括IP地址、Web服务、共享存储等等。而这些资源需要依靠集群信息库CIB(XML文件)来定义,同时还必须保证一旦某个节点上的XML文件更新,即刻通知其他节点上的XML也要及时更新。
策略引擎(PE Policy Engine):定义法定人数以及根据法定人数所做出的动作等等。
本地资源管理器(LRM Local Resource Manager):监控本地某个资源的工作状况。
3) 资源层
本地资源代理(Resource Agent),脚本文件,一旦集群资源管理器发现某个资源工作异常,立即通知本地资源代理重启服务。常用方法:
(1)Heartbeat v1;
(2)使用脚本LSB scripts (Linux Standards Base );
(3)OCF Open Cluster Format 开放集群格式(最佳方式)。
3.1.2 高可用集群常用架构模型
(1)一主一从架构;
(2)互为主从架构:两台主机分别提供两种不同的服务;
(3)多主机架构:N台主机组成一个集群,分别提供不同的服务,一台服务器空闲做备节点。或者全部处于工作状态,一台服务器出故障,立刻将服务转移到其他主机上。各节点之间需要以多播的形式将自己的健康情况发送给其他主机。
故障转移域,如果一台主机发生故障,会将主机上的服务转移到域内的另一台主机上。
法定人数(Quorum) 集群超过这个值会正常工作,低于这个值会停止工作,同时也避免出现资源争用的情况。
脑裂和仲裁:在某种情况下,由于底层通知错误,或者传递信息的介质出现故障,会出现资源争用的情况,称之为脑裂。此时,每个部分都想取得对集群资源的控制权,以保证集群的高可用,这将破坏集群资源的完整性和一致性,导致整个集群瘫痪,硬件被破坏等严重后果。为防止脑裂的放生,将由仲裁协议即法定代表人数来决定哪个部分取得对集群资源的控制权。
STONITH (Shoot The Other Node In The Head ):避免出现资源争用的情况,为了防止错误操作的节点对集群资源进行破坏性控制和操作,使其不断重新启动或关机,从而使其无法取得对集群资源的控制权。
3.1.3高可用(HA)集群的设计及实现
3.1 主从架构
环境搭建:
Primary eth0 192.168.0.39
eth1 192.168.10.10 //心跳测试
提供Web服务,测试页内容为 Web1
Standby eth0 192.168.0.27
eth1 192.168.10.11 //心跳测试
提供Web服务,测试页内容为 Web2
向外提供Web服务IP:192.168.0.100
Primary:
3.2 所需软件包
Heartbeat所需软件包如图3.2所示,直接使用yum本地安装。
[root@station39 Heartbeat2]# yum localinstall \
heartbeat-2.1.4-9.el5.i386.rpm \
heartbeat-pils-2.1.4-10.el5.i386.rpm \
heartbeat-stonith-2.1.4-10.el5.i386.rpm \
libnet-1.1.4-3.el5.i386.rpm \
perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
Heartbeat依靠服务器的主机名来识别服务器,因此使用hostname命令得到的结果必须与uname -n 结果保持一致。
[root@station39 Heartbeat2]# vim /etc/sysconfig/network //修改主机名称
HOSTNAME=primary.a.com
[root@station39 Heartbeat2]# hostname primary.a.com
[root@station39 ~]# vim /etc/hosts //修改主机地址映射
192.168.0.39 primary.a.com primary
192.168.0.27 standby.a.com standby
[root@station39 Heartbeat2]# hwclock -s // 同步一下服务器时间
[root@station39 Heartbeat2]# cd /etc/ha.d/
[root@station39 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./
[root@station39 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./
[root@station39 ha.d ]# cp /usr/share/doc/heartbeat-2.1.4/haresources ./
[root@station39 ha.d]# vim ha.cf //定义各节点之间Heartbeat进程如何通信
keepalive 2 //设定heartbeat之间的时间间隔为2秒
deadtime 30 //在30秒后宣布节点死亡
warntime 10 //在日志中发出“late heartbeat“警告之前等待的时间,单位为秒
udpport 694 // 使用端口694进行bcast和ucast通信,默认参数
bcast eth1 //在eth1接口上使用广播heartbeat
node primary.a.com //定义节点
node standby.a.com //定义节点
respawn hacluster /usr/lib/heartbeat/ipfail //使Heartbeat以hacluster的份来执行ipfail进程并监视该进程的执行情况
其他相关参数解释:
serial /dev/ttyS0 //使用串口来交换心跳信息,如果不使用串口则必须使用其他介质,如以太网等。
watchdog /dev/watchdog //可选,通过Watchdog 功能可以获得提供最少功能的系统,该系统不提供heartbeat,可以在持续一份钟的不正常状态后重新启动。该功能有助于避免一台机器在被认定已经死亡 之后恢复heartbeat的情况。如果这种情况发生并且磁盘挂载因故障而迁移,便有可能有两个节点同时挂载一块磁盘。如果要使用这项功能,则除了这行之外,也需要加载softdog内核模块,并创建相应的设备文件。
initdead 120 //在某些配置下,重启后网络需要一些时间才能正常工作。这个单独的deadtime选项可以处理这种情况。取值通常为deadtime的两倍。
baud 19200 //波特率,串口通信的速度。
ping ping1.linux-ha.org ping2.linux-ha.org .... //可选,列出ping节点,这些节点不是集群节点,是用来为ipfail等模块检查网络连接情况的。
[root@station39 ~]# dd if=/dev/urandom bs=512 count=1 | openssl md5 //生成节点间域共享密钥
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000305868 seconds, 1.7 MB/s
d0f6e811a30607ec3783826d8d70ba25
[root@station39 ha.d]# vim authkeys //定义心跳探测包使用哪种加密方式
auth 1
1 sha1 d0f6e811a30607ec3783826d8d70ba25
[root@station39 ha.d]# chmod 600 authkeys //仅允许管理员修改文件
[root@station39 ha.d]# cp /etc/init.d/httpd /etc/ha.d/resource.d/
[root@station39 ha.d]# vim resource.d/haresources //定义资源
primary.a.com 192.168.0.100/24/eth0/192.168.0.255 httpd
Standby:
[root@station26 Heartbeat2]# yum localinstall \
heartbeat-2.1.4-9.el5.i386.rpm \
heartbeat-pils-2.1.4-10.el5.i386.rpm \
heartbeat-stonith-2.1.4-10.el5.i386.rpm \
libnet-1.1.4-3.el5.i386.rpm \
perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
[root@station26 Heartbeat2]# vim /etc/sysconfig/network //修改主机名称
HOSTNAME=standby.a.com
[root@station26 Heartbeat2]# hostname standby.a.com
[root@station26 Heartbeat2]# hwclock -s
[root@station26 ~]# vim /etc/hosts
192.168.0.39 primary.a.com primary
192.168.0.27 standby.a.com standby
[root@station26 ~]# cd /etc/ha.d/
Standby的配置文件必须与Primary保持一致,因此这里采用将Primary上的配置文件直接远程复制过来的方法:
[root@station26 ha.d]# scp 192.168.0.39:/etc/ha.d/ha.cf ./
[root@station26 ha.d]# scp 192.168.0.39:/etc/ha.d/authkeys ./
[root@station26 ha.d]# scp 192.168.0.39:/etc/ha.d/haresources ./
[root@station26 ha.d]# cp /etc/init.d/httpd /etc/ha.d/resource.d/
[root@station26 ha.d]# chmod 600 authkeys
配置完成。此时,使用浏览器访问http://192.168.0.100 ,可以看到图3.3 web1的界面,说明此时是Primary主机在工作。
图 3.3
我们使用Heartbeat本身自带的测试命令使Primary宕机,稍等片刻之后,我们再访问http://192.168.10.100 就会发现出现如图3.4 Web2的测试页面,说明Standby已经在工作了。
[root@station39 ha.d]# cd /usr/lib/heartbeat/
[root@station39 heartbeat]# ./hb_standby
图 3.4
我们这里是为了方便测试故意将两台服务器上的Web服务的页面显示出不同的内容,真实的环境中两台服务器的提供Web服务应该是一模一样的,因此当服务器发生宕机的情况下用户能够正常地访问网站,丝毫感觉不到服务宕机的情况。
OK!这只是实现了最基础的架构,需要我们在后续的工作中逐步扩展……