本文目錄:1.簡介2.符合LSB規範的腳本3.OCF資源代理 1.簡介 heartbeat和pacemaker都支持三種資源代理:傳統的haresources腳本(/etc/ha.d/resource.d)、符合LSB規範的腳本(/etc/init.d)以及OCF腳本(/usr/lib/ocf/re ...
本文目錄:
1.簡介
2.符合LSB規範的腳本
3.OCF資源代理
1.簡介
heartbeat和pacemaker都支持三種資源代理:傳統的haresources腳本(/etc/ha.d/resource.d)、符合LSB規範的腳本(/etc/init.d)以及OCF腳本(/usr/lib/ocf/resource.d/heartbeat)。其中傳統的haresources腳本是基於LSB腳本的,和LSB只有少許區別。
傳統的資源代理適合於沒有啟用pacemaker的heartbeat,也適合於設置了class=heartbeat
的Pacemaker。pacemaker中,建議優先使用OCF類的資源代理,如果沒有則應該使用LSB資源代理。
無論是heartbeat還是pacemaker,對於傳統的資源代理腳本和LSB腳本都只會執行start/stop/status三個操作:
1.start操作
啟動資源。在已啟動的資源下再次啟動時,不允許返回任何錯誤代碼(非0)。只有當前機器會啟動自身的資源,且只有在status顯示未運行時才會啟動。
2.stop操作
停止資源。必須要保證在已停止的資源上再次停止時不會出現錯誤,狀態碼也必須為0,否則集群會不斷停止資源,最後重啟操作系統。但是很多不符合LSB規範的腳本都會在已停止的狀態下不允許再次停止。規範的LSB腳本是無所謂多次停止的,無論是start/stop/status都具有"冪等性"。
3.status操作
判斷資源是否正在運行。
status操作必須能夠正確地報告資源狀態,在已運行的情況下必須輸出"OK"或"running"關鍵字,且在未運行的情況下必須不能輸出"OK"和"running"關鍵字。對於status操作,集群不關心它的退出狀態碼。
這聽起來很不可思議,這是因為古老的linux發行版中的init腳本給出的退出狀態碼不可靠,而是信任"OK"或"running"關鍵字。
heartbeat在很多情況下都會調用status操作,比如在start資源前會執行status,在釋放資源前也會執行status(也就是說先status,再stop,因為heartbeat不知道資源是否正處於running狀態)。
在重覆多次stop失敗後,heartbeat也會執行一次status。如果status報告該資源仍在運行,heartbeat將會重啟操作系統以保證資源能徹底停止。註意,該行為只在基於haresources的集群中才會執行,在CRM/Pacemaker集群中使用的是stomith。
2.符合LSB規範的腳本
LSB資源代理一般是在/etc/init.d目錄下的,它們由OS或者軟體自身提供。如果要結合heartbeat或者packmaker,這些LSB腳本必須符合LSB規範。
雖然許多LSB的提供者都聲稱它們提供的LSB腳本是符合LSB規範的,但實際上卻並非如此,常見的問題有:
- 沒有輸出status的操作。
- start/stop/status操作沒有分配符合規範的退出狀態碼。
- start的時候會返回錯誤信息。(這嚴重違反LSB規範)
- stop的時候會返回錯誤信息。(這嚴重違反LSB規範)
註意,合格的LSB資源代理是無法對其傳遞參數的(heartbeat或pacemaker會自動處理start/stop/status/restart等操作)。
要檢查一個LSB腳本是否符合LSB規範,可以使用下麵的步驟來檢查:
- 在stop的狀態下檢查start操作:
/etc/init.d/SCRIPT start; echo $?
- 服務是否啟動成功?
- 上面的命令列印結果是否為"0"?
- 在已運行的情況下檢查status操作:
/etc/init.d/SCRIPT status; echo $?
- 是否接受status操作?
- status的結果是否意味著服務已經運行?
- 列印結果是否為"0"?
- 在已運行的情況下再次start:
/etc/init.d/SCRIPT start; echo $?
- 服務是否仍然運行?
- 列印結果是否為0?
- 在已運行的情況下檢查stop操作:
/etc/init.d/SCRIPT stop; echo $?
- 服務是否停止?
- 列印結果是否為0?
- 在已停止的情況下檢查status操作:
/etc/init.d/SCRIPT status; echo $?
- 是否接受status操作?
- status的結果是否意味著服務不在運行?
- 列印結果是否為"3"?
- 在已停止的情況下再次stop:
/etc/init.d/SCRIPT stop; echo $?
- 服務是否仍然停止?
- 列印結果是否為0?
也就是說,一個符合規範的LSB腳本,接受start/stop/status,且它們的執行結果具有"冪等性",運行狀態下再次運行不會有任何區別,停止狀態下繼續停止不會有任何區別。且在停止狀態下檢查status時,退出狀態碼為3而不是0。
3.OCF資源代理
OCF腳本寫法詳細手冊:http://www.linux-ha.org/doc/dev-guides/ra-dev-guide.html
OCF類的資源代理是在LSB的基礎上進行擴展的腳本,它在/usr/lib/ocf/resource.d/heartbeat中。如果你自己定義ocf資源腳本,可以在resoruce.d目錄下創建你自己的目錄,再將ocf腳本放進去。例如,你寫的ocf腳本名為myocf,你想放的目錄是abc,那麼資源的路徑是/usr/lib/ocf/resource.d/abc/myocf
。
OCF支持傳遞參數。要傳遞參數,需要藉助OCF_RESKEY_
開頭的環境變數。例如,要傳遞IP參數,可以將其定義在OCF_RESKEY_ip
環境變數上。
OCF資源代理必須具備以下幾種操作:
- start:啟動資源,且啟動成功的退出狀態碼為0,啟動失敗的狀態碼不為7(可以為任何非0和7的值)。
- stop:停止資源,且停止成功的退出狀態碼為0,退出失敗的狀態碼不為7。
- monitor:監控資源的健康狀況,相當於status。如果資源正在運行,退出狀態碼0,如果已停止,退出狀態碼為7,如果錯誤,狀態碼可為任何值。
- meta-data:使用XML格式提供資源的信息。退出狀態碼為0。
- validate-all:驗證配置參數。如果參數有效,則退出狀態碼為0,無效則為2,如果資源未配置則退出碼為6,找不到要運行的資源代理時推出狀態碼為5。
此外,如果pacemaker要實現cloned和multi-state資源的功能,則還需要求:
- promote:資源升級,將本地資源升級為master狀態,退出狀態碼為0。
- demote:資源降級,將本地資源降級為slave狀態,退出狀態碼為0。
- notify:集群用它來發送通知事件,告訴資源發生了什麼事。退出狀態碼必須為0。
回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/8724402.html
註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!