接觸Heartbeat主要是因為之前項目中使用了TFS,最近想給nameserver做HA,因為TFS官方用的Heartbeat,是以剛好了解下,參考了網絡上很多内容,這裡簡單記錄下。
内容
- 環境和軟體包
- Heartbeat源碼安裝
- Heartbeat yum安裝
- Heartbeat配置
- 測試
- FAQ
- 參考連結
我的機器是兩台64位的CentOS,其它Linux機器應該差不多可以參考官方的說明。
從Heartbeat 2.1.4之後原先的項目被拆分成了三個子項目:
cluster-glue
、
resource-agents
和
heartbeat
,導緻了配置更加複雜。下面列出了我使用的各個軟體包版本并提供了下載下傳(後面具體安裝提供了官方的下載下傳位址,這裡自己做個備份)。
- cluster-glue 1.0.9
- resource-agents 3.9.2
- heartbeat 3.0.5
先最小化系統安裝:gcc編譯環境等。
# yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-develbzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel make wget docbook-dtds docbook-style-xsl
添加 Haclient 組和 Hacluster 賬戶。這個使用者主要用來配置respawn的。
# groupadd haclient
# useradd -g haclient hacluster -M -s /sbin/nologin
安裝libaio
cluster-glue依賴的庫。libaio是Linux下的一個異步非阻塞接口,它提供了以異步非阻塞方式來讀寫檔案的方式,讀寫效率比較高。
# yum install libaio-devel
安裝cluster-glue
glue(膠水的意思)是用來粘合Heartbeat、Pacemake以及Resource Agent的一系列類庫、工具的集合。
# wget http://hg.linux-ha.org/glue/archive/glue-1.0.9.tar.bz2
# tar jxvf glue-1.0.9.tar.bz2
# cd Reusable-Cluster-Components-glue--glue-1.0.9/
# ./autogen.sh
# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
# make & make install l
安裝Resource Agents
resource-agents為叢集資源的通路提供了一系列标準的接口。
# wget https://codeload.github.com/ClusterLabs/resource-agents/zip/v3.9.2
# unzip v3.9.2
# cd resource-agents-3.9.2/
# ./autogen.sh
# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
//建立一個軟連接配接,避免編譯時找不到所需要的包
# ln -s /usr/local/heartbeat/lib64/* /lib64/
注意:LDFLAGS的空格,否則configure時不會報錯但make時報錯。
安裝Heartbeat
# wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/7e3a82377fa8.tar.bz2
# tar jxvf 7e3a82377fa8.tar.bz2
# cd Heartbeat-3-0-7e3a82377fa8/
# ./bootstrap
# ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
# vi /usr/local/heartbeat/include/heartbeat/glue_config.h
// 删除 glue_config.h 最後一行定義的配置檔案路徑,避免編譯時産生的路徑重複定義錯誤,Shift+g 跳到末行,dd删除
# make && make install
配置檔案修改
将配置檔案複制到 /etc/heartbeat/ 下,并使用sed 修改路徑
# cp doc/ha.cf /etc/heartbeat/ha.d/
# cp doc/haresources /etc/heartbeat/ha.d/
# cp doc/authkeys /etc/heartbeat/ha.d/
# chkconfig --add heartbeat
# chkconfig heartbeat on
# chmod 600 /etc/heartbeat/ha.d/authkeys
# sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/shellfuncs
# sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/resource.d/hto-mapfuncs
# sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/ocf-shellfuncs
建立Resource-Agent 的腳本軟連接配接,避免Heartbeat 找不到路徑而無法工作
# ln -s /usr/local/heartbeat /usr/lib/ocf
推薦通過yum來安裝Heartbeat,因為無論是tfs官方還是網上一些參考資料都是采用這種方式,這樣會少很多路徑配置方面的問題。但CentOS預設情況通過yum install heartbeat好像找不到相應的包,需要先下載下傳并安裝epel包:
# wget http://mirrors.sohu.com/fedora-epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install heartbeat*
Heartbeat的配置主要涉及到ha.cf、haresources、authkeys這三個檔案。其中ha.cf是主配置檔案,haresource用來配置要讓Heartbeat托管的服務,authkey是用來指定Heartbeat的認證方式,具體參考:http://ixdba.blog.51cto.com/2895551/548625
需要注意幾點:
- authkeys的配置方式:
# auth 1 //認證序号1
# 1 md5 password //序号1 采用MD5 後面是密鑰
auth 後面填寫序号,可任意填寫,但第二行開頭必須為序号名,然後為驗證方式,支援三種( crc md5 sha1 )方式驗證,最後面是自定義密鑰。
- 需要保證authkeys有相應的讀寫權限:
# chmod 600 /etc/heartbeat/ha.d/authkeys
- 對于HA系統來說主從節點的機器時間同步時很重要的。
- 服務要想被Heartbeat托管則必須寫成可以通過start/stop來啟動和關閉的腳本,然後放在/etc/init.d或者Heartbeat自己的ha.d/resource.d目錄中。
- HA的備份節點也需要安裝Heartbeat,可以同錯scp指令來複制配置檔案:
# scp –r node1:/etc/heartbeat/ha.d/* /etc/heartbeat/ha.d/
//node1為主節點的主機名(uname -n)
- 建立測試腳本 在Heartbeat的ha.d/resource.d下如下建立一個腳本:
# vi /etc/heartbeat/ha.d/resource.d/test1
輸入如下内容:
#!/bin/bash
logger $0 called with $1
case "$1" in
start)
# Start commands go here
echo "start!!!";
;;
stop)
# Stop commands go herer
echo "stop!!!";
;;
status)
# Status commands go here
echo "status!!!";
;;
esac
增加相應的權限:
# chmod 755 test1
可以這樣執行該腳本:
# ./test1 start
- 配置haresource檔案
# vi /etc/heartbeat/ha.d/haresources
# 輸入下面的内容
# ydhl-test1 test1
其中ydhl-test1為uname –n輸出的結果。
- 配置authkeys,參見上段内容。
- 配置ha.cf
debugfile /var/log/ha-debug
# 用于記錄heartbeat的調試資訊
logfile /var/log/ha-log
# 用于記錄heartbeat的日志資訊
logfacility local0
keepalive 2
# 設定心跳間隔
watchdog /dev/watchdog
deadtime 30
# 在30秒後宣布節點死亡
warntime 10
# 在日志中發出“late heartbeat“警告之前等待的時間,機關為秒
initdead 120
# 網絡啟動時間
udpport 694
# 廣播/單點傳播通訊使用的udp端口
#baud 19200
#serial /dev/ttyS0
# 使用序列槽heartbeat
bcast eth0
# 使用網卡eth0發送心跳檢測
auto_failback on
# 當主節點從故障中恢複時,将自動切換到主節點
watchdog /dev/watchdog
# 該指令是用于設定看門狗定時器,如果節點一分鐘内都沒有心跳,那麼節點将重新啟動
node HA-01
node HA-02
# 叢集中機器的主機名,與“uname –n”的輸出相同。
ping 192.168.0.254
# ping 網關或路由器來檢測鍊路正常
respawn hacluster /usr/local/heartbeat/lib64/heartbeat/ipfail
# respawn調用 ipfail 來主動進行切換
apiauth ipfail gid=haclient uid=hacluster
# 設定啟動ipfail的使用者群組
- 備份節點配置,參見上段内容。
- 同步主從節點系統時間:可以通過ntpdate來同步
- 啟動Heartbeat
在啟動之前用下面的指令在主從節點上面測試一下配置是否正确,ReourceManager在Heartbeat安裝目錄的share/heartbeat目錄下。
# ./ResourceManager listkeys `/bin/uname -n`
測試通過後啟動主節點和從節點Heartbeat:
# service heartbeat start
通過檢視 /var/log/messages可以看到Hearbeat的很多資訊:
可以看到我們前面的測試腳本test1輸出的資訊。
當通過service heartbeat stop指令停止一個節點的Heartbeat的時候,從日志中可以看到另外一個節點已經感覺到了:
重新開機後可以看到:
Q:為什麼在/var/log/messages裡看到很多下面這樣的警告?
A :這種情況是因為部署Heartbeat是直接從其它機器上拷貝過來導緻的。直接拷過來會導緻兩個節點上的uuid沖突,解決方法是強制某個Hearbeat重新生成uuid,先停止Heatbeat然後删除hb_uuid這個檔案(可以通過find指令查找)重新開機就好了:
# rm –rf /usr/local/heartbeat/var/lib/heartbeat/hb_uuid
Q:什麼是“腦裂”問題?
A :采用keepalive等心跳軟體,需要注意“腦裂”問題: "在“雙機熱備”高可用(HA)系統中,當聯系2個節點的“心跳線”斷開時,本來為一整體、動作協調的HA系統,就分裂成為2個獨立的個體。由于互相失去了聯系,都以為是對方出了故障,2個節點上的HA軟體像“裂腦人”一樣,“本能”地争搶“共享資源”、争起“應用服務”,就會發生嚴重後果:或者共享資源被瓜分、2邊“服務”都起不來了;或者2邊“服務”都起來了,但同時讀寫“共享存儲”,導緻資料損壞(常見如資料庫輪詢着的聯機日志出錯)。
Q:啟動heartbaet的時候可能會報很多庫找不到的錯誤:
A:可以先通過find指令查找,然後通過建立軟連接配接就可以解決了:
# ln -s /usr/libexec/pacemaker/* /usr/local/heartbeat/lib64/heartbeat/
[1]高可用方案之腦裂問題探讨
作者:zhanjindong
出處:http://www.cnblogs.com/zhanjindong
個人部落格:http://zhanjindong.com
關于:一個程式員而已
說明:目前的技術水準有限,部落格定位于學習心得和總結。