高可用性H.A.(HighAvailability)指的是经过尽可能缩短因平常维护操做(计划)和突发的系统崩溃(非计划)所致使的停机时间,以提升系统和应用的可用性,HA系统是目前企业防止核心计算机系统因故障停机的最有效手段。node
HA的工做机制与框架linux
1,RA(ResouceAgent)nginx
与CRM通讯,启动各个资源,资源包括可启动的服务(如httpd,nginx)和不可启动的如(IP地址),能够在资源级别进行监控web
RA常见的RA有LSB(linuxStandardBase)linux标准库,即/etc/rc.d/init.d/下的全部文件,OCF(OpenClusterFramework)开放集群框架,Stonith(断掉谁的电,节点级别),fence(资源级别的)bootstrap
2,DC(DesignatedCoordinator)指派协调员。协调集群事务,是被推举出来的,收集心跳信息,决定那个资源运行在哪一个节点上vim
3,MessagingLayer:消息传输层,集群的基础架构层centos
负责传递心跳信息,管理成员关系bash
常见的消息传输层有: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进行通讯
1
2
3
4
|
[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
1
|
#ansible all -a "yum -y install corosync"
|
在节点上修改配置corosync的配置文件
1
2
3
|
[root@node1 corosync]
# vim /etc/corosync/corosync.conf
[root@ms ~]
# ssh node1
[root@node1 corosync]
# vim /etc/corosync/corosync.conf
|
添加下面两段代码
1
2
3
4
5
6
7
8
|
service {
ver: 0
name: pacemaker
//
定义corosync的CRM为pacemaker
}
aisexec {
uer:root
group:root
}
|
修改bindnetaddr后面的IP地址为节点所在的网络地址,而且定义组播地址
1
2
3
4
5
6
7
8
9
10
11
|
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
1
|
[root@ms ~]
# ansible all -a 'service corosync start'
|
启动以后
保证corosync的引擎启动:
1
|
grep
-e
"Corosync Cluster Engine"
-e
"configuration file"
/var/log/cluster/corosync
.log
|
查看初始化成员节点通知是否正常发出:
1
|
grep
TOTEM
/var/log/cluster/corosync
.log
|
检查启动过程当中产生的错误
1
|
grep
ERROR:
/var/log/cluster/corosync
.log |
grep
-
v
unpack_resources
|
检查pacemaker是否正常启动
1
|
grep
pcmk_startup
/var/log/cluster/corosync
.log
|
查看stonith设备
1
|
[root@node2 ~]
# pcs stonith list
|
禁用STONITH设备(咱们stonith设备)
1
|
[root@node2 ~]
# pcs property set stonith-enabled=false
|
下面的命令咱们能够查看集群信息基础库,
1
|
[root@node2 ~]
# pcs cluster cib
|
查看stonith设备是否被禁用掉了
1
2
|
[root@node2 ~]
# pcs cluster cib |grep stonith
<nvpair name=
"stonith-enabled"
value=
"false"
id
=
"cib-bootstrap-options-stonith-enabled"
/>
|
Stonith确实被禁用了
查看资源代理的provider
1
|
[root@node3 ~]
# pcs resource standards
|
查看某种provider全部的资源代理的列表
1
2
|
[root@node3 ~]
# pcs resource agents lsb
[root@node3 ~]
# pcs resource agents ocf:pacemaker
|
为web集群,建立IP地址资源
1
2
|
[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运行在同一节点
1
|
[root@node2 ~]
# pcs constraint colocation add webserver webip INFINITY
|
顺序约束,先启动webip而后再启动webserver
1
|
[root@node2 ~]
# pcs constraint order webip then webserver
|
记得配置corosync和pacemaker开机自动启动
1
2
|
[root@ms ~]
# ansible all -a "chkconfig corosync on"
[root@ms ~]
# ansible all -a "chkconfig pacemaker on"
|
禁用资源服务
1
|
[root@ms ~]
# ansible all -a "chkconfig httpd off"
|
Heartbeatv2+CRM+hb_gui(centos6.4)
由于heartbeatV2在centos6.4中已经再也不提供了,因此,咱们使用src.rpm本身制做rpm包,咱们总共须要一下四个包组,而且按照一下次序安装,中间遇到冲突可使用yum–e–nodeps软件包名删除,解决冲突
1
2
3
4
5
|
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中,本身制定随机数
1
|
cp
/usr/share/doc/heartbeat-2
.1.4
/authkeys
/etc/ha
.d/
|
生成随机数
1
|
# openssl rand -hex 8
|
在authkeys中将本身生成的随机数添加到里面
1
2
|
auth 2
2 sha1 13a4fbcd94e01072
|
在节点上修改一下文件
1
|
[root@node1 ~]
# vim /etc/ha.d/ha.cf
|
Heartbeat支持广播,组播,还有单播
1
|
mcast eth0 225.0.0.98 694 1 0
|
修改成你想要的组播地址
添加资源节点
1
2
3
|
node node1.sysbo.net
node node2.sysbo.net
node node3.sysbo.net
|
添加外部ping节点
1
|
ping
172.16.0.1
|
使用CRM来作集群资源管理
1
|
crm respawn
|
给hacluster添加密码启动hb_gui,密码为hacluster的密码
能够看到3个容许的节点,在里面能够建立资源,定义约束关系,操做很是简单,这里我就不详述了
最后必定要记住禁用资源开机启动.
总结,实现高可用的解决方案有不少,咱们能够从中选择一种实现,其实了解了原理,全部的高可用软件操做都变的很是简单。