王 健,王啟明
(中國(guó)鐵路北京局集團(tuán)有限公司 信息技術(shù)所,北京 100860)
Oracle RAC在業(yè)界以高并行性和高可用性著稱,其優(yōu)勢(shì)在于使用多個(gè)節(jié)點(diǎn)(數(shù)據(jù)庫(kù)實(shí)例)構(gòu)成一個(gè)數(shù)據(jù)庫(kù)[1],在保證數(shù)據(jù)庫(kù)高可用性的前提下更加充分的利用了多臺(tái)主機(jī)的性能,RAC還可以通過(guò)增加集群節(jié)點(diǎn)進(jìn)行性能擴(kuò)展,為需要重新規(guī)劃的應(yīng)用提供了易伸縮性,以滿足系統(tǒng)自身的調(diào)整。
在國(guó)內(nèi)數(shù)據(jù)庫(kù)市場(chǎng),企業(yè)對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的穩(wěn)定性和高可用性的要求越來(lái)越高,大部分企業(yè)選擇Oracle RAC作為核心數(shù)據(jù)庫(kù)[2],但在實(shí)際運(yùn)維中會(huì)遇到服務(wù)器、操作系統(tǒng)、存儲(chǔ)等軟硬件設(shè)備故障導(dǎo)致RAC集群節(jié)點(diǎn)損壞的問(wèn)題,此時(shí)集群的優(yōu)勢(shì)即會(huì)折損,后臺(tái)數(shù)據(jù)庫(kù)系統(tǒng)是否具有高可用性,能否保障關(guān)鍵數(shù)據(jù)的完整性和核心業(yè)務(wù)的連續(xù)性,成為影響大局的關(guān)鍵因素,而目前Oracle相關(guān)資料文獻(xiàn)少有涉及RAC集群節(jié)點(diǎn)損壞恢復(fù)的完整方案,本文從實(shí)際案例出發(fā),針對(duì)初次采用的Windows平臺(tái)下Oracle12C RAC集群架構(gòu),介紹了本單位RAC節(jié)點(diǎn)損壞后,進(jìn)行在線恢復(fù)的詳細(xì)過(guò)程以及相關(guān)bug的解決辦法,為后續(xù)數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行維護(hù)積累了實(shí)用且寶貴的經(jīng)驗(yàn)。
Oracle RAC (Oracle Real Application Clusters)是Oracle新數(shù)據(jù)庫(kù)版本中采用的一項(xiàng)新技術(shù),也是Oracle支持網(wǎng)格計(jì)算環(huán)境的核心技術(shù),解決了傳統(tǒng)數(shù)據(jù)庫(kù)應(yīng)用中的高可用性問(wèn)題[3]。
Oracle RAC工作原理是指在一個(gè)應(yīng)用環(huán)境當(dāng)中,所有的服務(wù)器管理和使用同一個(gè)數(shù)據(jù)庫(kù),目的是為了分散每臺(tái)服務(wù)器的工作量,硬件設(shè)備至少需要兩臺(tái)及以上的服務(wù)器,并且還需要一臺(tái)共享存儲(chǔ)設(shè)備[4]。同時(shí)需要的軟件有兩類:集群軟件和Oracle數(shù)據(jù)庫(kù)中的RAC組件。所有服務(wù)器上的OS都應(yīng)該保持版本一致,當(dāng)某客戶端發(fā)送請(qǐng)求到某臺(tái)服務(wù)器的listener后,此服務(wù)器根據(jù)負(fù)載均衡配置策略,會(huì)把請(qǐng)求發(fā)送到本機(jī)的RAC組件處理也可能會(huì)發(fā)送到另外一臺(tái)服務(wù)器的RAC組件,請(qǐng)求處理完成后,RAC會(huì)通過(guò)集群軟件訪問(wèn)共享存儲(chǔ)設(shè)備。從邏輯結(jié)構(gòu)上看,每一個(gè)集群節(jié)點(diǎn)都有一個(gè)獨(dú)立的實(shí)例,這些實(shí)例訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù),節(jié)點(diǎn)間通過(guò)集群軟件的通訊層來(lái)進(jìn)行通訊。同時(shí),為了減少I(mǎi)/O的消耗,采用了Cache Fusion[5]緩存融合技術(shù),因此每一個(gè)數(shù)據(jù)庫(kù)的實(shí)例,都保存了一份相同的數(shù)據(jù)庫(kù)Cache,Oracle RAC結(jié)構(gòu)如圖1所示。
圖1 Oracle RAC工作結(jié)構(gòu)圖
不同的集群產(chǎn)品都有各自的特點(diǎn),RAC的特點(diǎn)包括:
(1)雙機(jī)并行。RAC是并行模式,不是傳統(tǒng)的主備模式。就是說(shuō),RAC集群的全部成員都能同時(shí)接收客戶端的請(qǐng)求。
(2)高可用性。RAC是Oracle產(chǎn)品的高可用性解決方案,集群中只要還有一個(gè)節(jié)點(diǎn)存活,就能保證正常對(duì)外提供服務(wù)。
(3)易伸縮性。RAC能動(dòng)態(tài)添加、刪除節(jié)點(diǎn),來(lái)滿足系統(tǒng)自身的調(diào)整。
(4)低成本。能使用相對(duì)廉價(jià)的服務(wù)器來(lái)實(shí)現(xiàn)高吞吐量、高可用性的集群環(huán)境,這比對(duì)高端服務(wù)器增加硬件來(lái)實(shí)現(xiàn)高吞吐量、高可用性花費(fèi)的成本低很多。
(5)高吞吐量。隨著集群節(jié)點(diǎn)數(shù)量的增加,整個(gè)RAC的吞吐量也會(huì)不斷增長(zhǎng)[6]。
傳統(tǒng)數(shù)據(jù)中心核心業(yè)務(wù)和關(guān)鍵業(yè)務(wù)的計(jì)算及存儲(chǔ)主要都由RISC小型機(jī)完成,伴隨著X86處理器可靠性及性能的提升,這些業(yè)務(wù)正在逐步遷移到X86平臺(tái)[7]。2016年,本單位投產(chǎn)的貨運(yùn)系統(tǒng),后臺(tái)數(shù)據(jù)庫(kù)環(huán)境整體都采用X86硬件架構(gòu),數(shù)據(jù)庫(kù)操作系統(tǒng)為Windows Server 2012,為了保障系統(tǒng)的高可用性和業(yè)務(wù)并行處理能力,搭建了4節(jié)點(diǎn)Oracle12C RAC集群,配置信息如表1所示。
如表1所示的多點(diǎn)數(shù)據(jù)庫(kù)集群模式運(yùn)行狀態(tài)穩(wěn)定,能夠有效解決高并發(fā)訪問(wèn)情況下的單點(diǎn)瓶頸問(wèn)題[8], 但是在勒索病毒爆發(fā)后,為計(jì)算機(jī)安裝最新的安全補(bǔ)丁,修復(fù)“永恒之藍(lán)”攻擊漏洞的過(guò)程中,節(jié)點(diǎn)2在打完補(bǔ)丁重啟后未能正常引導(dǎo)進(jìn)入操作系統(tǒng),最終節(jié)點(diǎn)系統(tǒng)崩潰,導(dǎo)致集群變?yōu)?節(jié)點(diǎn)運(yùn)行,運(yùn)行架構(gòu)如圖2所示。
表1 Oracle RAC配置信息
圖2 Oracle RAC運(yùn)行架構(gòu)
雖然一個(gè)節(jié)點(diǎn)的損壞不會(huì)影響整體業(yè)務(wù)的正常運(yùn)行,但是為計(jì)算機(jī)安裝安全補(bǔ)丁是一件常態(tài)化的工作,甚至計(jì)算機(jī)本地磁盤(pán)組損壞都是系統(tǒng)運(yùn)維中會(huì)遇到的問(wèn)題,因此,不能讓集群節(jié)點(diǎn)一味被動(dòng)的削減,我們需要重新配置Oracle集群信息,在保證業(yè)務(wù)正常運(yùn)行的前提下,在線修復(fù)損壞節(jié)點(diǎn),恢復(fù)RAC集群原有結(jié)構(gòu),保證核心系統(tǒng)的高可用性。
雖然Oracle RAC為需要重新規(guī)劃的應(yīng)用提供了易伸縮性,可以動(dòng)態(tài)地添加、刪除節(jié)點(diǎn),以滿足系統(tǒng)自身的調(diào)整規(guī)劃,但目前Windows Server 2012+Oracle 12C RAC實(shí)施案例較少,通過(guò)查閱Oracle官方技術(shù)支持站點(diǎn)獲取幫助資料,參考以往Unix、Linux平臺(tái)Oracle 11g R2 RAC添加、刪除節(jié)點(diǎn)實(shí)施案例,借鑒其中的關(guān)鍵技術(shù)及成功經(jīng)驗(yàn),進(jìn)而實(shí)現(xiàn)以下目標(biāo):
(1)能夠在不停集群即保證現(xiàn)場(chǎng)貨運(yùn)業(yè)務(wù)連續(xù)性的情況下,獲得水平的擴(kuò)展,要在保留節(jié)點(diǎn)刪除之前損壞的數(shù)據(jù)庫(kù)實(shí)例,在集群中刪除故障節(jié)點(diǎn)的信息后,在線新增節(jié)點(diǎn),恢復(fù)集群原有架構(gòu)。
(2)對(duì)整個(gè)實(shí)施過(guò)程以及在過(guò)程中遇到的各類問(wèn)題認(rèn)真總結(jié),為X86架構(gòu)Windows平臺(tái)下Oracle RAC集群運(yùn)維積累經(jīng)驗(yàn),提高數(shù)據(jù)庫(kù)系統(tǒng)管理水平,確保核心系統(tǒng)運(yùn)行安全穩(wěn)定。
3.1.1 操作系統(tǒng)安裝
對(duì)損壞的集群節(jié)點(diǎn)2重新安裝操作系統(tǒng),要求與其他節(jié)點(diǎn)版本保持一致,更改主機(jī)名為tjhyrac2。
3.1.2 操作系統(tǒng)配置
(1)Host表修改
從保留節(jié)點(diǎn)的C:WindowsSystem32driversetchosts 復(fù)制到節(jié)點(diǎn)2相應(yīng)的目錄。
(2)網(wǎng)絡(luò)配置
配置公網(wǎng)和私網(wǎng)IP。設(shè)置節(jié)點(diǎn)2兩塊網(wǎng)卡的IP地址,分別命名為Pub和Priv并設(shè)置網(wǎng)卡優(yōu)先級(jí),將Pub網(wǎng)卡設(shè)置為優(yōu)先。
(3)服務(wù)配置
安裝相關(guān)服務(wù)、開(kāi)啟遠(yuǎn)程桌面訪問(wèn),將節(jié)點(diǎn)2上的Computer Browser設(shè)置為自動(dòng)和啟動(dòng)狀態(tài)。
(4)注冊(cè)表配置
(5)共享配置
在節(jié)點(diǎn)2服務(wù)器上,使用net use命令配置節(jié)點(diǎn)間通信[9]:
在其他各節(jié)點(diǎn)運(yùn)行:
(6)存儲(chǔ)配置
在磁盤(pán)管理中,各磁盤(pán)刪除磁盤(pán)號(hào),然后直接聯(lián)機(jī)。
3.1.3 數(shù)據(jù)備份
選擇現(xiàn)場(chǎng)應(yīng)用相對(duì)空閑時(shí)段進(jìn)行節(jié)點(diǎn)恢復(fù),恢復(fù)前可使用常用的3種備份方法:RMAN備份、邏輯備份和冷備份[10],或?qū)?shù)據(jù)庫(kù)遷移至第三方環(huán)境。
RAC集群中節(jié)點(diǎn)2系統(tǒng)出現(xiàn)故障,需要?jiǎng)h除節(jié)點(diǎn)2信息,添加新節(jié)點(diǎn)。
3.2.1 刪除節(jié)點(diǎn)
(1)節(jié)點(diǎn)確認(rèn)
登錄任一節(jié)點(diǎn),執(zhí)行:
在保留節(jié)點(diǎn)查看節(jié)點(diǎn)信息是否為unpin狀態(tài),如果不是使用下面命令,將節(jié)點(diǎn)設(shè)置為unpin狀態(tài)。
crsctl unpin css -n(節(jié)點(diǎn)主機(jī)名)
(2)刪除故障節(jié)點(diǎn)實(shí)例
在保留節(jié)點(diǎn)使用Oracle用戶通過(guò)dbca刪除故障節(jié)點(diǎn)實(shí)例。
(3)更新集群列表
保留節(jié)點(diǎn)更新GRID_HOME集群列表,在保留的節(jié)點(diǎn)執(zhí)行:
更新ORACLE_HOME集群列表,在保留節(jié)點(diǎn)上執(zhí)行:
(4)刪除節(jié)點(diǎn)
在任一保留的節(jié)點(diǎn)上刪除tjhyrac2節(jié)點(diǎn),執(zhí)行以下操作:
(5)驗(yàn)證
驗(yàn)證tjhyrac2節(jié)點(diǎn)被刪除,在任一保留的節(jié)點(diǎn)上執(zhí)行操作:
(6)刪除VIP地址
刪除tjhyrac2節(jié)點(diǎn)VIP地址。通過(guò)命令crsctl status res -t檢查,如果VIP2還在,需要?jiǎng)h除VIP,命令如下:
3.2.2 添加節(jié)點(diǎn)
3.2.2.1 添加節(jié)點(diǎn)前檢驗(yàn)
在保留節(jié)點(diǎn)使用grid用戶進(jìn)行添加節(jié)點(diǎn)前檢驗(yàn)。
如果報(bào)錯(cuò):無(wú)法從節(jié)點(diǎn)XXX檢索exectask,請(qǐng)檢查共享。
如果無(wú)法共享,執(zhí)行:
3.2.2.2 加入集群
將新增節(jié)點(diǎn)加入集群,在D:>Grid_homeaddnode下執(zhí)行:
添加節(jié)點(diǎn)后遇到報(bào)錯(cuò):“INS-30132 RUNNING ADDNODE.BAT DUE TO CVU CHECKFRAMEWORKSETUP() API ERROR”,其原因是由于觸發(fā)BUG:24522899,導(dǎo)致無(wú)法添加節(jié)點(diǎn),具體解決辦法如下:
(1)修改相關(guān)文件
在執(zhí)行添加命令的節(jié)點(diǎn),修改$GRID_HOMEcvcvdataadmin.xml文件,將下面一段的內(nèi)容替換上面一段的內(nèi)容:
(2)刪除臨時(shí)文件
在需要添加的節(jié)點(diǎn)上,到%temp%目錄下刪除CVU_12.1.0.2.0_。
(3)替換文件cvu.jar
在以下路徑檢查cvu.jar文件的大小和時(shí)間是否相同。如果不同,在所有節(jié)點(diǎn)上復(fù)制和替換最新的文件cvu.jar到另外的目錄下。
(4)重新運(yùn)行addNode.bat
此時(shí)運(yùn)行會(huì)遇到the error:INS-40394,執(zhí)行如下步驟:
a.取消OUI Window;
b.在運(yùn)行addNode.bat的節(jié)點(diǎn)編輯HOSTS注釋本地主機(jī)的VIP地址和要添加的節(jié)點(diǎn)的VIP地址;
c.重新運(yùn)行addNode.bat;
d.添加完成后放開(kāi)本地主機(jī)的VIP地址和要添加節(jié)點(diǎn)的VIP地址的注釋。
e.按默認(rèn)執(zhí)行。添加節(jié)點(diǎn)過(guò)程如圖3所示。
圖3 Oracle12C添加節(jié)點(diǎn)過(guò)程圖
3.2.3 配置GRID
根據(jù)提示執(zhí)行操作,在新添加的節(jié)點(diǎn)上運(yùn)行如下命令:
D:appgrid12.1.0gridcrsconfig>gridconfig.bat執(zhí)行完成后,點(diǎn)擊確定。
3.2.4 安裝Oracle軟件
在節(jié)點(diǎn)1 Oracle軟件安裝路徑下進(jìn)入目錄addnode執(zhí)行:
addnode.bat "CLUSTER_NEW_NODES={tjhyrac2}"
按默認(rèn)執(zhí)行即可。
3.2.5 啟動(dòng)實(shí)例
如果添加節(jié)點(diǎn)的實(shí)例未啟動(dòng),可在任一節(jié)點(diǎn)手動(dòng)啟動(dòng)節(jié)點(diǎn)2的實(shí)例。
srvctl start instance -d oratjhy -n tjhyrac2。
3.2.6 創(chuàng)建初始化文件
如果發(fā)現(xiàn)所添加節(jié)點(diǎn)的初始化文件未創(chuàng)建,可手動(dòng)創(chuàng)建initoratjhy2.ora(根據(jù)該節(jié)點(diǎn)實(shí)際的實(shí)例名來(lái)定),并從節(jié)點(diǎn)1的初始化文件,復(fù)制如下內(nèi)容,添加到initoratjhy2.ora。
SPFILE='+DATA/oratjhy/spfileoratjhy.ora'
同理,配置監(jiān)聽(tīng)參數(shù)文件和數(shù)據(jù)庫(kù)口令文件。
3.2.7 創(chuàng)建OraMTS Service服務(wù)
在%ORACLE_HOME%in下執(zhí)行命令如下:oramtsctl.exe -new -host tjhyrac2至此,節(jié)點(diǎn)2恢復(fù)工作全部完成。
為了確保集群運(yùn)行安全穩(wěn)定,方案實(shí)施后,我們針對(duì)RAC的原理及特性,對(duì)刪除、添加節(jié)點(diǎn)后RAC的有效性進(jìn)行驗(yàn)證。
測(cè)試目的:驗(yàn)證Oracle RAC中的一個(gè)節(jié)點(diǎn)發(fā)生故障后,另一個(gè)節(jié)點(diǎn)能否自動(dòng)接管交易處理,以及故障恢復(fù)后節(jié)點(diǎn)處理能力能否恢復(fù)正常。
測(cè)試步驟:(1)利用客戶端連接節(jié)點(diǎn)2,執(zhí)行事先準(zhǔn)備好的SQL腳本,同時(shí)將節(jié)點(diǎn)2服務(wù)器重啟模擬節(jié)點(diǎn)故障;(2)繼續(xù)穩(wěn)定運(yùn)行10 min;(3)故障節(jié)點(diǎn)開(kāi)始恢復(fù),同時(shí)啟動(dòng)該節(jié)點(diǎn)上的Oracle 實(shí)例;(4)繼續(xù)穩(wěn)定運(yùn)行10 min。
測(cè)試結(jié)果:(1)步驟1后被測(cè)試數(shù)據(jù)庫(kù)RAC切換成功,切換過(guò)程中,交易響應(yīng)時(shí)間延長(zhǎng);(2)切換后VIP漂移到另一個(gè)實(shí)例,交易在1 min內(nèi)能夠恢復(fù)正常;(3)步驟3后故障節(jié)點(diǎn)恢復(fù)后,VIP重新漂回,受理交易恢復(fù)正常。
測(cè)試結(jié)果符合預(yù)期,測(cè)試結(jié)果通過(guò)。
測(cè)試目的:考察系統(tǒng)在一定并發(fā)下,手動(dòng)異常停止節(jié)點(diǎn)2數(shù)據(jù)庫(kù)實(shí)例后,另一個(gè)數(shù)據(jù)庫(kù)實(shí)例能否自動(dòng)接管交易處理,以及故障恢復(fù)后節(jié)點(diǎn)處理能力能否恢復(fù)正常。
測(cè)試步驟:(1)手動(dòng)(shutdown abort)停止節(jié)點(diǎn)2數(shù)據(jù)庫(kù)實(shí)例,場(chǎng)景持續(xù)運(yùn)行5 min;(2)啟動(dòng)停止的數(shù)據(jù)庫(kù)實(shí)例,場(chǎng)景持續(xù)運(yùn)行5 min。
測(cè)試結(jié)果:(1)手動(dòng)停止數(shù)據(jù)庫(kù)實(shí)例后,另一節(jié)點(diǎn)實(shí)例會(huì)很快(2 s內(nèi))接收請(qǐng)求(Failover機(jī)制生效);(2)步驟2重啟停止節(jié)點(diǎn)實(shí)例后,受理交易正常。
實(shí)際測(cè)試結(jié)果符合預(yù)期,測(cè)試結(jié)果通過(guò)。
測(cè)試目的:驗(yàn)證數(shù)據(jù)庫(kù)RAC中的心跳網(wǎng)絡(luò)異常后(主備網(wǎng)卡置down),另一節(jié)點(diǎn)能否自動(dòng)接管交易處理,故障恢復(fù)后節(jié)點(diǎn)處理能力能否恢復(fù)正常。
測(cè)試步驟:(1)將節(jié)點(diǎn)1的網(wǎng)卡置down,觀察交易處理、響應(yīng)時(shí)間及各主機(jī)資源情況,驗(yàn)證VIP是否可以正常切換;(2)恢復(fù)該節(jié)點(diǎn)心跳主備網(wǎng)卡,重啟CRS,交易穩(wěn)定運(yùn)行5 min,觀察被測(cè)試系統(tǒng)交易恢復(fù)情況。
測(cè)試結(jié)果:(1)宕掉節(jié)點(diǎn)2的心跳主備網(wǎng)卡,由于RAC集群由4節(jié)點(diǎn)組成,不會(huì)出現(xiàn)腦裂,節(jié)點(diǎn)2實(shí)例重啟,CRS重啟,節(jié)點(diǎn)2的VIP漂移到節(jié)點(diǎn)1;交易切換至其它節(jié)點(diǎn);(2)節(jié)點(diǎn)2心跳主備網(wǎng)卡故障恢復(fù)后,VIP回漂,數(shù)據(jù)庫(kù)可正常啟動(dòng)并加入RAC,交易不受影響。
實(shí)際測(cè)試結(jié)果符合預(yù)期,測(cè)試結(jié)果通過(guò)。
從以上3個(gè)場(chǎng)景可以看出:如果其中某個(gè)節(jié)點(diǎn)發(fā)生問(wèn)題,都實(shí)現(xiàn)了無(wú)用戶干預(yù)的自動(dòng)故障切換,通過(guò)損壞節(jié)點(diǎn)的恢復(fù),提升了數(shù)據(jù)庫(kù)的可靠性[11]。
通過(guò)該方案的研究與相關(guān)難點(diǎn)問(wèn)題的解決,成功實(shí)現(xiàn)了Windows平臺(tái)下Oracle12C RAC集群在線恢復(fù)損壞節(jié)點(diǎn),驗(yàn)證了Oracle RAC的易伸縮性,滿足了核心系統(tǒng)自身的調(diào)整需要,也為其他平臺(tái)下的節(jié)點(diǎn)恢復(fù)提供了參考。雖然RAC有著眾多的優(yōu)點(diǎn),但是由于部署一套R(shí)AC會(huì)涉及到服務(wù)器、操作系統(tǒng)、存儲(chǔ)設(shè)備、HBA卡等多方面的技術(shù),且從實(shí)現(xiàn)上比單實(shí)例數(shù)據(jù)庫(kù)更復(fù)雜,RAC自身也存在不少Bug,今后,還將對(duì)如何進(jìn)一步提高RAC的穩(wěn)定性、兼容性及性能調(diào)優(yōu)等方面進(jìn)行深入研究,為生產(chǎn)系統(tǒng)運(yùn)維及開(kāi)發(fā)提供更好的技術(shù)支撐。