高可用性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進行通信
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個允許的節點,在裏面可以創建資源,定義約束關係,操作非常簡單,這裏我就不詳述了
最後一定要記住禁用資源開機啓動.
總結,實現高可用的解決方案有很多,我們可以從中選擇一種實現,其實瞭解了原理,所有的高可用軟件操作都變的非常簡單。