Linux-HA實戰(1)— Heartbeat安裝

接觸Heartbeat主要是由於以前項目中使用了TFS,最近想給nameserver作HA,由於TFS官方用的Heartbeat,因此恰好了解下,參考了網絡上不少內容,這裏簡單記錄下。node

內容

 

環境和軟件包

個人機器是兩臺64位的CentOS,其它Linux機器應該差很少能夠參考官方的說明。linux

從Heartbeat 2.1.4以後原先的項目被拆分紅了三個子項目:cluster-glueresource-agentsheartbeat,致使了配置更加複雜。下面列出了我使用的各個軟件包版本並提供了下載(後面具體安裝提供了官方的下載地址,這裏本身作個備份)。c++

  • cluster-glue 1.0.9
  • resource-agents 3.9.2
  • heartbeat 3.0.5

 

Heartbeat源碼安裝

先最小化系統安裝: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下的一個異步非阻塞接口,它提供了以異步非阻塞方式來讀寫文件的方式,讀寫效率比較高。git

# yum install libaio-devel

 

 安裝cluster-glue

 glue(膠水的意思)是用來粘合Heartbeat、Pacemake以及Resource Agent的一系列類庫、工具的集合。github

# 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爲集羣資源的訪問提供了一系列標準的接口。shell

# 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 修改路徑bootstrap

# 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

 

Heartbeat yum安裝

推薦經過yum來安裝Heartbeat,由於不管是tfs官方仍是網上一些參考資料都是採用這種方式,這樣會少不少路徑配置方面的問題。但CentOS默認狀況經過yum install heartbeat好像找不到相應的包,須要先下載並安裝epel包:api

# 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配置

Heartbeat的配置主要涉及到ha.cf、haresources、authkeys這三個文件。其中ha.cf是主配置文件,haresource用來配置要讓Heartbeat託管的服務,authkey是用來指定Heartbeat的認證方式,具體參考:http://ixdba.blog.51cto.com/2895551/548625bash

須要注意幾點:

  • 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的時候,從日誌中能夠看到另一個節點已經感知到了: 

此處輸入圖片的描述

重啓後能夠看到:

此處輸入圖片的描述

 

FAQ

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]高可用方案之腦裂問題探討

相關文章
相關標籤/搜索