銀行核心系統(tǒng)分布式改造,架構(gòu)設(shè)計如何為數(shù)據(jù)庫運維加成?
一、數(shù)據(jù)庫架構(gòu)建設(shè)的基本方法和過程
二、某核心系統(tǒng)由大型機系統(tǒng)遷移到分布式架構(gòu)
三、Redis異地容災(zāi)架構(gòu)建設(shè)
一、數(shù)據(jù)庫架構(gòu)建設(shè)的基本方法和過程
1.數(shù)據(jù)庫架構(gòu)組成
1)數(shù)據(jù)庫架構(gòu)
在日常工作中,如果我們說到數(shù)據(jù)庫架構(gòu),一般來說指的是網(wǎng)絡(luò)、主機、存儲及之上運行的數(shù)據(jù)庫實例。數(shù)據(jù)庫架構(gòu)工作指的則是如何去評估和組合這些組件,從而為業(yè)務(wù)提供符合運營要求的數(shù)據(jù)庫服務(wù)。
2)數(shù)據(jù)庫訪問組件
當(dāng)數(shù)據(jù)庫架構(gòu)演進到分布式架構(gòu),如何讓應(yīng)用程序(服務(wù))快速確認數(shù)據(jù)所在的位置,就成為了一個核心的問題,而這就是數(shù)據(jù)庫訪問組件的工作。
3)數(shù)據(jù)庫運營平臺
對于一個大型組織,運營幾千套、幾萬套數(shù)據(jù)庫實例是很平常的事情,而這也給運營團隊的日常管理帶來了一定難度的挑戰(zhàn)。各個公司組織紛紛搭建運營平臺,用于告警監(jiān)控、故障處理、變更、版本發(fā)布等,在設(shè)計和構(gòu)建數(shù)據(jù)庫架構(gòu)的同時建設(shè)數(shù)據(jù)庫運營平臺已經(jīng)成為了一種標準操作。
2.可運營及需求的組成
1)業(yè)務(wù)需求
數(shù)據(jù)庫架構(gòu)首先要匹配組織的業(yè)務(wù)流程,滿足組織的業(yè)務(wù)需求,是所有從業(yè)者的共識。
2)運營需求
設(shè)計和構(gòu)建數(shù)據(jù)庫架構(gòu)的最終目標就是獲得一個能夠持續(xù)、穩(wěn)定提供服務(wù)的數(shù)據(jù)庫集群,從設(shè)計之初就充分了解和滿足運營需求,是數(shù)據(jù)庫架構(gòu)設(shè)計成功的一個關(guān)鍵要素。
3)監(jiān)管需求
對于強監(jiān)管行業(yè)而言,不滿足監(jiān)管要求,項目就無法上線。因此,監(jiān)管需求可以說事關(guān)監(jiān)管行業(yè)的生死,必須在設(shè)計之初就充分考慮。
3.架構(gòu)設(shè)計
1)業(yè)界生態(tài)
“不要重復(fù)造輪子”,在數(shù)據(jù)庫架構(gòu)設(shè)計前,調(diào)研業(yè)界的技術(shù)生態(tài)非常重要。同時需要注意,我們所在組織的技術(shù)生態(tài)也是業(yè)界生態(tài)非常重要的一部分。
2)架構(gòu)設(shè)計初稿
通過調(diào)研業(yè)界生態(tài),我們能夠獲取數(shù)據(jù)庫架構(gòu)所需的模塊,再結(jié)合項目的實際情況,對所需模塊進行組合和完善,就能夠獲取數(shù)據(jù)庫架構(gòu)的初稿。
4.架構(gòu)構(gòu)建
1)數(shù)據(jù)庫選型和測試
數(shù)據(jù)庫選型放在架構(gòu)設(shè)計之后的一個重要考量是保證數(shù)據(jù)庫架構(gòu)設(shè)計的客觀性。如果在數(shù)據(jù)庫架構(gòu)設(shè)計之前就選定了數(shù)據(jù)庫,架構(gòu)設(shè)計將不可避免地受到數(shù)據(jù)庫功能特性的影響。
2)數(shù)據(jù)庫架構(gòu)原型
在擁有數(shù)據(jù)庫架構(gòu)設(shè)計和完成數(shù)據(jù)庫選型的前提下,我們才能在測試或者開發(fā)環(huán)境構(gòu)建數(shù)據(jù)庫架構(gòu)原型,這是我們下一步工作的基礎(chǔ)。
5.架構(gòu)迭代
1)在完成數(shù)據(jù)庫原型建設(shè)之后,可以開始對數(shù)據(jù)庫原型進行測試和驗證,驗證指標應(yīng)回到最初的需求、業(yè)務(wù)目標、運營目標和監(jiān)管目標。
2)每輪的測試和驗證都會生成架構(gòu)的優(yōu)化項,結(jié)合項目的需求和目標,對數(shù)據(jù)庫架構(gòu)不斷進行迭代,一般在3到5輪迭代之后就可以得到一個相對穩(wěn)定可靠的數(shù)據(jù)庫架構(gòu)。
二、某核心系統(tǒng)由大型機系統(tǒng)遷移到分布式架構(gòu)
1.項目調(diào)研
遷移項目第一步是對當(dāng)前系統(tǒng)的情況進行摸底調(diào)查。
1)容量和性能指標
系統(tǒng)指標分為很多方面,對于數(shù)據(jù)庫架構(gòu)而言,首先需要考慮的是性能和容量指標。
2)業(yè)務(wù)特性
該項目具有一個明顯的特點——實時在線業(yè)務(wù)一次僅處理一個客戶,賬務(wù)結(jié)算和報表模塊一次需要處理很多客戶數(shù)據(jù)。
3)數(shù)據(jù)訪問和處理
通常意義上所說的計算和存儲分離指的是數(shù)據(jù)存儲在大型機文件中,業(yè)務(wù)邏輯完全在應(yīng)用層實現(xiàn)。
4)項目人員能力
項目人員的能力主要集中于JAVA的開發(fā),對于Oracle和MySQL較為熟悉,其他關(guān)系型數(shù)據(jù)庫的開發(fā)則相對陌生,項目人員的能力對于數(shù)據(jù)庫選型有明顯的影響。
2.數(shù)據(jù)庫架構(gòu)原型設(shè)計
1)按照客戶對數(shù)據(jù)進行分片,數(shù)據(jù)路由在應(yīng)用層處理,每個分片都由一個數(shù)據(jù)處理模塊和一組數(shù)據(jù)庫實例組成,不同分片之間完全獨立,跨分片的聚合計算在業(yè)務(wù)層處理。
2)站在數(shù)據(jù)庫本身的視角,不同分片之間的數(shù)據(jù)庫實例是完全獨立的,不存在任何的數(shù)據(jù)交互。站在業(yè)務(wù)的角度,所有的數(shù)據(jù)庫實例則組成了一個統(tǒng)一的數(shù)據(jù)庫集群。
3)該架構(gòu)的優(yōu)點是單分片處理邏輯簡單,對實時在線業(yè)務(wù)非常友好;缺點是跨分片處理邏輯復(fù)雜,報表和賬務(wù)結(jié)算業(yè)務(wù)難度高。
3.數(shù)據(jù)庫選型
1)Oracle和MySQL的對比測試
- Oracle在性能和故障自動恢復(fù)上具有一定的優(yōu)勢,但分布式應(yīng)用架構(gòu)下數(shù)據(jù)庫實例眾多,Oracle的成本要遠高于MySQL。
- MySQL在技術(shù)生態(tài)上與應(yīng)用分布式架構(gòu)更匹配,但需要解決半同步不降級的問題。
2)經(jīng)過架構(gòu)師團隊的討論和權(quán)衡,最終決定使用MySQL衍生數(shù)據(jù)庫,性能與原生MySQL接近,同時半同步不降級,滿足RPO=0
4.運營平臺建設(shè)
1)配置管理:為每個數(shù)據(jù)庫實例添加分片屬性和業(yè)務(wù)屬性。
2)端到端交付:為了滿足數(shù)據(jù)庫實例可以動態(tài)地橫向擴容和縮容,增加了拉入節(jié)點、拉出節(jié)點和資源池的功能。
3)監(jiān)控和故障處理:在原有的數(shù)據(jù)庫監(jiān)控平臺的基礎(chǔ)上,增加了業(yè)務(wù)視角和分片視角,當(dāng)數(shù)據(jù)庫實例故障時,能夠更加精準定位到受影響的客戶。
4)數(shù)據(jù)庫變更:為滿足24小時不停機的業(yè)務(wù)要求,增加了業(yè)務(wù)降級、流量管控、滾動處理和變更日歷功能。
5)版本發(fā)布:在分布式架構(gòu)下,為應(yīng)對成倍上升的復(fù)雜度和風(fēng)險,增加灰度發(fā)布、并行發(fā)布、分片自適應(yīng)和版本編排功能。
5.數(shù)據(jù)庫架構(gòu)迭代
1)為滿足監(jiān)管要求,需要在已有架構(gòu)上添加容災(zāi)架構(gòu)。
- 在生產(chǎn)數(shù)據(jù)中心和容災(zāi)數(shù)據(jù)中心建設(shè)相同的數(shù)據(jù)路由、數(shù)據(jù)處理模塊及對應(yīng)的數(shù)據(jù)庫實例,對應(yīng)的數(shù)據(jù)庫實例之間進行數(shù)據(jù)同步。
- 每個分片都可以獨立在不同的數(shù)據(jù)中心之間自由切換。
- 添加全局數(shù)據(jù)路由,能夠保證將事務(wù)處理路由到正確的數(shù)據(jù)中心處理。
2)使用業(yè)界已有的技術(shù),通過binlog將數(shù)據(jù)實時同步到大數(shù)據(jù)平臺,進行報表分析。
3)使用業(yè)界已有的技術(shù),通過binlog將數(shù)據(jù)實時同步到分片數(shù)據(jù)庫(整體引入),降低賬務(wù)結(jié)算程序的復(fù)雜度。
三、Redis異地容災(zāi)架構(gòu)建設(shè)
1.需求整理
1)所有的Redis僅作為緩存使用,無數(shù)據(jù)同步需求。
2)95%以上的Redis為Cluster架構(gòu),5%以內(nèi)的Redis為哨兵架構(gòu),本次設(shè)計的架構(gòu)聚焦于Cluster架構(gòu)。
3)95%以上的Redis Cluster無容量和性能要求,準確來說就是所有的Redis Cluster都可以標準化,只要后續(xù)提供擴容/縮容的功能即可。
4)生產(chǎn)Redis Cluster變化較大,異地容災(zāi)要求和生產(chǎn)同步上線和下線。
5)最小化DBA和應(yīng)用開發(fā)團隊的人力成本。
2.架構(gòu)實現(xiàn)
1)建設(shè)一個K8S集群,用來承載所有的Redis集群。
2)建設(shè)Redis集群同步平臺,從已有的CMDB讀取生產(chǎn)Redis集群的信息,并將創(chuàng)建的異地容災(zāi)Redis集群信息更新到CMDB。
3)同步進程根據(jù)CMDB生成生產(chǎn)Redis集群集合和異地容災(zāi)集合。生產(chǎn)集合減去異地容災(zāi)集合,即需要搭建的異地容災(zāi)集合,平臺將自動創(chuàng)建異地容災(zāi)集群,并將信息更新到CMDB。異地容災(zāi)集合減去生產(chǎn)集合,即需要下線的異地容災(zāi)集合,平臺將自動下線異地容災(zāi)集群,并將這些集群從CMDB中刪除。
4)每天執(zhí)行上述步驟,即可保證移動容災(zāi)集群和生產(chǎn)集群的同步。
5)K8S集群可以自動拉起宕掉的節(jié)點,結(jié)合Redis集群本身的高可用,即可保證異地容災(zāi)集群的高可用。
6)K8S集群本身的告警監(jiān)控即可滿足異地容災(zāi)的告警和故障處理需求。
7)設(shè)計自助平臺,應(yīng)用開發(fā)和運營團隊可以進行自助查詢、自助修改參數(shù)、自助擴容、自助申請域名等操作,最小化DBA和應(yīng)用開發(fā)運營的人力成本。
王順
平安銀行 數(shù)據(jù)庫運維團隊上海分組負責(zé)人
專注于數(shù)據(jù)庫領(lǐng)域20+年的老兵,目前專注于數(shù)據(jù)庫運維和數(shù)據(jù)庫架構(gòu)。