高可用性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個容許的節點,在裏面能夠建立資源,定義約束關係,操做很是簡單,這裏我就不詳述了
最後必定要記住禁用資源開機啓動.
總結,實現高可用的解決方案有不少,咱們能夠從中選擇一種實現,其實瞭解了原理,全部的高可用軟件操做都變的很是簡單。