上篇文章簡單介紹了下基於Heartbeat的虛擬IP配置,個人覺得簡單易用已經能夠應付大部分場景了。但是既然花時間研究HA,如果僅限於一個虛擬IP飄來飄去未免有點糊弄任務了,因此這篇文章打算介紹下基於Pacemaker和CMAN如何構建高可用的TFS NameServer,之所以為什么沒有采用Heartbeat+Pacemaker,是因為我花了好大功夫按照官方文檔和這篇博客都沒有搞定,最后尋思應該是使用的Heartbeat版本和環境不同,這篇文章作者也沒對環境做過多交代,因此我一上來會先介紹下上下文環境,至於什么是Heartbeat、Pacemaker和CMAN打算另寫一篇介紹。Linux-HA非常繁雜,涉及的東西非常多,這個項目不同的版本差距也很大,本文本着實用的原則記錄下這幾天我折騰的結果和路上遇到的各種坑。
友情提示:TFS坑比較多。
內容導航
上下文環境
操作系統
[root@jdzhan1 /]# uname -a Linux jdzhan1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
軟件包
[root@jdzhan1 /]# rpm -q pacemaker cman pcs ccs resource-agents pacemaker-1.1.10-14.el6_5.2.x86_64 cman-3.0.12.1-59.el6_5.1.x86_64 pcs-0.9.90-2.el6.centos.2.noarch ccs-0.16.2-69.el6_5.1.x86_64 resource-agents-3.9.2-40.el6_5.6.x86_64
tfs
[1]TFS安裝:http://zhanjindong.info/2014/03/06/tfs-installation/
[2]TFS部署:http://zhanjindong.info/2014/03/06/tfs-deploy/
[3]TFS部署問題匯總:http://zhanjindong.info/2014/03/05/tfs-deploy-questions/
我安裝是一個叫做dev_for_outer_users版本的TFS,這個版本可能精簡了一些東西,比如ha_monitor這個工具,小坑了我一下。
集群
在自己本子的虛擬機上搭建了兩個節點:
IP | 節點名(uname -n) |
192.168.129.129 | jdzhan1 |
192.168.129.130 | jdzhan2 |
Pacemaker安裝
為了簡單起見,Pacemaker直接通過yum安裝, 在CentOS6.4上直接執行下面的命令就可以了。
# yum install pacemaker cman pcs ccs resource-agents
注意CMAN
是必須,pcs和css命令方便我們對集群進行配置。
現網應該將pacemaker加入開機啟動項:
# chkconfig pacemaker on
安裝crmsh資源管理工具(可選)
從pacemaker 1.1.8開始,crmsh 發展成一個獨立項目,pacemaker中不再提供。crmsh提供了一個命令行的交互接口來對Pacemaker集群進行管理,但這個不是必須的通過pcs和ccs通常就OK了。
# yum install -y python-dateutil python-lxml # yum install redhat-rpm-config # wget http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/pssh-2.3-1.el6.rf.noarch.rpm # rpm -ivh pssh-2.3-1.el6.rf.noarch.rpm # wget http://tux.rainside.sk/opensuse/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/crmsh-1.2.6-6.1.x86_64.rpm # rpm -ivh crmsh-1.2.6-6.1.x86_64.rpm
安裝完成后直接crm就可以進入命令行,具體用法可以man下。
Pacemaker配置簡單介紹
其實對Pacemaker的配置就是對cib.xml文件的配置,文件分為configuration
和status
兩個部分,status節點用來維護一個節點上所有資源的歷史信息,依據這些信息集群可以構建完整的當前狀態。
configuration節點主要用來配置集群需要監控的資源,我們一般主要關心的就是這個部分。
cib.xml組成:
<cib admin_epoch="0" epoch="0" num_updates="0" have-quorum="false"> <configuration> <crm_config/> <nodes/> <resources/> <constraints/> </configuration> <status/>
</cib>
官方強烈建議不要手動的修改這個文件,而是通過提供的一系列命令,比如cibadmin
,我們可以利用這個命令先copy一個副本出來修改,修改完了再提交回去,向下面這樣:
# cibadmin --query > tmp.xml # vi tmp.xml # cibadmin --replace --xml-file tmp.xml
大部分情況我們只需要關心configuration的resources配置:
# cibadmin --query --obj_type resources > tmp.xml # vi tmp.xml # cibadmin --replace --obj_type resources --xml-file tmp.xml
將ha.cf和haresouce轉換為cib.xml
默認通過yum安裝Pacemaker是沒有cib.xml這個文件的(一般在/var/lib/pacemaker/cib/路徑)
如果之前已經基於Heartbeat 1.x style構建過了集群,那么可以通過Heartbeat2.x提供的一個叫做haresources2cib.py的工具將ha.cf和haresource轉換為cib.xml
# /usr/lib/heartbeat/haresources2cib.py --stdout -c ha.cf \
haresources > cib.xml
但是不建議采取這樣的方式,因為不同版本的格式可能有點差異(Heartbeat2.x對應應該是Pacemaker1.0.x),可以通過crm_verify進行驗證,向下面這樣:
# crm_verify -Vx var/lib/pacemaker/cib/cib.xml
比如我將上篇文章中Nameserver虛擬IP配置信息轉換成的cib.xml。
啟動Pacemaker
啟動Pacemaker之前需要先啟動cman
,啟動cman之前需要先配置集群的信息(即默認在/etc/luster下生成cluster.conf)可以按照下面的步驟來:
創建名為jdzhan的集群,注意這個名詞不能超過15個字符:
#ccs -f /etc/cluster/cluster.conf --createcluster jdzhan
將jdzhan1和jdzhan2兩個節點添加到集群當中:
# ccs -f /etc/cluster/cluster.conf --addnode jdzhan1
# ccs -f /etc/cluster/cluster.conf --addnode jdzhan2
以及其他一些配置:
# ccs -f /etc/cluster/cluster.conf --addfencedev pcmk agent=fence_pcmk # ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect jdzhan1 # ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect jdzhan2 # ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk jdzhan1 pcmk-redirect port=jdzhan1 # ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk jdzhan2 pcmk-redirect port=jdzhan2
啟動:
# echo "CMAN_QUORUM_TIMEOUT=0" >> /etc/sysconfig/cman # service cman start # service pacemaker start
啟動之后可以進一步設置。
不需要使用STONITH功能:
# pcs property set stonith-enabled=false 大部分情況下集群只有兩個節點,忽略下面這個配置 # pcs property set no-quorum-policy=ignore 當單點故障時候進行服務遷移 # pcs resource defaults migration-threshold=1
啟動成功后,就會發現/var/lib/pacemaker/cib/下面已經生成cib.xml文件了。
輸入crm_mon -1
可以查看集群的狀態:
因為jdzhan2節點上面的pacemaker還沒啟動,所以顯示offline。
按照上面的步驟配置jdzhan2后(scp一下cluster.conf),cib.xml文件會自動在集群各個節點上進行同步。
# scp root@192.168.129.129:/etc/cluster/cluster.conf /etc/cluster/
啟動cman的時候可能會遇到一些小麻煩,可以看下下面的FAQ部分。
OK,至此Pacemaker已經啟動了,下面就是把我坑的最慘的TFS Nameserver HA配置了。
TFS Nameserver HA配置
我這里按照我的順序說下具體步驟,其中遇到的一些其他問題和需要用到的資源參考后面的FAQ和資源下載。
Step0:通過yum安裝好CMAN和Pacemaker。
強調yum
是因為如果編譯安裝的話一些路徑可能會跟我下面描述的有出入。
Step1:配置nameserver的ns.conf
# vi /home/tfs/conf/ns.conf
關注幾個重要參數如下:
#listen port 端口 port = 8100 #work directoy tfs的安裝路徑 work_dir=/home/tfs #device name 綁定的網卡一般是ifconfig顯示的第一個 dev_name= eth0 #ip addr(vip) 虛擬IP ip_addr = 192.168.129.133 [nameserver] # 主備nameserver的IP ip_addr_list = 192.168.129.129|192.168.129.130 group_mask = 255.255.255.255
Step2:拷貝文件
執行TFS自帶的nsdep
之前(這個命令或將/home/tfs/scripts/ha下的NameServer
拷貝到/usr/lib/ocf/resource.d/heartbeat/),NameServer是一個OCF資源文件(參考這里),Pacemaker正是利用這個文件來監控、啟動和關閉資源的,但是我安裝的這版TFS里提供的NameServer腳本貌似有點版本不兼容,我做了下修改(下載)
還有一個很需要注意的地方是,NameServer這個腳本里需要用到一個ha_monitor
的腳本來監控Nameserver進程,但是我安裝的TFS里也沒有,需要從TFS其他版本源碼里找下放到/home/tfs/bin路徑下(下載)。
另外需要注意的是要設置下OCF_ROOT
這個環境變量,OCF腳本需要引用:
#vi /etc/profile 加入export OCF_ROOT=/usr/lib/ocf #source /etc/profile
准備好后直接執行下面命令或者手動復制就行了。
# cd /home/tfs/scripts/ha/
# ./nsdep
Step3:修改ns.xml
ns.xml(在$TFS_HOME/scripts/ha/路徑下)其實就是前面提到的cib.xml中的resources節點,配置有兩個資源需要監控:一個是和NameServer綁定的虛擬IP有一個是NameServer本身(依賴NameServer腳本和ha_monitor工具)。
主要修改如下:
ip的屬性值設置為192.168.129.100 nic的屬性值為eth0:0 basedir配置為/home/tfs (設置為tfs的安裝目錄) nsip配置為192.168.129.129 (ns vip)主備指定一樣的 nsport配置為8100 (ns port) user設置為root (用於啟動服務的用戶)
需要特別注意的ns.xml中虛擬IP和NameServer是作為一個資源組綁定在一起的,這樣才能實現當進程掛掉了,虛擬IP能夠跟隨的漂移到另外一個節點上。
Step4:按照如上步驟配置好另外一個節點。
ns.xml是一模一樣的,通過scp拷過去就可以了。
Step5:修改主備hosts
# vi /etc/hosts 分別加上對方主機和ip的映射: # 192.168.129.129 jdzhan1 # 192.168.129.130 jdzhan2 考慮防火牆可能有影響可以關閉防火牆: # service iptables stop
# chkconfig iptables stop
Step6:添加haclient組和hacluster用戶(主備都需要,如果通過yum安裝的Pacemaker那么應該已經添加過了)
# groupadd haclient
# useradd -g haclient hacluster -M -s /sbin/nologin
Step7:啟動cman和Pacemaker
# service cman start
直接啟動pacemaker也可以
# service pacemaker start
Step8:集群初始化
一切就緒后執行下面的命令(只需要在一個節點上執行)。
crm_attribute --type crm_config --attr-name symmetric-cluster --attr-value true crm_attribute --type crm_config --attr-name stonith-enabled --attr-value false crm_attribute --type rsc_defaults --name resource-stickiness --update 100 cibadmin --replace --obj_type=resources --xml-file /home/admin/tfs/scripts/ha/ns.xml 上述命令做到主要工作包含 1. 配置所有的節點為對等關系,即所有的節點都能接管服務 2. 禁用stonish 3. 應用ns.xml里的配置
Step9:檢查集群狀態
執行pcs status
或crm_mon -1
查看集群狀態:
Step10:測試
測試之前的狀態是虛擬IP和NameServer都在jdzhan1節點上。
1)模擬NameServer進程被kill掉。
# ps -ef | grep tfs # kill -9 2833 # pcs status
可以看到NameServer在jdzhan2節點起來了,同時虛擬IP也漂移到jdzhan2。
1) 模擬機器宕機
接着上面,reboot jdzhan2。很快(快慢在ns.xml中配置)jdzhan1接管了服務。
FAQ
Q:啟動cman報如下錯誤:
A:如下關系Network Mannager服務和啟動項就可以了:
# service NetworkManager stop
# chkconfig NetworkManager off
Q:啟動cman報如下錯誤:
A:修改/etc/hosts配置好需要添加到集群的節點名(uname -n)和IP地址的映射關系,並且保證localhost地址不要映射成節點名。
Q:為什么啟動Pacemaker后發現兩個節點之間總是顯示對方offline,監控的資源(比如虛擬IP)都在本機啟動了。
A:可能是出現腦裂了,嘗試關閉防火牆和SELinux試試:
# service iptables stop # vi /etc/selinux/config
將SELinux
置為disabled
也有可能是兩個節點之前的時間不同步導致的。
資源下載
[1]cib.xml示例文件
[2]ha_monitor
[5]ns.xml示例文件
參考鏈接
[1]Pacemaker Explained:http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Explained/
[2]Pacemaker安裝:http://clusterlabs.org/quickstart-redhat.html,http://clusterlabs.org/wiki/Install#Installing_on_RHEL-6
[3]將haresources轉換為cib.xml:http://linux-ha.org/ClusterInformationBase/Conversion
[4]OCF資源腳本書寫方法:http://www.cnblogs.com/haohao-jishuzhilu/archive/2012/12/18/2823271.html
歡迎訪問我的個人博客:http://zhanjindong.info/2014/03/22/tfs-ha-pacemaker-cman/