陳真玄 ,范宇楠 ,張 怡 ,楊 柳
(1. 水利部信息中心,北京 100053;2. 北京金水信息技術(shù)發(fā)展有限公司,北京 100053)
隨著大數(shù)據(jù)時代的到來,水利信息化建設的不斷深化,信息化范圍逐步擴大,目前信息化建設已全面覆蓋了防汛抗旱、水資源管理、水土保持、河長制、農(nóng)村水利和電子政務等水利業(yè)務領(lǐng)域,大大提高了水行政管理和公共服務能力,提升了水利信息化水平。然而由于信息系統(tǒng)規(guī)模越來越大、應用范圍越來越廣,對數(shù)據(jù)可靠性的要求也越來越高,數(shù)據(jù)庫作為管理數(shù)據(jù)的核心系統(tǒng)也變得越來越重要。在此情況下,對數(shù)據(jù)庫系統(tǒng)進行高可用改造迫在眉睫。
水利部信息中心數(shù)據(jù)庫在政務內(nèi)網(wǎng)、業(yè)務網(wǎng)、DMZ 區(qū) 3 個區(qū)域分別采用大集中管理方式,特別是業(yè)務網(wǎng)核心數(shù)據(jù)庫承載了水情、氣象、財務、水資源、河長制等幾十個重要業(yè)務應用,部分業(yè)務為全國大集中部署,一旦數(shù)據(jù)庫癱瘓,將嚴重影響水利業(yè)務系統(tǒng)的正常運轉(zhuǎn)和工作的正常開展。
業(yè)務網(wǎng)核心數(shù)據(jù)庫目前已配置為 Oracle RAC 集群架構(gòu),運行在 2 臺 IBM P750 小型機上,數(shù)據(jù)存放在 1 臺 EMC VMAX 存儲上,數(shù)據(jù)量約 25 TB。當1 臺服務器硬件故障時,不影響數(shù)據(jù)庫使用。此外,數(shù)據(jù)庫配置了 RMAN 定期備份,可以為數(shù)據(jù)安全提供最后的保障。
但是目前仍然存在以下幾個問題:
1)數(shù)據(jù)庫集群只是實現(xiàn)了服務器冗余,數(shù)據(jù)庫系統(tǒng)仍是單點,由于數(shù)據(jù)庫 Bug、資源異常等原因引發(fā)的數(shù)據(jù)庫故障,仍會影響業(yè)務系統(tǒng)運行。
2)數(shù)據(jù)庫打補丁、升級等變更操作需要停止數(shù)據(jù)庫,中斷應用系統(tǒng)運行,并且由于變更操作時間窗口較長,一旦過程中發(fā)生問題會影響應用的恢復時間。
3)由于目前數(shù)據(jù)庫數(shù)據(jù)量較大,在數(shù)據(jù)庫損壞的情況下如果使用數(shù)據(jù)庫備份進行恢復的話,恢復時間很長,業(yè)務會長時間中斷,影響較大。
4)由于數(shù)據(jù)庫是單存儲,數(shù)據(jù)庫的存儲硬件故障會導致數(shù)據(jù)丟失或數(shù)據(jù)庫不可用,嚴重影響業(yè)務系統(tǒng)運行。
因此迫切需要改造業(yè)務網(wǎng)核心數(shù)據(jù)庫,提升數(shù)據(jù)庫的可用性,避免硬件故障導致數(shù)據(jù)庫不可用,縮短變更操作需要的停機時間,確保關(guān)鍵業(yè)務的連續(xù)性。
高可用性,指系統(tǒng)無中斷地執(zhí)行其功能的能力,代表系統(tǒng)的可用性程度。實現(xiàn)高可用有以下 3 個原則:
1)消除單點故障。通過增加系統(tǒng)冗余的方式,當系統(tǒng)部件故障時由其冗余部件接替,避免整個系統(tǒng)失效。
2)可靠的交匯點。交匯點通常指不容易冗余的節(jié)點,比如負載均衡器、Master 節(jié)點等,一般來說主從結(jié)構(gòu)的系統(tǒng)中,交匯點本身往往會變成故障單點,可靠的系統(tǒng)中必須有可靠的交匯點。
3)故障監(jiān)測。在遵循以上 2 個原則的基礎上,監(jiān)測故障,當發(fā)生故障時用冗余部件接替故障部件(Failover)實現(xiàn)高可用。
2.1.1 數(shù)據(jù)庫可用性與一致性
相對于 Web 服務器等無狀態(tài)系統(tǒng),數(shù)據(jù)庫作為有狀態(tài)系統(tǒng)其高可用存在更多挑戰(zhàn),難點之一就是冗余部件的數(shù)據(jù)一致性問題。
數(shù)據(jù)一致性是指分布式系統(tǒng)中不同部件/節(jié)點/副本之間在相同時間點的數(shù)據(jù)相同,通常分為強、最終和弱一致性。
強一致性是指同一時間點不同副本的數(shù)據(jù)是一致的,最終一致性是指經(jīng)過一定時間延遲后可以確保不同副本之間數(shù)據(jù)是相同的。如果數(shù)據(jù)庫采用異步復制方式,在 Failover 時數(shù)據(jù)沒有完全同步完、但能在 Failover 后將未同步完的數(shù)據(jù)復制過去則可以實現(xiàn)最終一致性;如果數(shù)據(jù)庫采用同步復制方式,可以保證數(shù)據(jù)的強一致性,但可能會導致系統(tǒng)性能問題,因此數(shù)據(jù)庫高可用的設計要根據(jù)業(yè)務需求在高可用和數(shù)據(jù)一致性進行權(quán)衡[1]。
2.1.2 數(shù)據(jù)庫 RTO 與 RPO
恢復時間目標(RTO)和恢復點目標(RPO)用來衡量故障發(fā)生后數(shù)據(jù)庫系統(tǒng)的恢復時間。RTO表示系統(tǒng)從故障發(fā)生到必須恢復的時間;RPO 是數(shù)據(jù)可用性指標,是指故障發(fā)生后系統(tǒng)和數(shù)據(jù)必須恢復到的時間點,與數(shù)據(jù)庫一致性相關(guān),數(shù)據(jù)強一致的冗余部件其 RPO 為 0,非強一致的冗余部件取決于其丟失的數(shù)據(jù)量[2]。
2.1.3 數(shù)據(jù)庫可用性評價指標
數(shù)據(jù)庫系統(tǒng)不可用通常分為 2 類場景:1)計劃停機。指無法通過系統(tǒng)設計避免而必須進行的有計劃停機,通常包括例行操作、周期維護、升級等操作,計劃停機通常對業(yè)務有影響但不會丟失數(shù)據(jù)。2)意外停機。指由于系統(tǒng)故障、數(shù)據(jù)或介質(zhì)錯誤、機房設施中斷等導致系統(tǒng)非正常中斷,通常會對業(yè)務和數(shù)據(jù)造成影響[3]。
系統(tǒng)可用性表示為正常運行時間與期望時間的百分比,通常作為服務水平協(xié)議(SLA)的 1 個指標,不同量級的可用性用數(shù)字 9 的個數(shù)表示,從1 個 9(90)到 5 個 9(99.999)。傳統(tǒng)數(shù)據(jù)庫的可用性一般是 95%~98% 之間,通過高可用技術(shù)和管理手段可以提高至 99.999%。數(shù)據(jù)庫可用性及對應的停機時間如表 1 所示。
表 1 數(shù)據(jù)庫可用性度量表 [3]
從數(shù)據(jù)庫系統(tǒng)的組成來看,有以下幾種冗余方式可以提高其可用性:
1)服務器冗余。通常采用雙機集群、集群等方式在服務器層進行冗余,集群相比雙機集群在切換時間及資源利用率方面更快更有效。
2)存儲冗余。同一存儲中采用 RAID 進行磁盤間冗余,存儲之間采用存儲級鏡像、PV 復制、塊復制等技術(shù)實現(xiàn)冗余。
3)網(wǎng)絡冗余。采用交換機雙活等網(wǎng)絡設備冗余技術(shù)。
4)數(shù)據(jù)庫或站點冗余。通過存儲級和數(shù)據(jù)復制等進行站點間冗余,避免單個數(shù)據(jù)庫或站點因為電力等設施發(fā)生故障導致的數(shù)據(jù)庫不可用,新型的分布式數(shù)據(jù)庫可以通過數(shù)據(jù)分片、一致性數(shù)據(jù)復制等技術(shù)實現(xiàn)跨地域多活的站點冗余。
改造后的數(shù)據(jù)庫不同場景的 RTO 和 RPO 如表2 所示。
數(shù)據(jù)庫每月期望的服務時間為 60×24×30 =43 200 min,如果假設數(shù)據(jù)庫每月各種事件都發(fā)生1 次,改造后意外和計劃停機時間約為 20 min,數(shù)據(jù)庫可用性可達到(43 200 - 20)/43 200 = 99.950%。
Oracle 數(shù)據(jù)庫主要的高可用技術(shù)如下[4]:
1)Oracle Real Application Clusters(Oracle RAC)。Oracle RAC 對服務器進行冗余,提高了數(shù)據(jù)庫實例或服務器出現(xiàn)中斷時應用程序可用性。OracleRAC 的服務器故障切換瞬間完成,另外還消除了計劃維護任務造成的停機。
表 2 數(shù)據(jù)庫 RTO 與 RPO 指標 [4]
2)Oracle Data Guard。Oracle Data Guard 對站點進行冗余,在遠程位置維護一個同步物理副本(備用數(shù)據(jù)庫),用于消除生產(chǎn)數(shù)據(jù)庫(主數(shù)據(jù)庫)或站點的故障,在數(shù)據(jù)庫升級時可以轉(zhuǎn)換為邏輯備庫減少停機時間。
3)Oracle ASM。Oracle ASM 通過雙存儲對數(shù)據(jù)庫存儲進行冗余,ASM 將數(shù)據(jù)組織成 Extent 連續(xù)數(shù)據(jù)塊,在每個存儲上各保留 1 份,替代傳統(tǒng)的存儲鏡像技術(shù),消除單臺存儲故障或數(shù)據(jù)損壞對數(shù)據(jù)庫的影響,簡化了數(shù)據(jù)庫存儲管理,并且能夠自動進行 I/O 平衡。各種數(shù)據(jù)庫高可用技術(shù)特點對比如表 3 所示。
表 3 數(shù)據(jù)庫高可用技術(shù)特點對照表
高可用設計考慮:
1)Oracle RAC 數(shù)據(jù)庫作為對等架構(gòu)的集群式數(shù)據(jù)庫,沒有物理上的 master 節(jié)點,可以理解為master 節(jié)點能運行在任意節(jié)點,所以其交匯點是可靠的,負責集群管理的 CRS 組件會監(jiān)控包括數(shù)據(jù)庫實例在內(nèi)集群資源狀態(tài),發(fā)生故障時自動進行切換,可以實現(xiàn)高可用。
2)Oracle ASM 也是 CRS 組件的集群資源,其高可用機制類似 RAC,能夠?qū)崿F(xiàn)高可用。
3)考慮到現(xiàn)有的備用數(shù)據(jù)庫計算能力較弱,切換時需要停止部分業(yè)務,避免備庫過載,Oracle Data Guard 采用手工切換的方式,主庫發(fā)生故障時監(jiān)控系統(tǒng)報警,需要人工執(zhí)行腳本進行切換。
數(shù)據(jù)一致性考慮:
1)Oracle RAC 的服務器雖然有數(shù)據(jù),但其數(shù)據(jù)要寫入存儲持久化,所以可以理解為無狀態(tài)系統(tǒng),其通過私有網(wǎng)絡進行的數(shù)據(jù)同步可以提高速度,沒有一致性問題。
2)Oracle ASM 在 2 個存儲間采用同步寫入,正常情況下,1 個數(shù)據(jù)塊寫到 2 個存儲才算成功,因此數(shù)據(jù)是強一致的。
3)Oracle Data Guard 采用異步復制,主備庫是弱一致,主節(jié)點故障時如果日志沒有完全傳過去會丟失部分數(shù)據(jù),后期會探討在主庫宕機時將未傳過去日志通過其他手段發(fā)送到備庫,實現(xiàn)最終一致性。
本次實踐在水利部現(xiàn)有 Oracle RAC 核心數(shù)據(jù)庫基礎上,利用 Oracle Data Guard 數(shù)據(jù)庫建立備份節(jié)點,利用 Oracle ASM 實現(xiàn)雙存儲冗余構(gòu)造高可用架構(gòu)。
2.3.1 Oracle Data Guard 高可用改造
利用 2 臺水利部信息中心現(xiàn)有的 IBM P570 小型機搭建 Data Gurad 備用數(shù)據(jù)庫,采用 IBM DS4800作為后端存儲。Data Guard 使用數(shù)據(jù)庫復制技術(shù)消除單點故障,并且為所有類型的意外中斷提供可靠的數(shù)據(jù)保護和高可用性級別,包括數(shù)據(jù)損壞、數(shù)據(jù)庫和站點故障。備用數(shù)據(jù)庫還為在計劃維護期間減少停機提供了實質(zhì)性優(yōu)勢,將 RTO 降低到了數(shù)秒或數(shù)分鐘,伴隨的 RPO 為 0 或近乎為 0。
Oracle Data Guard 提供 3 種數(shù)據(jù)保護模式[5]平衡成本、可用性、性能和事務保護,Oracle Data Guard數(shù)據(jù)保護模式如表 4 所示。
本次改造由于現(xiàn)有環(huán)境的備用數(shù)據(jù)庫性能較低,主備庫配置差距較大,且需優(yōu)先保證主數(shù)據(jù)庫的性能,因此選擇最大性能模式。
通過 Data Guard 改造實施,當主數(shù)據(jù)庫由于存儲、服務器等發(fā)生故障不可用時,可以切換到備用數(shù)據(jù)庫,此時應用可以訪問備用數(shù)據(jù)庫繼續(xù)執(zhí)行業(yè)務,異步模式下備用數(shù)據(jù)庫通常最多只會丟失數(shù)秒或分鐘的數(shù)據(jù)。此外,通過 Data Guard 可以將打補丁、升級、遷移等變更操作的計劃停機時間減少到分鐘甚至秒級。
表 4 Oracle Data Guard 數(shù)據(jù)保護模式
2.3.2 Oracle ASM 高可用改造
在此階段新增華為 6800 存儲,通過 Oracle ASM創(chuàng)建 Normal 冗余的雙存儲磁盤組,當一套存儲故障或數(shù)據(jù)丟失時,另一套存儲可以繼續(xù)提供服務不影響數(shù)據(jù)庫運行。
Normal 冗余磁盤組在每套存儲上創(chuàng)建 1 個Failgroup,數(shù)據(jù)組織成 Extent 連續(xù)數(shù)據(jù)塊,在 2 個Failgroup 各保存 1 份,其中一個為 Primary Extent,另一個為 Second Extent,每個 Extent 在各自 Failgroup的位置并不相同。
數(shù)據(jù)庫在將數(shù)據(jù)寫入磁盤時會以并行異步的方式同時寫入 2 個存儲,異步寫入請求發(fā)起后,數(shù)據(jù)庫可以繼續(xù)執(zhí)行其他 I/O 或操作,當 2 個存儲的異步 I/O 都返回后寫入操作才算完成。
數(shù)據(jù)庫需要讀數(shù)據(jù)時,會先讀取 Primary Extent,如果 Primary Extent 不可用,則從另一個存儲中的Second Exten 中讀取[6]。
當一套存儲的某塊磁盤連續(xù)幾次不可讀寫時,數(shù)據(jù)庫會 Offline 這塊盤,此時數(shù)據(jù)庫會將數(shù)據(jù)寫入同存儲其他可用磁盤,數(shù)據(jù)依然是雙份冗余。如果整個存儲不可用,數(shù)據(jù)庫會訪問另一個存儲的數(shù)據(jù),此時數(shù)據(jù)庫仍然可以正常運行。
ASM 改造后整體架構(gòu)如圖 1 所示(紅色為新增部分)。
Data Guard 改造主要實施步驟如下:
1)主庫激活 Foreced Logging。
圖 1 數(shù)據(jù)庫雙存儲系統(tǒng)改造實施后架構(gòu)圖
2)設置主庫 LOG_ARCHIVE_DEST_2 參數(shù),控制數(shù)據(jù)同步方式:
LOG_ARCHIVE_DEST_2 ='SERVICE = stdby LGWR ASYNC VALID_FOR = (ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME = fxdbstb'。
3)主庫創(chuàng)建 Standby Redo Log 日志,用于主庫切換為備庫后使用,其大小與主庫日志相同。
4)拷貝主庫密碼文件到備庫,確保主備庫密碼一致。
5)復制主庫參數(shù)到備庫并修改作為 standby 參數(shù)文件,主要參數(shù)設置如下:
*.LOG_ARCHIVE_DEST_2 = 'SERVICE = fxdb LGWR ASYNC VALID_FOR = (ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME = fxdb'。
6)主備庫 4 個節(jié)點增加靜態(tài)監(jiān)聽,設置 fxdb,fxdbstb 等 tnsname,用于傳送歸檔時的 tnsname解析。
7)備份主庫用以創(chuàng)建備庫,在主庫上創(chuàng)建備庫控制文件,并傳送到備庫服務器,命令如下:
backup current controlfile for standby format '/backup/dg/ctlbak_%U'。
8)采用 duplicate 方式通過主庫備份創(chuàng)建備庫:rman target sys/ @fxdb1 auxiliary/
duplicate target database for standby nofilenamecheck dorecover。
9)創(chuàng)建備庫后,通過同步日志方式追平備份主庫后產(chǎn)生的歸檔。主庫啟動日志同步:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2 = ENABLE SID = '*';
備庫啟動 MRP 進程:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION PARALLEL 8。
10)檢查確認備庫同步完成。
11)注冊備庫到 Oracle Clusterware,由 Oracle Clusterware 管理備庫。
ASM 雙存儲系統(tǒng)改造主要為創(chuàng)建新的磁盤組(CRS,DATA,RECO)并將原磁盤組的配置信息和數(shù)據(jù)復制到新磁盤組,實施步驟如下:
1) 在 EMC VMX 和華為 6800 上各劃分相同數(shù)量及大小的新磁盤,用于創(chuàng)建各新磁盤組。
2)在第三方 NAS 存儲上為 CRS 磁盤組創(chuàng)建用于仲裁的 NAS 盤,并 mount 到/fxdb_voting 目錄:
dd if = /dev/zero of = /fxdbvote/quorum_vote bs =1024k count = 2048。
3)在 2 臺存儲新劃磁盤及 NAS 盤上創(chuàng)建新的normal 冗余 CRS 磁盤組:
create diskgroup CRS normal redundancy;
failgroup fgemc disk'/dev/rhdiskpower180' size 20g;
failgroup fghw disk'/dev/rhdiskpower290' size 20g;
quorum failgroup fgnas disk'/fxdb_voting/quorum_vote' size 20g。
4)遷移 ocr 和 vote 盤到新建 CRS 磁盤組:$ORACLE_HOME/bin/ocrconfig - add + CRS;$ORACLE_HOME/bin/crsctl replace votedisk +CRS。
5)遷移 spfile 到 CRS 磁盤組,使用新的 spfile重啟 CRS 集群,確認 CRS 集群運行正常。
6)在 2 臺存儲新劃磁盤上創(chuàng)建新的 DATA 磁盤組:
create diskgroup DATA normal redundancy
failgroup fgemc disk … failgroup fghw disk …
7)拷貝參數(shù)及控制文件到新建 DATA 磁盤組,使用新的參數(shù)和控制文件啟動數(shù)據(jù)庫到 mount狀態(tài)。
8)使用 rman 拷貝數(shù)據(jù)文件到 DATA,重建并打開數(shù)據(jù)庫:
backup as copy database format '+ DATA';switch database to copy;
recover database;
alter database open resetlogs。9)修改 temp 和 redo log 文件到 DATA 磁盤組。10)在 2 臺存儲新劃磁盤上創(chuàng)建新的 RECO 磁盤組,設置 recovery 區(qū)到新的 RECO 磁盤組。
通過本次數(shù)據(jù)庫高可用改造實施,消除了數(shù)據(jù)庫、存儲單點故障,可實現(xiàn)主備數(shù)據(jù)庫、雙存儲靈活切換,減少了數(shù)據(jù)庫恢復、打補丁、升級等操作對業(yè)務系統(tǒng)的影響,大大降低了業(yè)務中斷時間,數(shù)據(jù)庫從安全性、可用性方面都得到了大幅提升,能夠更好地為水利信息系統(tǒng)的穩(wěn)定運行做好支撐。