拔心跳線,兩節點反覆重啟
兩台伺服器,redhat cluster集群,oracle資料庫。伺服器是DELL,、
fence設備:DRAC
心跳線是一根網線直連的。
問題:拔掉心跳線,伺服器A自動關機,伺服器B自動重啟。
B啟動到fence時,就會自動將A機器觸發啟動。B繼續啟動並進入系統啟動數據資料庫正常。
但A緊接著,也進入系統,並直接將B伺服器重啟掉,自己接過資源和服務。
如此反覆,兩節點之間一直在反覆重啟。不過高手是否見過類似情況。謝謝
網路上也看到一篇類似的情況文章。不過他解決了,我一樣的設置(oracle腳本不一樣),附件為自己用的腳本文件。卻始終沒辦法解決。
附網上文章
樓主發表於:2009-03-11 23:35:05大概內容參照文檔 史應生版的
但是幾個內容需要注意
一是搞清楚 redhat群集裡面包含的network種類和作用
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||、
public interface (公網ip,浮動ip飄在上面)
private interface(心跳線) 群集通過私網心跳線在兩台主機間確定對方是否還活著。
fence network(所謂的籬笆網路)
這個fence network可以建立在 private interface 上,又可以加在public interface上,當群集發現狀態不對時,會通過fence network做重啟機器的工作。
注意了,群集怎麼才能根據(你的)配置來認為某個網路是心跳網路,或者是public網路呢。
我之前沒弄懂就吃過這個虧。
原來,需要在/etc/hosts裡面定義,
比如我的hosts表如下:
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
#172.16.100.5 linux-2
#172.16.100.3 linux-1
13.13.13.3 linux-1
13.13.13.4 linux-2
172.16.100.2 linux-fd
192.168.10.10 BACKUPSERVER
從上面定義的hosts表,群集就會這樣認為:
13.13.13.3就是主機名為linux-1的私網心跳IP,
13.13.13.4就是主機名為linux-2的私網心跳IP.
注意了,如果私網心跳斷掉的話,群集的兩台機器都會認為對方掛掉了。
(因為群集是通過心跳來了解對方信息的)
如果此時fence走的不是心跳(走的是public)
而且正常工作的話,
兩台機器會不斷地重啟。
這是因為一邊認為對方不正常了,一起來就通過fence把對方幹掉,
而另一邊也不甘示弱。
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||、
關於伺服器的腳本,
群集服務的腳本要符合linux腳本規範,
具體的說,是一定要實現三個功能:
start,stop,status
那我的腳本舉例來說:
群集是在兩台伺服器之間管理oracle10g的服務,
1.這個腳本能啟動群集服務,(對應我的群集就是能啟動oracle服務及oracle Listener)。
2.能夠關閉群集服務。
3.能夠查看群集服務狀態。
注意:
這個status很重要,它在群集服務不正常的時候應該是 exit 1,
正常的時候應該是 exit 0。
群集會定時的執行status腳本來查看服務的運行狀態,以此來確定群集本身的狀態。
晒晒我的oracle10g 腳本
#!/bin/bash
# /etc/rc.d/init.d/oracle10g
# chkconfig: 2345 02 98
# description: oracle10g is meant to run under Linux Oracle Server
# Source function library.
/etc/rc.d/init.d/functions
PATH=/usr/local/sbin:$PATH
ORACLE_HOME=/u01/app/oracle
ORACLE_NAME=oracle
RETVAL=0
#Start the oracle Server
#The following command assumes that the oracle login will not prompt the password
start() {
echo -n "Starting Oracle10G Server:"
su - $ORACLE_NAME -c '$ORACLE_HOME/bin/lsnrctl start'
su - oracle -c ". /u01/cluster/script/oracle_start" >>/u01/cluster/script/oracle_start.log
echo
}
stop() {
echo -n "Shutting down Oracle9iR2 Server:"
su - $ORACLE_NAME -c '$ORACLE_HOME/bin/lsnrctl stop'
su - oracle -c "/u01/cluster/script/oracle_stop" >>/u01/cluster/script/oracle_stop.log
echo
}
restart() {
echo -n "Restart Oracle10G Server"
stop
start
echo
}
case "$1" in
start)
start
;;
stop)
stop
exit 0
;;
status)
ps -ef |grep -v grep |grep -q ora_smon
if [ $? = 0 ]
then
echo "oracle is running"
exit 0
fi
echo "oracle is not running"
exit 1
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|reload|restart|status}"
exit 1
;;
esac
exit 0
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
關於fence設備和群集切換試驗
當初最不懂的就是fence這一塊,這個項目做了之後,對它理解也就比較清晰了,
說白了fence就是用來互相重啟的。因為群集的一個節點接管資源的時候,
如果不知道對方的狀態,或發現對方的狀態異常,就可以通過這個fence來幹掉對方,
防止兩邊都掛上磁碟陣列,並同時對盤陣讀寫的情況出現。
所以做為fence設備,一定要有這個能力,就是遠程接受重啟主機的命令,並幹掉主機(POWER RESTART)
一般能做fence的設備有兩類,
一種是外置的,比如 一些交換機,電源控制器等等
一種是內置的,比如我這個項目用到的HP IlO
fence的支持列表可以在紅帽的官方文檔裡面查到(我的資源里可以下載相關文檔)
我做群集的切換測試的時候,
一旦拔掉心跳線(我做的是直連的),兩邊就都被對方幹掉了。
因為fence走的是public,沒有被影響,
但是心跳線掉了,於是兩個節點間就不斷的互相PK。
如果做的是外置fence就不會有這個問題了。
或者按照redhat工程師的建議,還是走內置fence,但是還要添加一個vote盤,用於投票決定哪台機器真正有問題,然後讓fence老大把有問題的幹掉。(文檔裡面有,但我沒有做這個了)
我的群集切換測試實現了這個功能,
就是一旦一邊的oracle服務不正常了,
另一邊會接管它。
這個需要在配置群集時,群集模式上選擇 relocate才行(不能是默認的 restart)。
《解決方案》
原帖由 hgk117 於 2009-9-17 11:13 發表 http://linux.chinaunix.net/bbs/images/common/back.gif
謝謝樓上的回答,你是說心跳也要用兩根網路線連到交換機上就可以了?
奇怪,為怎麼會這樣?
很簡單,假如說你就有兩條線,一條心跳,一條fence,如果拔掉一台機器的心跳,實際上兩邊都會去fence對方,但是只有心跳沒有斷的那台能夠把心跳的動作發出去。
這樣哪台心跳被斷,哪台就會被對方重啟。而被重啟的機器如果心跳不連上,將無法再次加入到集群中。
所以你們所謂的拔線測試,看到的效果應該是,拔了心跳,fence了,接上,看能否再加入集群;你如果拔了老不接上,可不是互相fence?!
《解決方案》
恭喜LZ。這種情況正常。因為你心跳線是直連的,但反覆重啟至少證明你fence沒有問題。
你要不想這種情況出現,那麼心跳、服務和fence都接到交換機上去。
《解決方案》
謝謝樓上的回答,你是說心跳也要用兩根網路線連到交換機上就可以了?
奇怪,為怎麼會這樣?
《解決方案》
原帖由 jerrywjl 於 2009-9-17 11:41 發表 http://linux.chinaunix.net/bbs/images/common/back.gif
很簡單,假如說你就有兩條線,一條心跳,一條fence,如果拔掉一台機器的心跳,實際上兩邊都會去fence對方,但是只有心跳沒有斷的那台能夠把心跳的動作發出去。
這樣哪台心跳被斷,哪台就會被對方重啟。而 ...
非常感謝樓上的。再請教高手一下,拔心跳線后,兩機的心跳網卡都link down了,按上面的說法,這會兒應該是兩機都不能加入到集群裡面了,但是,事實上是,重啟好的那一台會獲取磁櫃資源,並啟動了oracle服務啊。
還有,第一次測試,撥心跳的時候,為什麼一台的會關機,而另一台是重啟?謝謝!!
《解決方案》
原帖由 hgk117 於 2009-9-17 13:04 發表 http://linux.chinaunix.net/bbs/images/common/back.gif
非常感謝樓上的。再請教高手一下,拔心跳線后,兩機的心跳網卡都link down了,按上面的說法,這會兒應該是兩機都不能加入到集群裡面了,但是,事實上是,重啟好的那一台會獲取磁櫃資源,並啟動了oracle服 ...
如果心跳斷開,兩台機器會同時fence對方,不過總會有點時間上的差異,那麼成功幹掉對方的那台會以單節點的形式維護原來的集群,而不是你想象的兩台機器都不能加入集群。
對於你第一次測試的問題,確認兩台機器的acpid服務關閉。
《解決方案》
回復 #6 jerrywjl 的帖子
acpid 0:off 1:off 2:off 3:on 4:on 5:on 6:off
謝謝樓上的高手,確實是開著的。
還有,fence設備的IP是否需要跟心跳的IP處於同一個網段呢?還是要跟服務IP同一個網段的?謝謝
[ 本帖最後由 hgk117 於 2009-9-17 17:13 編輯 ]