CENTOS7構建HA叢集
CENTOS7 上支援的RHCS元件包主要有cman(心跳管理)、luci+ricci(配置工具)、rgmanager(資源管理),通過圖形化配置相當簡單,但是自CENTOS7開始,系統已經不再整合RHCS套件,並且在rpmfind上找不到支援centos7的RHCS元件包,在CENTOS7中預設採用corosync(心跳管理)、pacemaker(資源管理)、pcs(配置工具)同樣可以構建HA叢集,配置方法較之前有很大區別,但是原理相似。
yum -y install corosync pacemaker *pcs* *fence* gfs2*
一、系統環境配置
1.1、修改名稱
hostnamectl set-hostname node01
1.2兩臺機器修改關閉防火牆、SELINUX、配置IP、修改HOSTS
禁止防火牆和selinux
# systemctl disable firewalld
# systemctl stop firewalld
修改/etc/sysconfig/selinux
確保SELINUX=disabled,然後執行setenforce 0 或者reboot伺服器以生效
設定防火牆規則(如果關閉防火牆則不用配置)
# firewall-cmd --permanent--add-service=high-availability
# firewall-cmd--add-service=high-availability
配置IP地址及閘道器、DNS
vi /etc/sysconfig/network-scripts/ifcfg-eth0#編輯配置檔案,新增修改以下內容
BOOTPROTO=static #啟用靜態IP地址
ONBOOT=yes #開啟自動啟用網路連線
IPADDR=192.168.102.1 #設定IP地址
NETMASK=255.255.255.0 #設定子網掩碼
GATEWAY=192.168.102.250 #設定閘道器
DNS1=8.8.8.8 #設定主DNS
DNS2=8.8.4.4 #設定備DNS
IPV6INIT=no #禁止IPV6
配置HOSTS,兩邊一樣。
192.168.102.1 node01
192.168.102.2 node02
192.168.102.10 vip #叢集IP
二、叢集環境準備
兩臺機器啟動PCSD
systemctl start pcsd.service
systemctl enable pcsd.service
兩臺機器passwd hacluster
輸入同一個密碼hacluster
配置節點之間的相互認證
pcs cluster auth node01 node02
Username:hacluster
Password:
node01:Authorized
node02:Authorized
出現以下顯示錶示認證成功。
[[email protected]~]# pcs cluster auth node01 node02
node01:Already authorized
node02:Already authorized
各節點之間時間同步
在node1和node2分別進行時間同步,可以使用ntp實現。
[[email protected] ~]# ntpdate 172.16.0.1//172.16.0.1 為時間伺服器(若無時間伺服器手動調整時間也可以)
三、叢集建立
以nascluster為本叢集的名稱。
[[email protected] ~]# pcs cluster setup --namenascluster node01 node02
Shutting down pacemaker/corosyncservices...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
node01: Succeeded
node02: Succeeded
pcs在執行以上命令時會生產corosync.conf及修改cib.xml檔案,corosync.conf問corosync的配置檔案,cib.xml為pacemaker的配置檔案。這兩個配置檔案是叢集的核心配置,重灌系統時建議做好這兩個配置檔案的備份。
開啟叢集
pcs cluster start --all 開啟叢集
pcs cluster enable --all 設定叢集自動啟動
pcs cluster status 檢視叢集狀態
當有半數以上的節點線上時,這個叢集就認為自己擁有法定人數了,是“合法”的,換而言之就是下面的公式: total_nodes < 2 * active_nodes,也就是說假設叢集中有4個節點,但是活動節點有3個,4<2*3,即是合法的叢集,如果活動節點有2個,4=2*2不能滿足total_nodes < 2 * active_nodes了,這個叢集就非法了。
因此在雙節點的叢集中只有當兩者都線上時才是合法的的這個規則會讓“雙節點叢集”毫無意義,但是我們可以控制Pacemaker發現叢集達不到法定人數時候的行為。簡單來說,我們告訴叢集忽略它。
在兩個節點的情況下設定以下值
pcs property set no-quorum-policy=ignore
叢集故障時候服務遷移
pcs resource defaults migration-threshold=1
檢視叢集狀態
[[email protected] ~]# pcs cluster status
Cluster Status:
Lastupdated: Tue Sep 16 06:35:31 2014
Lastchange: Tue Sep 16 06:35:24 2014 via crmd on node02
Stack: corosync
Current DC: node02 (2) - partition with quorum
Version: 1.1.10-29.el7-368c726
2Nodes configured
0Resources configured
PCSD Status:
node01: Online
node02: Online
檢視叢集成員
[[email protected] ~]# corosync-cmapctl |grepmembers
runtime.totem.pg.mrp.srp.members.1.config_version(u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str)= r(0) ip(192.168.102.1)
runtime.totem.pg.mrp.srp.members.1.join_count(u32) = 1
runtime.totem.pg.mrp.srp.members.1.status(str) = joined
runtime.totem.pg.mrp.srp.members.2.config_version(u64) = 0
runtime.totem.pg.mrp.srp.members.2.ip (str)= r(0) ip(192.168.102.2)
runtime.totem.pg.mrp.srp.members.2.join_count(u32) = 1
runtime.totem.pg.mrp.srp.members.2.status(str) = joined
檢視成員資訊
[[email protected] ~]# pcs status corosync
Membership information
----------------------
Nodeid Votes Name
1 1 node01 (local)
2 1 node02
檢視XML
[[email protected] ~]# pcs cluster cib
檢查配置檔案,發現提示沒有STONITH裝置。
[[email protected] ~]# crm_verify -L -V
error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
error: unpack_resources: NOTE:Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
暫時關閉stonish,後面再詳細講講stonish的配置。
pcs property set stonith-enabled=false
配置叢集IP
pcs resource create vipocf:heartbeat:IPaddr2 ip=192.168.102.10 cidr_netmask=24 op monitor interval=30s
vip為自定義的一個叢集IP的名稱,監控時間為30S。
測試浮動IP地址在叢集中能否正常切換:
停node01的叢集服務pcs cluster stop node01
在node02上檢視狀態
[[email protected] ~]# pcs status
Cluster name: nascluster
Last updated: Tue Sep 16 07:28:33 2014
Last change: Tue Sep 16 07:26:41 2014 viacibadmin on node01
Stack: corosync
Current DC: node02 (2) - partition withquorum
Version: 1.1.10-29.el7-368c726
2 Nodes configured
1 Resources configured
Online: [ node02 ]
OFFLINE: [ node01 ]
Full list of resources:
vip (ocf::heartbeat:IPaddr2): Started node02 ##此條表示vip在node02上執行了
PCSD Status:
node01: Online
node02: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/disabled
在node01恢復後,為防止node02資源遷回node01(遷來遷去對還是會對業務有一定影響)
pcs resource defaultsresource-stickiness=100
pcs resource defaults
四、建立GFS2檔案系統
mkfs.gfs2 -p lock_dlm -j 2 -tnascluster:nas /dev/my_vg/gfsdata
配置dlm鎖監控時間
pcs cluster cib dlm_cfg ##由於cib.xml非常重要,為避免出錯不建議直接修改,故生產一個dlm_cfg檔案,將配置寫入dlm_cfg檔案後,再將dlm_cfg寫入cib.xml中。
pcs -f dlm_cfg resource create dlmocf:pacemaker:controld op monitor interval=60s
pcs -f dlm_cfg resource clone dlmclone-max=2 clone-node-max=1
pcs -f dlm_cfg resource show
pcs cluster cib-push dlm_cfg
普及一下dlm鎖的知識:
DistributedLock Manager,簡稱DLM,是一個分散式鎖管理器,它是RHCS的一個底層基礎構件,同時也為叢集提供了一個公用的鎖執行機制。DLM執行在每個節點上,GFS通過鎖管理器的機制來同步訪問檔案系統的元資料。CLVM通過鎖管理器來同步更新資料到LVM卷和卷組。
DLM不需要設定鎖管理伺服器,它採用對等的鎖管理方式,大大提高了處理效能。同時,DLM避免了單個節點失敗需要整體恢復的效能瓶頸。另外,DLM的請求是本地的,不需要網路請求,因此請求會立即生效。最後,DLM通過分層機制,可以實現多個鎖空間的並行鎖模式。
檢視狀態
[[email protected] nas]# pcs status
Cluster name: nascluster
Last updated: Tue Sep 16 07:48:09 2014
Last change: Tue Sep 16 07:44:08 2014 viacibadmin on node01
Stack: corosync
Current DC: node02 (2) - partition with quorum
Version: 1.1.10-29.el7-368c726
2 Nodes configured
3 Resources configured
Online: [ node01 node02 ]
Full list of resources:
vip (ocf::heartbeat:IPaddr2): Started node02
Clone Set: dlm-clone [dlm]
Started: [ node01 node02 ] ##DLM的狀態
PCSD Status:
node01: Online
node02: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
五、stonith配置
檢視本系統支援的fence裝置
pcs stonith list
檢視即將要使用的fence裝置相關資訊
pcs stonith describe fence_ilo4
由於伺服器是HP DL380 GEN8的,支援ILO4,但是在實際配置中採用fence_ilo4卻發現怎麼也不通,man fence_ilo4發現fence_ipmilan也可以配置ilo4的FENCE裝置,但是必須要加lanplus="true"引數。
pcs cluster cib stonith_cfg ##生產初始配置檔案stonith_cfg
pcs -f stonith_cfg stonith create ipmi-fence-node01fence_ipmilan parms lanplus="true" pcmk_host_list="node01" pcmk_host_check="static-list"action="reboot" ipaddr="192.168.103.1" login=USERIDpasswd=password op monitor interval=60s
pcs -f stonith_cfg stonith create ipmi-fence-node02fence_ipmilan parms lanplus="true" pcmk_host_list="node02" pcmk_host_check="static-list"action="reboot" ipaddr="192.168.103.2" login=USERIDpasswd=password op monitor interval=60s
解釋:建立一個名為ipmi-fence-node01的fence裝置名稱用於建node01的fence,pcmk_host_check="static-list"的功能是將node01與192.168.103.1對應,後面login=USERIDpasswd=password op monitor interval=60s不再解釋。
pcs -f stonith_cfg stonith
檢查stonith_cfg中stonith配置資訊
pcs -f stonith_cfg property setstonith-enabled=true 上文關閉了stonish,現在開啟stonish
pcs property set stonith-enabled=true
pcs -f stonith_cfg property
檢查stonith_cfg中stonith是否已經開啟
pcs cluster cib-push stonith_cfg 將stonith_cfg寫入cib.xml
node02上測試FENCE是否成功stonith_admin--reboot node01
node01上測試FENCE是否成功stonith_admin--reboot node02
pcs cluster standbynode01 將node01業務VIP遷移到node02上測試叢集是否正常。(手動切換)
在叢集所有節點重啟後發現gfs的檔案系統無法自動掛載,定義了fstab也不行,經過分析發現系統開機時候執行了pcs cluster start,而且很快就返回啟動成功的結果,但是系統日誌裡面顯示仍然還啟動完成,考慮到系統進入系統之後叢集有可能還沒啟動完成,所有自然無法掛載gfs的檔案系統。
如果無法自動掛載,我自己編寫了一個迴圈掛載的指令碼。供參考。
編輯指令碼
mountnas.sh
#!/bin/bash
i=1
while(($i<50))
do
mount |grep nas
if [ $? = 1 ];then mount /dev/my_vg/gfsdata/nas
else exit
fi
sleep 3
done
chmod 777 /etc/rc.local centos7 還需要給rc.local加個許可權,要不然開機不會執行rc.local
在/etc/rc.local
加入bash /mountnas.sh
六、配置多路心跳
在rhcs中,可以配置多路心跳,一路將fence作為心跳,一路將網路作為心跳,在corosync pacemaker的叢集中,找了國內外很多技術文章,均未做相關描述的。主要是因為corosync pacemaker的叢集相對來說已經很可靠,在未配置多路心跳之前將業務網絡卡DOWN後,發現 node02的叢集馬上失效,叢集IP立即切換至node01上,未出現腦裂的情況。
作為自己研究,嘗試了再配置了一個心跳。
在/etc/corosync.conf中,畢竟corosync管理心跳,所以只有在它裡面想辦法了,在centos7之前的corosync.conf配置中,會定義interface {}作為多個網路,但是在centos7中經過PCS統一管理後,經過測試發現pacemaker只認nodelist{}作為網路,難道這又是一個變動?
在totem {}
定義:
rrp_mode: passive #預設為none,修改為passive才可以支援兩個網段
nodelist {
node{
ring0_addr:node01
ring0_addr:test01 -test01為第二個心跳
}
node{
ring0_addr:node02
ring0_addr:test02 -test02為第二個心跳
}
}
記得修改host表。
重啟叢集即可生效,目前node01,node02對應192.168.102.0網段,test01 test02對應192.168.103.0網段,同時可以在192.168.103.0網段上再新建一個業務IP,
在配置叢集IP之前需要對test01 test02配置認證。
[[email protected] ~]# pcs cluster auth test01 test02
Username: hacluster
Password:
test01: Authorized
test02: Authorized
出現以下顯示錶示認證成功。
[[email protected] ~]# pcs cluster auth test01 test02
test01: Already authorized
test02: Already authorized
配置叢集IP
pcs resource create testipocf:heartbeat:IPaddr2 ip=192.168.103.10 cidr_netmask=24 op monitor interval=30s 注意testip與上文的vip已經名字不一樣,兩個叢集IP的名字不能一致。
七、配置叢集應用
以apache為例:
pcs resource create webocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.confstatusurl="http://localhost/server-status" op monitor interval=1min
pcs status檢視apache狀態,
pcs resource group add httpd(組名稱) vip web
pcs constraint colocation add Web vipINFINITY 將apache與vip繫結在同一個節點上。
pcs constraint order vip then Web,指定叢集IP先啟動,然後再啟動apache
pcs constraint location Web prefers node01=200指定node01優先啟動apache
crm_simulate -sL 檢視資源黏性值,叢集業務優先在資源黏性值高的節點上執行。
Current cluster status:
Online: [ node01 node02]
vip (ocf:heartbeat:IPaddr2): Started node01
Web (ocf:heartbeat:apache): Started node01
Allocation scores:
native_color: vip allocation score on node01:200
native_color: vip allocation score on node02:50
native_color: Web allocation score on node01:200
native_color: Web allocation score on node02:50
Transition Summary:
手動切換叢集資源
以上配置由叢集自動分配資源到node01、node02上,有時候為了維護,必須手動遷移資源到指定節點上。
# pcs constraint location Web prefers node01=INFINITY
# pcs constraint --full 檢視資源狀態
# pcs constraint remove location-Web-node01-INFINITY將控制權還給叢集