上官斌
摘要:為保障7×24持續(xù)運(yùn)行,越來(lái)越多的大型政企單位的核心業(yè)務(wù),大都逐步開(kāi)始推進(jìn)系統(tǒng)雙活建設(shè)。其中最重要,也是最難的,是如何實(shí)現(xiàn)大型數(shù)據(jù)庫(kù)雙活。包括仲裁一致性、性能同步、異常切換決策都是確保雙活建設(shè)成功,達(dá)到建設(shè)目標(biāo)需要重點(diǎn)研究取舍的關(guān)鍵性難點(diǎn)。通過(guò)在實(shí)際生產(chǎn)中主持千萬(wàn)用戶級(jí)電信系統(tǒng)雙活建設(shè)實(shí)踐,成功實(shí)現(xiàn)了連續(xù)3年業(yè)務(wù)零中斷,演練RPO≈0,RTO<10分鐘?,F(xiàn)總結(jié)了其中數(shù)據(jù)庫(kù)雙活建設(shè)的一些實(shí)踐性經(jīng)驗(yàn),供從業(yè)者參考。
關(guān)鍵詞:數(shù)據(jù)庫(kù);雙活;一致性;同步;切換
中圖分類(lèi)號(hào):TP311? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)08-0023-03
1 雙活系統(tǒng)建設(shè)難點(diǎn)
包括金融、電信、政府等大型政企單位的核心業(yè)務(wù)用戶級(jí)通常達(dá)到數(shù)百萬(wàn)級(jí)乃至千萬(wàn)級(jí)、億級(jí),業(yè)務(wù)數(shù)據(jù)量巨大,大型關(guān)系型數(shù)據(jù)庫(kù)技術(shù)得到越來(lái)越廣泛的應(yīng)用。
過(guò)去我們關(guān)注數(shù)據(jù)庫(kù)的數(shù)據(jù)量大小,如今我們更加關(guān)注的,其實(shí)是從技術(shù)架構(gòu)和用戶影響的角度去思考。從技術(shù)架構(gòu)角度,大型數(shù)據(jù)庫(kù)系統(tǒng)一般采用雙機(jī)或多機(jī)集群復(fù)雜技術(shù)體系;從用戶影響角度,大型數(shù)據(jù)庫(kù)系統(tǒng)一般承載數(shù)百萬(wàn)乃至千萬(wàn)用戶級(jí)以上用戶數(shù)據(jù),一旦數(shù)據(jù)庫(kù)故障或宕機(jī),將可能直接影響千萬(wàn)級(jí)用戶的業(yè)務(wù)體驗(yàn),甚至業(yè)務(wù)中斷。
為保障7×24不斷網(wǎng),不斷電持續(xù)運(yùn)行,核心業(yè)務(wù)大都逐步開(kāi)始進(jìn)行系統(tǒng)雙活,兩地三中心,甚至多地多中心的系統(tǒng)建設(shè)。在雙活系統(tǒng)建設(shè)中,基本都會(huì)遵循網(wǎng)絡(luò)雙活、應(yīng)用雙活、數(shù)據(jù)雙活三個(gè)層次的架構(gòu)設(shè)計(jì)原則。其中最重要,也是最難的,是如何實(shí)現(xiàn)大型數(shù)據(jù)庫(kù)雙活。尤其是如何解決大型數(shù)據(jù)庫(kù)集群之間的仲裁一致性、如何保障數(shù)據(jù)庫(kù)同步性能、節(jié)點(diǎn)異常情況下的切換決策問(wèn)題。更是一個(gè)需要平衡的難點(diǎn)。
2 數(shù)據(jù)庫(kù)雙活實(shí)現(xiàn)
為了提升實(shí)時(shí)性業(yè)務(wù)服務(wù)性能,業(yè)務(wù)模塊可引入Dcache等分布式緩存數(shù)據(jù)庫(kù),提升讀寫(xiě)、億級(jí)用戶業(yè)務(wù)快速處理能力。而由于業(yè)務(wù)訂購(gòu)關(guān)系數(shù)據(jù)主要存儲(chǔ)在Oracle/MySQL等數(shù)據(jù)庫(kù),而業(yè)務(wù)鑒權(quán)和處理主要依賴(lài)Dcache。因此根據(jù)異地業(yè)務(wù)的雙活容災(zāi),雙站之間的Dcache也需要保持?jǐn)?shù)據(jù)的一致性。Dcache 與數(shù)據(jù)庫(kù)之間需要維護(hù)數(shù)據(jù)的一致性。
兩個(gè)中心(IDC1和IDC2)會(huì)融合成一套異地雙活部署的網(wǎng)關(guān),業(yè)務(wù)通過(guò)GSLB全局負(fù)載均衡,因此需在兩個(gè)中心部署業(yè)務(wù)檢測(cè)和切換系統(tǒng)。每個(gè)站點(diǎn)部署一套監(jiān)控服務(wù)器監(jiān)控所有接口機(jī),處理機(jī)與數(shù)據(jù)庫(kù)的工作狀態(tài)。
當(dāng)數(shù)據(jù)庫(kù)發(fā)生異常的時(shí)候,由監(jiān)控服務(wù)器通知所有的接口機(jī)和處理機(jī)進(jìn)行數(shù)據(jù)庫(kù)切換和業(yè)務(wù)恢復(fù)。當(dāng)監(jiān)控服務(wù)器監(jiān)控到某個(gè)模塊的業(yè)務(wù)成功率低,可以根據(jù)預(yù)定策略對(duì)該模塊進(jìn)行重啟或者下線處理。
3 數(shù)據(jù)庫(kù)雙寫(xiě)
IDC1和IDC2機(jī)房的基于Oracle RAC和Dcache分布式高性能方案保證數(shù)據(jù)的高可靠性,移植性,同時(shí)兼顧高并發(fā),高訪問(wèn)等特點(diǎn)。與此同時(shí)業(yè)務(wù)需要通過(guò)配置數(shù)據(jù)雙向?qū)懭隝DC1和IDC2的數(shù)據(jù)庫(kù)中,保證兩個(gè)站點(diǎn)的數(shù)據(jù)一致。為保障雙活數(shù)據(jù)庫(kù)性能,直連鏈路時(shí)延需要控制在5ms之內(nèi),考慮到傳輸設(shè)備和傳輸距離的影響,同時(shí)兼顧異址容災(zāi)安全,一般要求兩個(gè)雙活I(lǐng)DC的距離保持在30km到100km之間,實(shí)際工程中,通常通過(guò)大帶寬(GB以上)裸光纖鏈路直連兩個(gè)IDC。
IDC1機(jī)房作為主數(shù)據(jù)庫(kù);IDC2機(jī)房作為備份數(shù)據(jù)庫(kù)。
通過(guò)域名方式訪問(wèn)業(yè)務(wù)系統(tǒng)配置臺(tái),對(duì)配置數(shù)據(jù)進(jìn)行配置操作。不論接入的是運(yùn)行在IDC1或者IDC2機(jī)房的業(yè)務(wù)系統(tǒng)配置臺(tái)。配置的數(shù)據(jù)都會(huì)雙向同時(shí)寫(xiě)入IDC1機(jī)房和IDC2機(jī)房的數(shù)據(jù)庫(kù),實(shí)現(xiàn)了兩個(gè)機(jī)房的數(shù)據(jù)一致。
新增配置雙寫(xiě)流程:
(1)正常流程
① 業(yè)務(wù)系統(tǒng)配置臺(tái)新增數(shù)據(jù);
② 在IDC1數(shù)據(jù)庫(kù)中寫(xiě)入新數(shù)據(jù);
③ IDC1數(shù)據(jù)庫(kù)返回成功響應(yīng)
④ 在IDC2數(shù)據(jù)庫(kù)中寫(xiě)入新數(shù)據(jù);
⑤ IDC2數(shù)據(jù)庫(kù)返回成功響應(yīng)
(2)異常流程1
① 業(yè)務(wù)系統(tǒng)配置臺(tái)新增數(shù)據(jù);
② 在IDC1數(shù)據(jù)庫(kù)中寫(xiě)入新數(shù)據(jù);
③ IDC1數(shù)據(jù)庫(kù)返回成功響應(yīng);
④ 新增數(shù)據(jù)成功;
⑤ 在IDC2數(shù)據(jù)庫(kù)中寫(xiě)入新數(shù)據(jù);
⑥ IDC2數(shù)據(jù)庫(kù)返回失敗響應(yīng);
⑦ 告警并生成SQL文件,需要管理員檢查并IDC2數(shù)據(jù)庫(kù),運(yùn)行正常后手工執(zhí)行SQL文件。
(3)異常流程2
① 業(yè)務(wù)系統(tǒng)配置臺(tái)新增數(shù)據(jù);
② 在IDC1數(shù)據(jù)庫(kù)中寫(xiě)入新數(shù)據(jù);
③ IDC1數(shù)據(jù)庫(kù)返回失敗響應(yīng);
④ 新增數(shù)據(jù)失敗;
⑤ 不在IDC2數(shù)據(jù)庫(kù)中寫(xiě)入新數(shù)據(jù)。
業(yè)務(wù)雙寫(xiě)即業(yè)務(wù)系統(tǒng)對(duì)數(shù)據(jù)的增刪改操作,同時(shí)寫(xiě)入IDC1和IDC2的數(shù)據(jù)庫(kù)。
4 數(shù)據(jù)一致性難點(diǎn)破解
4.1數(shù)據(jù)一致性等級(jí)
數(shù)據(jù)的一致性有幾個(gè)等級(jí),弱一致性 < 最終一致性 < 強(qiáng)一致性。強(qiáng)一致性是關(guān)系數(shù)據(jù)庫(kù)的基本特征,而NoSQL產(chǎn)品一般都只實(shí)現(xiàn)到最終一致性,否則也沒(méi)有余地去實(shí)現(xiàn)其他優(yōu)勢(shì)特性。最終一致性的意思是,數(shù)據(jù)的多個(gè)復(fù)本間有可能不是實(shí)時(shí)一致的,但是經(jīng)過(guò)有限的時(shí)間或步驟,最終是能夠達(dá)到一致的。
在分布式系統(tǒng)中常見(jiàn)的復(fù)本策略有這么幾種:主備策略、主從策略、Quorum策略。相對(duì)于傳統(tǒng)的主備、主從策略而言,Quorum方式更加靈活,可以對(duì)多節(jié)點(diǎn)讀寫(xiě)兼顧平衡控制。
Quorum N/R/W中,N是一份數(shù)據(jù)總共存入幾個(gè)節(jié)點(diǎn)(在Dcache中,特定的Key存入哪些節(jié)點(diǎn)是相對(duì)固定的,后面會(huì)詳細(xì)講);R是讀取數(shù)據(jù)時(shí),在N個(gè)節(jié)點(diǎn)中有多少讀取成功則認(rèn)為讀取成功;W是寫(xiě)數(shù)據(jù)時(shí),在N個(gè)節(jié)點(diǎn)中有多少寫(xiě)成功則認(rèn)為寫(xiě)入成功。F5CDA0EE-B226-4D1F-9AD6-B0F99FF02FD8
一般來(lái)說(shuō),在R+W>N時(shí),認(rèn)為是數(shù)據(jù)一致性程度較高的,不會(huì)出現(xiàn)寫(xiě)了新數(shù)據(jù)卻讀到舊數(shù)據(jù)的情況。比如最典型的場(chǎng)景是N/R/W=3/2/2,有兩個(gè)重要意義:
①數(shù)據(jù)成功寫(xiě)在一部分節(jié)點(diǎn)上后,后面讀數(shù)據(jù)時(shí)不可能只選擇跟之前完全不同的另一部分節(jié)點(diǎn),至少會(huì)有R+W-N個(gè)節(jié)點(diǎn)是重合的,這就保證了讀取到的R個(gè)數(shù)據(jù)中,至少有一個(gè)是之前剛寫(xiě)過(guò)的新數(shù)據(jù);
②因?yàn)樵?/2/2模型中,R 4.2內(nèi)存數(shù)據(jù)庫(kù)一致性 在Dcache中,一致性強(qiáng)度是可根據(jù)Quorum策略靈活配置的: 當(dāng)N=W=R時(shí),是實(shí)現(xiàn)了強(qiáng)一致性,但是可用性方面很差,單點(diǎn)故障即影響業(yè)務(wù)應(yīng)用的訪問(wèn)。 最常用的還是R+W>N的模式,典型配置是N/R/W=3/2/2,兼顧可用性和數(shù)據(jù)一致性,雖然多個(gè)復(fù)本間的數(shù)據(jù)不可能每個(gè)瞬時(shí)都一致,但是最終多個(gè)復(fù)本間是一致的,而且每次業(yè)務(wù)應(yīng)用對(duì)數(shù)據(jù)的讀取都建立在R個(gè)復(fù)本的比較之上,而這個(gè)模式中R個(gè)復(fù)本里至少會(huì)有一個(gè)最新的,最終返回給業(yè)務(wù)應(yīng)用的也是正確的數(shù)據(jù)??梢哉J(rèn)為,在同時(shí)最多只有單點(diǎn)故障發(fā)生的情況下,其一致性效果是逼近強(qiáng)一致性的。 Key/Value是一種新型的數(shù)據(jù)存取方式,確實(shí)能解決一部分問(wèn)題,但不能解決所有問(wèn)題,要避免出現(xiàn)對(duì)Dcache盲目使用的情況,有些流程中確實(shí)不適合使用Key/Value方式,這些問(wèn)題如果規(guī)劃階段沒(méi)有發(fā)現(xiàn)的話,在性能測(cè)試階段可能會(huì)暴露出來(lái)。 上線以前務(wù)必要按實(shí)際的業(yè)務(wù)邏輯和實(shí)際的數(shù)據(jù)規(guī)模,在實(shí)際的硬件條件下進(jìn)行性能測(cè)試。強(qiáng)烈建議在現(xiàn)網(wǎng)上線前預(yù)留充足的時(shí)間,直接在現(xiàn)網(wǎng)設(shè)備上進(jìn)行性能測(cè)試,及時(shí)識(shí)別和排除潛在的各種干擾。 而且要覆蓋盡可能全面的業(yè)務(wù)邏輯,如果流程A和流程B存在某種關(guān)系,流程間的協(xié)作也都要覆蓋到。數(shù)據(jù)規(guī)模方面,測(cè)試時(shí)一定要達(dá)到實(shí)際的數(shù)據(jù)規(guī)模和離散程度,因?yàn)镈cache是有緩沖的,數(shù)據(jù)量很少時(shí),所有請(qǐng)求在內(nèi)存中即可命中,數(shù)據(jù)規(guī)模大時(shí),可能會(huì)訪問(wèn)到磁盤(pán),所以性能表現(xiàn)跟數(shù)據(jù)規(guī)模是有關(guān)系的。 為了適應(yīng)Dcache,原來(lái)業(yè)務(wù)處理機(jī)有關(guān)白名單鑒權(quán)的所有訪問(wèn)內(nèi)存庫(kù)的業(yè)務(wù)流程都需要移植和改造。同時(shí)為了提升訪問(wèn)的性能,業(yè)務(wù)處理機(jī)需要維護(hù)多個(gè)Dcache客戶端線程進(jìn)行讀/寫(xiě)。 另外為了滿足容災(zāi)的性能,需要提供Dcache的同步工具,是實(shí)現(xiàn)業(yè)務(wù)雙寫(xiě)。以及冷備站點(diǎn)的Oracle數(shù)據(jù)同步到Dcache。 4.3數(shù)據(jù)庫(kù)集群一致性 為了數(shù)據(jù)的安全,基于Oracle RAC方案的高可靠性,因此數(shù)據(jù)庫(kù)采用Oracle RAC,同時(shí)由業(yè)務(wù)雙寫(xiě)保證兩個(gè)站點(diǎn)的數(shù)據(jù)一致。 通信層管理節(jié)點(diǎn)之間的通信。它的職責(zé)是配置,互聯(lián)群集中節(jié)點(diǎn)信息,在群集管理器中使用由心跳機(jī)制產(chǎn)生的信息,由通信層負(fù)責(zé)傳輸,確保信息的正確到達(dá)。還有一些群集監(jiān)視進(jìn)程不斷驗(yàn)證系統(tǒng)的不同領(lǐng)域運(yùn)行狀況。例如,心跳監(jiān)測(cè)不斷驗(yàn)證的心跳機(jī)制的運(yùn)作是否良好。 每個(gè)站點(diǎn)部署一套監(jiān)控服務(wù)器監(jiān)控所有接口機(jī),處理機(jī)與數(shù)據(jù)庫(kù)的工作狀態(tài)。當(dāng)數(shù)據(jù)庫(kù)發(fā)生異常的時(shí)候,由監(jiān)控服務(wù)器通知所有的接口機(jī)和處理機(jī)進(jìn)行數(shù)據(jù)庫(kù)切換和業(yè)務(wù)恢復(fù)。 5 數(shù)據(jù)庫(kù)切換 兩個(gè)IDC會(huì)融合成一套異地部署的雙活業(yè)務(wù)系統(tǒng),平時(shí)IDC1機(jī)房的業(yè)務(wù)系統(tǒng)和IDC2機(jī)房的業(yè)務(wù)系統(tǒng)都和部署在IDC1機(jī)房的主站數(shù)據(jù)庫(kù)(包括Oracle和Dcache)連接,所以需在IDC1和IDC2機(jī)房同時(shí)部署監(jiān)控服務(wù)器,監(jiān)測(cè)數(shù)據(jù)庫(kù)狀態(tài)。監(jiān)控服務(wù)器中部署檢測(cè)和切換系統(tǒng),其部署方式如圖所示。 監(jiān)控服務(wù)器同時(shí)連接業(yè)務(wù)系統(tǒng)的接口機(jī)和處理機(jī)。業(yè)務(wù)系統(tǒng)的接口機(jī)和處理機(jī)部署駐留程序,通過(guò)駐留程序檢測(cè)數(shù)據(jù)庫(kù)訪問(wèn)成功率。 接口機(jī)、處理機(jī)數(shù)據(jù)庫(kù)訪問(wèn)成功率: (1)業(yè)務(wù)系統(tǒng)各個(gè)接口機(jī)、處理機(jī)節(jié)點(diǎn)定期上報(bào)數(shù)據(jù)庫(kù)訪問(wèn)成功率數(shù)據(jù)給監(jiān)控服務(wù)器的檢測(cè)系統(tǒng),上報(bào)間隔要求可配置,默認(rèn)為30S。 (2)監(jiān)控服務(wù)器的切換系統(tǒng)根據(jù)檢測(cè)結(jié)果和判定規(guī)則,向告警網(wǎng)元發(fā)送故障告警。 (3)切換服務(wù)器決定是否切換。 檢測(cè)項(xiàng)結(jié)果定義: 節(jié)點(diǎn)數(shù)據(jù)庫(kù)訪問(wèn)成功率:各個(gè)處理機(jī)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)訪問(wèn)成功率(X個(gè)節(jié)點(diǎn))。 探測(cè)系統(tǒng)最終上報(bào)的關(guān)于數(shù)據(jù)庫(kù)探測(cè)結(jié)果內(nèi)容如下: [檢測(cè)結(jié)果項(xiàng) 來(lái)源 說(shuō)明 備注 節(jié)點(diǎn)數(shù)據(jù)庫(kù)訪問(wèn)成功率 各處理機(jī)節(jié)點(diǎn) 各個(gè)處理機(jī)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)訪問(wèn)成功率 根據(jù)實(shí)際情況,每次包含N個(gè)節(jié)點(diǎn)數(shù)據(jù) ] 切換類(lèi)型邏輯判定分自動(dòng)切換和人工參與的半自動(dòng)切換兩類(lèi)。 (1)半自動(dòng)切換場(chǎng)景 建議數(shù)據(jù)庫(kù)的各類(lèi)異常,都要求人工參與判定,因?yàn)楦黝?lèi)判定參數(shù),只能做切換依據(jù)。 當(dāng)然用戶也可以設(shè)置為自動(dòng)切換。 (2)自動(dòng)切換條件設(shè)置 數(shù)據(jù)庫(kù)自動(dòng)切換判定規(guī)則: 監(jiān)控檢測(cè)結(jié)果展示到可視化狀態(tài)管理界面,用戶可以查看。 如果選擇的人工切換,則顯示一鍵切換按鈕。否則顯示自動(dòng)切換,用戶不可操作,只能查看狀態(tài)和日志。 當(dāng)滿足數(shù)據(jù)庫(kù)切換條件時(shí),監(jiān)控服務(wù)器通知各個(gè)接口機(jī)及處理機(jī)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)切換。 當(dāng)主用數(shù)據(jù)庫(kù)恢復(fù)之后,需要將數(shù)據(jù)庫(kù)訪問(wèn)進(jìn)行回切。 數(shù)據(jù)庫(kù)切換流程為: l 檢查數(shù)據(jù)庫(kù)恢復(fù)狀態(tài) l 執(zhí)行數(shù)據(jù)同步 l 通知各個(gè)接口機(jī)及處理機(jī)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)切換 6 結(jié)束語(yǔ) 雙活系統(tǒng)架構(gòu)設(shè)計(jì)應(yīng)遵循必要的基本原則。應(yīng)充分考慮網(wǎng)絡(luò)雙活、應(yīng)用雙活、數(shù)據(jù)雙活三個(gè)層次,才能充分規(guī)避由于單出口網(wǎng)絡(luò)故障、應(yīng)用服務(wù)器故障、數(shù)據(jù)庫(kù)錯(cuò)誤造成的業(yè)務(wù)影響。其中難點(diǎn)和重點(diǎn)在數(shù)據(jù)庫(kù)雙活的設(shè)計(jì)和實(shí)現(xiàn),在建成后的應(yīng)急演練中,應(yīng)充分模擬數(shù)據(jù)庫(kù)各種接口增刪改查操作,各層級(jí)故障現(xiàn)象的發(fā)生,以及數(shù)據(jù)庫(kù)整體切換演練。不斷優(yōu)化工程中可能考慮不周的情況進(jìn)行優(yōu)化,最終實(shí)現(xiàn)系統(tǒng)長(zhǎng)時(shí)間可靠的0中斷運(yùn)行, RPO≈0,RTO≈0。以上是筆者在實(shí)踐基礎(chǔ)上的一些總結(jié),對(duì)電信級(jí)兩地三中心系統(tǒng)建設(shè)中特別是大型數(shù)據(jù)庫(kù)雙活架構(gòu)設(shè)計(jì)及實(shí)施工作的有效開(kāi)展,具有積極的借鑒意義。 參考文獻(xiàn): [1] 梁凝,單曉強(qiáng),孫疊.數(shù)據(jù)庫(kù)同步技術(shù)的研究[J].工業(yè)控制計(jì)算機(jī),2017,30(7):118-119,122. [2] Futurewei Technologies Inc. Patent Issued for Decentralized Distributed Database Consistency[J].Information Technology Newsweekly,(USPTO 10,503,725) [3] 朱紅.基于MySQL集群實(shí)現(xiàn)的高性能數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)[D].上海:上海交通大學(xué),2014. 【通聯(lián)編輯:王力】F5CDA0EE-B226-4D1F-9AD6-B0F99FF02FD8