HA(High Availability)高可用,有如下三種工作模式。
(1)主從方式 (非對稱方式)
工作原理:主機工作,備機處於監控准備狀況;當主機宕機時,備機接管主機的一切工作,待主機恢復正常後,按使用者的設定以自動或手動方式將服務切換到主機上運行,數據的一致性通過共享存儲系統解決。
(2)雙機雙工方式(互備互援)
工作原理:兩台主機同時運行各自的服務工作且相互監測情況,當任一台主機宕機時,另一台主機立即接管它的一切工作,保證工作實時,應用服務系統的關鍵數據存放在共享存儲系統中。
(3)集群工作方式(多服務器互備方式)
工作原理:多台主機一起工作,各自運行一個或幾個服務,各為服務定義一個或多個備用主機,當某個主機故障時,運行在其上的服務就可以被其它主機接管。
Linux下有不少工具可以提供高可用的功能,如vrrp,heartbeat。
vrrp主機會定期廣播自己依然活著“我是master,我還活著,平安無事”,而當備機接受不到“平安無事”的時候,會接管主機的ip地址,也就接管了主機提供的服務,然後開始喊“我成主機了,我活著,平安無事”
heartbeat不使用廣播而使用心跳,也就是在高可用服務器之間建立監控關系,避免了廣播對網絡的負擔,功能也上更為強大,在接管ip的同時,還可以執行腳本。
vrrp使用雙機雙工方式,但有些應用場景中並不適用,如mysql的高可用就不能使用vrrp。HA的三種模式中都有“共享存儲“目的是解決數據一致性的問題,mysql的數據文件即data目錄如果建立在nfs服務上,啟動慢不說,備機即便能起來也是不能使用的,一段時間以後備機上的mysql服務會自動結束。由於服務器不是那麼容易死掉的(在測試的時候為了簡單,一般是讓機器死掉),更多的時候是應用死掉。所以才有heartbeat+DRBD+MYSQL的組合,利用的就是heartbeat的腳本執行功能(檢測、資源回收)。
我們在這裡用shell腳本實現vrrp的主從方式 (非對稱方式)功能。環境如下:
web(主) 192.168.1.1 http服務
web(備) 192.168.1.2 http服務
實現思路:首先是狀態監控,既然是http服務,我們就監控httpd的狀態,使用curl -w %{http_code}獲得。 備機上運行腳本,當curl獲得的狀態碼不為200時,即主機已經死掉,我們就讓備機接管主機ip。並使用arping命令更新局域網對主機ip的mac記錄。
# /bin/bash
while true do
code=`curl -o /dev/null -w %{http_code} http://192.168.1.1/ 2>/dev/null`
if ! [ $code -eq 200 ];then
ifconfig eth0 192.168.1.1
arping -A -c 1 -I eth0 192.168.1.1
kill -9 $$ #IP已經切換,腳本已經沒有繼續運行的必要,把自己殺掉。
fi
sleep 5
done
heartbeat實現:
主機運行:
#! /bin/bash
while true do
code=`curl -o /dev/null -w %{http_code} http://192.168.1.1/ 2>/dev/null`
if ! [ $code -eq 200 ];then
/etc/init.d/httpd stop
ifconfig eth0 down
kill -9 $$ #IP已經切換,腳本已經沒有繼續運行的必要,把自己殺掉。
fi
sleep 5
done
備機運行:
#! /bin/bash
while true do
ping -c1 192.168.1.1 &>/dev/null
if ! [ $? -eq 0 ];then
/etc/init.d/httpd start
ifconfig eth0 192.168.1.1
arping -A -c 1 -I eth0 192.168.1.1
kill -9 $$ #IP已經切換,腳本已經沒有繼續運行的必要,把自己殺掉。
fi
sleep 5
done
本文主要是介紹高可用的模式及實現原理。該腳本只是模擬vrrp、heartbeat的部分功能,有一些假設的前提條件,目的是為了讓大家了解其工作原理,不像之前的事例可以用在生產環境。歡迎批評指教。希望對大家理解高可用有所幫助,更希望大家可以完善這個腳本,提出更好的解決方案,多說一句,腳本不是萬能的,但沒有腳本是萬萬不能的。
本文出自 “林肯” 博客,請務必保留此出處http://president.blog.51cto.com/4990508/860765