高可用集群简介
高可用集群,即High Availability Cluster,其主要作用就是实现对服务器的故障检测和资源切换的自动化,尽量缩短由于服务器停止工作而造成的业务中断时间。服务器在运行过程中经常会由于计算机硬件或者软件的原因造成该服务器停止向外提供服务,在高可用集群软件的帮助下,备用节点可以自动检测到主节点的故障并将主节点上的资源转移过来,并立即向外提供服务,实现业务的自动切换。
HA的框架
最下层是基础事务层(Messaging Layer),主要用于传递集群事务信息、各节点的心跳信息,也包括了CRM层所有需要传递的信息,该类服务启动之后都监听在某一广播地址或组播地址上。在该层上解决的方案有heartbeat,corosync,cman(openais),这些服务需要运行在每一个节点上。
Membership,主要用于管理这个集群的拓扑结构,并且将这个拓扑结构共享给上层的CRM做出相应的决策。这个层更多地用于管理当前集群的成员及成员的角色,包括决定哪一个节点为DC(Designated Coordinator协调员,一个集群中仅有一个DC)
Resource Allocation,主要实现对资源的管理,包括定义资源,资源分组,资源约束。监控资源在某一个节点上的运行状况。其中policy engine用于做出集群事务策略,这个模块仅运行在DC上,Transition Engine模块用于执行policy engine做出的决策。该层的资源管理器(CRM)对资源的具体操作通过LRM(Local Resource Manager)实现,而LRM主要是通过执行/etc/init.d目录下的脚本完成响应的工作。这层的实现方案有haresources(heartbeat v1),crm(heartbeat v2),pacemaker (heartbeat v3),rgmanager 。
配置高可用集群的注意事项:
1、集群中的各节点时间必须保持同步。
2、节点与节点之间使用名称相互通信(配置/etc/hosts实现)
3、ssh密钥认证实现无障碍通信
4、提供仲裁设备(ping node)
基于heartbeat v1+haresources实现LVS高可用集群
实验中LVS的模型为NAT模型,通过heartbeat v1+haresource对Director实现高可用。使用ldirectord对后方的Real Server进行健康状况的监控。
实验环境:
时间服务器:192.168.1.118
2台Director(node1,node2):VIP:192.168.1.200,DIP:192.168.2.200
Real Server1:192.168.2.12
Real Server2:192.168.2.6
配置LVS环境
在各Real Server上配置网关
[root@node1 ~]# ip route add default via 192.168.2.200
在Director上开启转发功能(主备节点)
[root@vm1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
时间同步
时间服务器上:
[root@vm1 ~]# vim /etc/ntp.conf restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap #仅允许本网段的进行时间同步 ...... server cn.pool.ntp.org #指定更高级别的时间服务器 server 0.cn.pool.ntp.org server 127.127.1.0 #若访问不了前面几个服务,则使用本地的系统时间作为标 fudge 127.127.1.0 stratum 10 #准时间提供给客户端
[root@vm1 ~]# ntpstat synchronised to NTP server (202.118.1.81) at stratum 3 time correct to within 84 ms polling server every 512 s
集群中的各节点:
[root@node1 ~]# vim /etc/ntp.conf ...... server 192.168.2.8 [root@node1 ha.d]# ntpstat synchronised to NTP server (192.168.2.8) at stratum 4 #时间已同步
配置/etc/hosts,使双方能基于主机名相互通信
[root@node2 ~]# vim /etc/hosts 192.168.1.116 node1 192.168.1.117 node2
ssh密钥认证,双方无障碍通信
[root@node1 ~]# ssh-keygen -t rsa -P '' [root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 [root@node2 ~]# ssh-keygen -t rsa -P '' [root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
配置完无障碍通信之后,测试下两边时间是否同步
[root@node1 ha.d]# ssh node2 'date'; date Wed Aug 5 23:49:43 CST 2015 Wed Aug 5 23:49:43 CST 2015
安装对应的包,编辑配置文件
在集群的每个节点中安装这些软件包。
[root@node1 heartbeat]# yum install perl-TimeDate PyXML libnet net-snmp-libs heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm [root@node2 heartbeat]# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
heartbeat-ldirectord程序包主要是提供ldirectord程序。ldirectord程序在启动时自动建立IPVS表,然后监视集群节点的健康情况,在发现失效节点时将其自动从IPVS表中移除。
主配置文件:/etc/ha.d/ha.cf
认证密钥:/etc/ha.d/authkeys
用于定义资源的文件:/etc/ha.d/haresources
ldirectord的配置文件:/etc/ha.d/ldirectord.cf
默认情况下/etc/ha.d目录中没有上述的这几个文件,需要复制样例文件到此目录下,然后修改/etc/ha.d/authkeys文件的权限为400或600,若权限大于这个值,heartbeat 将无发启动。
[root@node1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} ./ -p [root@node1 ha.d]# chmod 600 authkeys [root@node1 ha.d]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d
编辑主配置文件/etc/ha.d/ha.cf(其他都使用默认配置)
logfile /var/log/ha-log #日志文件 keepalive 2 #每2秒传递一次心跳信息 udpport 694 #各节点之间通信用的端口 mcast eth0 230.0.120.1 694 1 0 #多播地址 auto_failback on #自动切回 node node1 #各节点定义 node node2 ping 192.168.1.1 #选择ping节点,仲裁设备 compression bz2 #对传递的信息进行压缩 compression_threshold 2 #超过2K的信息才进行压缩
编辑authkeys,各节点传递信息时需要做认证会用到该文件
[root@node2 heartbeat]# openssl rand -hex 8 #生成随机码 4ece364b077efd89 [root@node1 ha.d]# vim authkeys #auth 1 #1 crc #2 sha1 HI! #3 md5 Hello! auth 1 #选择哪一种加密方式 1 sha1 4ece364b077efd89 #加密算法序号 加密算法 随机码
配置ldirectord(/etc/ha.d/ldirectord.cf),#http virtual service下面的参数即定义了一个集群服务,包括VIP,RIP,LVS模型及调度算法。在定义资源时只需要定义ldirectord服务(不需要ipvsadm)即可,在ldirectord在启动时会调用ipvsadm完成集群服务的添加。
# Global Directives #全局配置,对所有的virtual都有效 checktimeout=3 #探测real server的超时时长 checkinterval=1 #每一次探测的时间间隔 #fallback=127.0.0.1:80 autoreload=yes #更改了配置文件会自动载入 #logfile="/var/log/ldirectord.log" #自己维护一个日志文件 #logfile="local0" #使用syslog记录日志 #emailalert="[email protected]" #emailalertfreq=3600 #发送邮件的时间间隔 #emailalertstatus=all quiescent=yes #是否工作在静默模式下。 #http virtual service virtual=192.168.1.200:80 #vip real=192.168.2.12:80 masq #各real server,gate表示DR模型,masq为NAT模型 real=192.168.2.6:80 masq fallback=127.0.0.1:80 masq service=http #检查Real Server健康状况时使用的协议 request="test.html" #检查时,请求的页面 receive="ok" #期望页面中包含的数据 scheduler=rr #调度器 #persistent=600 #是否使用持久连接,600是持久时长 #netmask=255.255.255.255 protocol=tcp #基于TCP协议探测 checktype=negotiate #探测方式 checkport=80 #探测的端口
配置完成后,不要忘了在各个Real Server上httpd的DocumentRoot目录中添加测试页面,测试页面中包含request指定的信息。若配置了fallback,需要在每个节点上启动httpd服务,并添加index.html页面,当所有后方的Real Server都停止服务时,这个页面能给予用户提示信息。
各个Real Server [root@node1 ~]# vim /httpd_dir/test.html ok 各集群节点上 [root@node1 ha.d]# vim /var/www/html/index.html <h1>Sorry</h1>
在/etc/ha.d/haresources文件中定义资源
格式:
主节点 IP/mask/iface resource #主节点后面的都为资源,资源与资源之间用空格或tab隔开。
[root@node2 ~]# vim /etc/ha.d/haresources node1 192.168.1.200/24/eth0 192.168.2.200/24/eth1 ldirectord::/etc/ha.d/ldirectord.cf
ldirectord在启动时需要指定配置文件。每一行定义一组资源,当主节点出现故障时,这一组资源会统统转移至备节点上。上述192.168.1.200为VIP,192.168.2.200为DIP。
复制4个配置文件至其他节点(-p保留权限)
[root@node1 ha.d]# scp -p haresources ha.cf authkeys ldirectord.cf root@node2:/etc/ha.d/
关闭各节点上ldirectord服务并确保开机不自动启动。
[root@node1 ha.d]# chkconfig ldirectord off ; ssh node2 'chkconfig ldirectord off'
启动服务进行测试
[root@node1 ha.d]# service heartbeat start ; ssh node2 'service heartbeat start'
主节点上:
对应的VIP,DIP和集群服务已经启用!!!
让主节点停止提供服务(模仿服务器故障)
[root@node1 ha.d]# /usr/lib64/heartbeat/hb_standby 2015/08/06_01:17:42 Going standby [all].
对应的资源已转移至node2上。
停止后方的一台Real Server(RealS1)上的httpd服务
[root@node1 ~]# service httpd stop Stopping httpd: [ OK ]
前端的Director上已将该Real Server标注为不可用(Weight=0),且仅能访问到Real Server2的页面。将Real Server2上的httpd服务也停止,这时候就只有fallback页面的信息了。
测试完成.................^_^