高可用性H.A.(HighAvailability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性,HA系统是目前企业防止核心计算机系统因故障停机的最有效手段。

HA的工作机制与框架

1,RA(ResouceAgent)

与CRM通信,启动各个资源,资源包括可启动的服务(如httpd,nginx)和不可启动的如(IP地址),可以在资源级别进行监控

RA常见的RA有LSB(linuxStandardBase)linux标准库,即/etc/rc.d/init.d/下的所有文件,OCF(OpenClusterFramework)开放集群框架,Stonith(断掉谁的电,节点级别),fence(资源级别的)

2,DC(DesignatedCoordinator)指派协调员。协调集群事务,是被推举出来的,收集心跳信息,决定那个资源运行在哪个节点上

3,MessagingLayer:消息传输层,集群的基础架构层

负责传递心跳信息,管理成员关系

常见的消息传输层有:HeartbeatV1,V2,V3,Corosync,Cman

4,CRM集群资源管理器,针对不同的MessagingLayer通常会有不同的CRM

接受上层委托与集群的基础架构层次通信,将不具备高可用的资源也可以高可用

Heatbeatv1---àharesouces

Heartbeatv2--àcrm(向下兼容haresouces)

Heartbeatv3--àpacemaker(可以用于其他的MessagingLayer)

cmanàrgmanger

CRM可以对资源粘性和资源约束进行定义。

资源粘性:当前节点宕机,离线,修复后重新上线,资源还要不要回到原来节点。

资源约束:

位置约束(position),资源更倾向于在哪些节点

排列约束(collocation),资源和资源见的关系,是不是一个资源必须和另外一个资源同时运行在同一个节点

顺序约束(order),资源启动顺序,资源关闭顺序

转移关系,RHCS中有故障转移域,而对于其他的CRM有左对称(白名单)或者右对称黑名单)

LRM(LocalResouceManager)本地资源管理器。DC通知LRM抢占或者放弃资源

下面,我们实现corosync+pacemaker+pcs还有Heartbeatv2+CRM+pcs实现高可用

node1.sysbo.net

172.16.11.12

节点1

node2,sysbo.net

172.16.11.8

节点2

node3.sysbo.net

172.16.11.9

节点3

ms.sysbo.net

172.16.11.10

管理节点(管理节点并无多大用处,只是使用ansible往各个节点发送信息)


Corosync+pacemaker+pcs(Centos6.4)

Prepare:

1,保证3个节点使用主机名可以互相通信,并且主机名一定要和使用uname–n的结果一致,在/etc/hosts中添加以下几行信息

172.16.11.8node2node2.sysbo.net

172.16.11.12node1node1.sysbo.net

172.16.11.9node3node3.sysbo.net

172.16.11.10msms.sysbo.net

[root@ms~]#ansibleall-a"uname-n"查看主机名,并且与/etc/hosts文件中保持一致,修改主机名在/etc/sysconfig/network中修改

2,设定管理节点和个节点可以使用互信的ssh进行通信



[root@ms ~]# ssh-keygen -t rsa [root@ms ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 [root@ms ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 [root@ms ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node3



首先安装Corosync



#ansible all -a "yum -y install corosync"



在节点上修改配置corosync的配置文件



[root@node1 corosync]# vim /etc/corosync/corosync.conf [root@ms ~]# ssh node1 [root@node1 corosync]# vim /etc/corosync/corosync.conf



添加下面两段代码



service { ver: 0 name: pacemaker //定义corosync的CRM为pacemaker } aisexec { uer:root group:root }



修改bindnetaddr后面的IP地址为节点所在的网络地址,并且定义组播地址



totem { version: 2 secauth: off threads: 0 interface { ringnumber: 0 bindnetaddr: 172.16.0.0 //节点所在的网络地址 mcastaddr: 226.94.1.1 //定义组播地址 mcastport: 5405 //组播地址端口 ttl: 1 }



节点间传递消息需要加密,我们使用corosync自带工具生成一堆密钥,发送公钥给其他节点

启动corosync



[root@ms ~]# ansible all -a 'service corosync start'



启动之后

保证corosync的引擎启动:



grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log



查看初始化成员节点通知是否正常发出:



grep TOTEM /var/log/cluster/corosync.log



检查启动过程中产生的错误



grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources



检查pacemaker是否正常启动



grep pcmk_startup /var/log/cluster/corosync.log



查看stonith设备



[root@node2 ~]# pcs stonith list



禁用STONITH设备(我们stonith设备)



[root@node2 ~]# pcs property set stonith-enabled=false



下面的命令我们可以查看集群信息基础库,



[root@node2 ~]# pcs cluster cib



查看stonith设备是否被禁用掉了



[root@node2 ~]# pcs cluster cib |grep stonith <nvpair name="stonith-enabled" value="false" id="cib-bootstrap-options-stonith-enabled"/>



Stonith确实被禁用了

查看资源代理的provider



[root@node3 ~]# pcs resource standards



查看某种provider所有的资源代理的列表



[root@node3 ~]# pcs resource agents lsb [root@node3 ~]# pcs resource agents ocf:pacemaker



为web集群,创建IP地址资源



[root@node3 ~]# pcs resource create webip ocf:heartbeat:IPaddr ip=172.16.11.5 cidr_netmask=16 op monitor interval=30s [root@node3 ~]# pcs resource create webserver lsb:httpd



定义资源约束

让webip和webserver运行在同一节点



[root@node2 ~]# pcs constraint colocation add webserver webip INFINITY



顺序约束,先启动webip然后再启动webserver



[root@node2 ~]# pcs constraint order webip then webserver



记得配置corosync和pacemaker开机自动启动



[root@ms ~]# ansible all -a "chkconfig corosync on" [root@ms ~]# ansible all -a "chkconfig pacemaker on"



禁用资源服务



[root@ms ~]# ansible all -a "chkconfig httpd off"



Heartbeatv2+CRM+hb_gui(centos6.4)

因为heartbeatV2在centos6.4中已经不再提供了,所以,我们使用src.rpm自己制作rpm包,我们总共需要一下四个包组,并且按照一下次序安装,中间遇到冲突可以使用yum–e–nodeps软件包名删除,解决冲突




yum -y install PyXML net-snmp-libs libnet rpm -ivh heartbeat-pils-2.1.4-12.el6.x86_64.rpm rpm -ivh heartbeat-stonith-2.1.4-12.el6.x86_64.rpm rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm




复制authkey到/ha.d中,自己制定随机数




cp /usr/share/doc/heartbeat-2.1.4/authkeys /etc/ha.d/




生成随机数




# openssl rand -hex 8




在authkeys中将自己生成的随机数添加到里面




auth 2 2 sha1 13a4fbcd94e01072




在节点上修改一下文件




[root@node1 ~]# vim /etc/ha.d/ha.cf




Heartbeat支持广播,组播,还有单播




mcast eth0 225.0.0.98 694 1 0



修改为你想要的组播地址

添加资源节点




node node1.sysbo.net node node2.sysbo.net node node3.sysbo.net




添加外部ping节点




ping 172.16.0.1




使用CRM来做集群资源管理




crm respawn




给hacluster添加密码启动hb_gui,密码为hacluster的密码



grafana集群高可用 集群高可用方案_.net

可以看到3个允许的节点,在里面可以创建资源,定义约束关系,操作非常简单,这里我就不详述了

grafana集群高可用 集群高可用方案_.net_02

最后一定要记住禁用资源开机启动.


总结,实现高可用的解决方案有很多,我们可以从中选择一种实现,其实了解了原理,所有的高可用软件操作都变的非常简单。


转载于:https://blog.51cto.com/sysbo/1298944