Heartbeat實現集群高可用熱備
Heartbeat 項目是 Linux-HA 工程的一個組成部分,它實現了一個高可用集群系統。通過Heartbeat我們可以實現雙機熱備,以實現服務的持續性。
heartbeat (Linux-HA)的工作原理:heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗 余鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未受到對方發送的報文,那么就認為對方失效,這時需啟動資源接管模塊來接管運 行在對方主機上的資源或者服務。
在 CentOS 中包含了該組件,可以直接Yum 進行安裝,這里就不在贅述,本文意提供的是用編譯安裝方式安裝heartbeat的步驟和配置項,以供參考。
安裝Heartbeat對硬件沒什么特別要求,主機間通信方式可以選擇網絡或者串口方式實現,如果選擇通過網絡鏈路來通信的就需要每個主機裝有兩張網卡。
本文選擇安裝的heartbeat版本為Heartbeat 3,Heartbeat 3與 2.x的最大差別在于,3 按模塊把的原來2.x 拆分為多個子項目,并且提供了一個cluster-glue的組件,專用于Local ResourceManager 的管理。即heartbeat + cluster-glue + resouce-agent 三部分。
1、安裝依賴包
Heartbeat 所需的依賴包包括了:gcc gcc-c++ autoconf automake libnet libtool glib2-devel libxml2-devel bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel make wget docbook-dtds docbook-style-xsl
在centos下可以通過yum快速安裝
yum install -y gcc gcc-c++ autoconf automake libnet libtool glib2-devel libxml2-devel bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel make wget docbook-dtds docbook-style-xsl
2. 添加組和用戶
groupadd haclient useradd -g haclient hacluster -M -s /sbin/nologin
3. 安裝Cluster-Glue
Cluster-Glue是一個heartbeat的組件,相當于一個中間層,可以將heartbeat和crm(pacemaker)聯系起來,它主要包含2個部分,LRM和STONITH;
安裝地址:http://hg.linux-ha.org/glue/archive/glue-1.0.9.tar.bz2
//下載解壓后 ./autogen.sh ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1' make && make install
- 32位環境需要將配置參數中的lib64 更改為 lib
- 安裝過程中會從 sourceforge 下載一些文件,確保sourceforge可以正常訪問
4. 安裝Resource Agents
就是各種的資源的ocf腳本,這些腳本將被LRM調用從而實現各種資源啟動、停止、監控等等
安裝地址:https://github.com/ClusterLabs/resource-agents/tarball/v3.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/ //建立一個軟連接,避免編譯時找不到所需要的包 make && make install
- 32位環境需要將配置參數中的lib64 更改為 lib
5.安裝Heartbeat
安裝地址:http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/7e3a82377fa8.tar.bz2//下載解壓后 ./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刪除 // define HA_HBCONF_DIR "/usr/local/heartbeat/etc/ha.d/" :wq保存完成. 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 /usr/lib/ocf
系統服務可以通過 service heartbeat start/stop 來啟動停止,但啟動之前先要進行一些配置
6. 進行配置(只簡單說明下提供參考)
-
主機名:可以通過uname -n命令查看當前主機名 假設現在兩個主機分別為node1和node2
-
設置主機ip:
-
node1:
- eth0:192.168.1.101(對外ip)
- eth1:10.10.10.1(心跳ip)
-
node2
- eth0:192.168.1.102(對外ip)
- eth1:10.10.10.2(心跳ip)
-
虛擬ip:192.168.103
-
- 編輯Heartbeat 檢測參數配置文件,以下文件作為參考
vi /etc/heartbeat/ha.d/ha.cf
下面是針對node1的配置,node2類似配置即可
# ====配置文件內容開始==== debugfile /var/log/ha-debug # 用于記錄heartbeat的調試信息 logfile /var/log/ha-log # 用于記錄heartbeat的日志信息 logfacility local0 #用于log記錄的記錄 keepalive 2 # 設置心跳間隔 deadtime 30 # 在30秒后宣布節點死亡 warntime 10 # 在日志中發出“late heartbeat“警告之前等待的時間,單位為秒 initdead 120 # 網絡啟動時間 udpport 694 # 廣播/單播通訊使用的udp端口 #baud 19200 #serial /dev/ttyS0 # 使用串口heartbeat bcast eth1 # 使用網卡eth1廣播發送心跳檢測,也可以以多播(mcast)和單薄方式(ucast)發送心跳檢查 auto_failback on # 當主節點從故障中恢復時,將自動切換到主節點 watchdog /dev/watchdog # 該指令是用于設置看門狗定時器,如果節點一分鐘內都沒有心跳,那么節點將重新啟動 node node1 node node2 # 集群中機器的主機名,與“uname –n”的輸出相同。 ping 10.10.10.2 # ping 網關或路由器來檢測鏈路正常,這里設置node2的心跳檢測地址 respawn hacluster /usr/local/heartbeat/lib64/heartbeat/ipfail # respawn調用 ipfail 來主動進行切換 apiauth ipfail gid=haclient uid=hacluster # 設置啟動ipfail的用戶和組 # ====文件配置內容結束======
- 編輯資源文件
vi /etc/heartbeat/ha.d/haresources
HA-01 192.168.0.1 mysqld #機器名 虛擬服務器IP 系統服務*在啟動的時候,節點node1啟用192.168.1.101 的虛擬IP地址,對外提供服務,同時也啟動 mysqld 服務,當關閉的時候, heartbeat停止mysqld 服務,然后取消ip地址. 這里的主機用是用命令 uname -n 獲取到的一致,資源文件支持很多種配置方法,請參考其它說明文
- 配置驗證密鑰
vi /etc/heartbeat/ha.d/authkeys
auth 1 //認證序號1 1 crc //序號1 crc*規則說明 auth 后面填寫序號,可任意填寫,但第二行開頭必須為序號名,然后為驗證方式,支持三種( crc md5 sha1 )方式驗證,最后面是自定義密鑰
chmod 600 /etc/heartbeat/ha.d/authkeys //文件權限更改為600以同樣方式配置了node2之后,就可以啟動heartbeat進入工作了
正常工作時,使用 ifconfig 查看網絡連接信息,可看到Heartbeat 在 eth0 接口上新添加了一個虛擬IP地址
[root@node1 opt]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:EB:E3:5E inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:feeb:e35e/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:21944 errors:0 dropped:0 overruns:0 frame:0 TX packets:8325 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2564223 (2.4 MiB) TX bytes:1670947 (1.5 MiB) eth0:1 Link encap:Ethernet HWaddr 00:0C:29:EB:E3:5E inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) eth1 Link encap:Ethernet HWaddr B8:AC:6F:38:13:E5 inet addr:10.10.10.1 Bcast:10.10.10.255 Mask:255.255.255.0 inet6 addr: fe80::baac:6fff:fe38:13e5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:60926 errors:0 dropped:0 overruns:0 frame:0 TX packets:92730 errors:2 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:8333807 (7.9 MiB) TX bytes:15275228 (14.5 MiB) Interrupt:16
當節點出現故障時,本機會嘗試關閉服務和虛擬IP, 同時另一臺機器檢測到故障會添加相同的虛擬IP地址,來對外提供服務,實現業務的不中斷,