作者介紹
洪燁,多年銀行業(yè)系統(tǒng)架構(gòu)設(shè)計(jì)及DBA實(shí)戰(zhàn)經(jīng)驗(yàn),2013年出版數(shù)據(jù)庫(kù)書(shū)籍《DB2數(shù)據(jù)庫(kù)內(nèi)部解析與性能調(diào)優(yōu)》。
伴隨著云計(jì)算、分布式技術(shù)的逐步落地,近十年來(lái)數(shù)據(jù)庫(kù)的形態(tài)也發(fā)生了很大變化,各類(lèi)數(shù)據(jù)庫(kù)如雨后春筍般不斷涌現(xiàn)。從架構(gòu)形態(tài)和應(yīng)用功能的角度來(lái)區(qū)分,本文將這些新興的數(shù)據(jù)庫(kù)分為三類(lèi):分布式、NoSQL及云原生數(shù)據(jù)庫(kù)。
過(guò)去關(guān)系型數(shù)據(jù)庫(kù)濫用的時(shí)代已經(jīng)逐漸結(jié)束,分布式、NoSQL及云原生數(shù)據(jù)庫(kù)的出現(xiàn),也帶來(lái)了如SQL已死、NoSQL或NewSQL取代SQL的等各類(lèi)聲音。但以目前的發(fā)展趨勢(shì)來(lái)看,將來(lái)更大可能性是會(huì)出現(xiàn)多種數(shù)據(jù)庫(kù)共存的情況,各個(gè)數(shù)據(jù)庫(kù)奮戰(zhàn)在最適合的場(chǎng)景下。
因此,只有先對(duì)這些數(shù)據(jù)庫(kù)有了深入的理解,才能更好地選擇對(duì)應(yīng)的場(chǎng)景。尤其在商業(yè)銀行場(chǎng)景下,如何通過(guò)這些數(shù)據(jù)庫(kù)來(lái)更好地實(shí)現(xiàn)業(yè)務(wù)訴求,相信是很多銀行仍在持續(xù)探索的方向。
分布式數(shù)據(jù)庫(kù)
2000年左右,以Teradata為代表的MPP架構(gòu)的數(shù)據(jù)庫(kù)在數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)逐步推廣;2013年NewSQL一詞的提出,標(biāo)志著分布式數(shù)據(jù)庫(kù)開(kāi)始進(jìn)軍OLTP負(fù)載的領(lǐng)域。隨著NewSQL不斷發(fā)展成熟,出現(xiàn)了Spanner、TiDB等主要代表性的產(chǎn)品。
分布式數(shù)據(jù)庫(kù)主要是將數(shù)據(jù)分布在多個(gè)物理節(jié)點(diǎn)上,通過(guò)網(wǎng)絡(luò)傳輸?shù)姆绞綄?duì)多個(gè)物理節(jié)點(diǎn)進(jìn)行協(xié)調(diào),以橫向擴(kuò)展的方式突破了單機(jī)數(shù)據(jù)庫(kù)在容量上的限制。但隨之而來(lái)也出現(xiàn)了新的問(wèn)題:如何保證節(jié)點(diǎn)間的數(shù)據(jù)一致性?如何保證多節(jié)點(diǎn)對(duì)外的事務(wù)一致性?如何跨節(jié)點(diǎn)實(shí)現(xiàn)join、聚合、自定義函數(shù)、存儲(chǔ)過(guò)程等原有的SQL操作?
分布式數(shù)據(jù)庫(kù)本質(zhì)而言還是單機(jī)數(shù)據(jù)庫(kù)的擴(kuò)展,如果把單機(jī)數(shù)據(jù)庫(kù)拆開(kāi)來(lái)看(如圖1所示),數(shù)據(jù)庫(kù)的核心組件主要分為服務(wù)層(提供SQL接口,也稱(chēng)SQL引擎層)、引擎層(實(shí)現(xiàn)事務(wù)的ACID,也稱(chēng)為存儲(chǔ)引擎層)及存儲(chǔ)層(實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)及物理存儲(chǔ))。

圖1
存儲(chǔ)層解決節(jié)點(diǎn)間數(shù)據(jù)一致性問(wèn)題
橫向擴(kuò)展為了降低成本,通常會(huì)采用廉價(jià)的硬件,并且由于節(jié)點(diǎn)間需要通過(guò)網(wǎng)絡(luò)傳輸,硬件的不可靠以及網(wǎng)絡(luò)的不可靠也標(biāo)志分布式數(shù)據(jù)庫(kù)本身就處于一個(gè)不可靠的物理環(huán)境,需要通過(guò)額外的手段提升可靠性。
目前主流的實(shí)現(xiàn)方式都是通過(guò)將數(shù)據(jù)寫(xiě)入到多個(gè)副本中,來(lái)確保數(shù)據(jù)的安全,由于網(wǎng)絡(luò)傳輸?shù)南群箜樞颍?jié)點(diǎn)間收到數(shù)據(jù)同步請(qǐng)求也不一致,如果等待全部節(jié)點(diǎn)都同步寫(xiě)入成功,又會(huì)對(duì)性能有較大的影響。
目前數(shù)據(jù)庫(kù)產(chǎn)品通常采用Raft、Paxos等算法或變種來(lái)實(shí)現(xiàn)節(jié)點(diǎn)間數(shù)據(jù)一致性,節(jié)點(diǎn)間的數(shù)據(jù)傳輸通常包含應(yīng)用數(shù)據(jù)、元數(shù)據(jù)及事務(wù)日志。
引擎層保證對(duì)外的事務(wù)一致性
分布式數(shù)據(jù)庫(kù)中不止需要考慮節(jié)點(diǎn)內(nèi)部事務(wù)的一致性,更需要考慮全局事務(wù),主流的工業(yè)實(shí)現(xiàn)在性能以及復(fù)雜度權(quán)衡,目前基本采用二階段提交(2PC)來(lái)實(shí)現(xiàn)。但二階段提交的缺陷在于:
在不同的分布式應(yīng)用架構(gòu)下,實(shí)現(xiàn)一個(gè)分布式事務(wù)要考慮的問(wèn)題并不完全一樣,比如對(duì)多資源的協(xié)調(diào)、事務(wù)的跨服務(wù)傳播等,實(shí)現(xiàn)機(jī)制也是復(fù)雜多變。此外,針對(duì)全局時(shí)鐘及序列的實(shí)現(xiàn)也是數(shù)據(jù)庫(kù)產(chǎn)品的主要關(guān)注點(diǎn)。
服務(wù)層實(shí)現(xiàn)跨節(jié)點(diǎn)的SQL操作
SQL可以按算子處理先后順序?yàn)閽呙琛㈥P(guān)聯(lián)、匯總?cè)齻€(gè)階段,基本上所有SQL語(yǔ)句都包含了掃描階段,部分SQL包含了關(guān)聯(lián)(join)或匯總階段。
對(duì)于只進(jìn)行掃描的SQL(就是SET/PUT某個(gè)表的一條或多條記錄),這種SQL操作比較簡(jiǎn)單,在分布式數(shù)據(jù)庫(kù)中此類(lèi)SQL的性能關(guān)鍵點(diǎn)往往過(guò)濾條件中在于是否包含分布鍵,以及節(jié)點(diǎn)間的數(shù)據(jù)是否存在嚴(yán)重偏移。
包含關(guān)聯(lián)邏輯的SQL語(yǔ)句在分布式數(shù)據(jù)庫(kù)場(chǎng)景下,需重點(diǎn)考慮SQL是否會(huì)引起跨節(jié)點(diǎn)的數(shù)據(jù)傳輸,是否能夠?qū)⑦^(guò)濾和join邏輯下推到本地節(jié)點(diǎn)處理,通常會(huì)對(duì)性能產(chǎn)生極大的影響。聚合操作的SQL通常為group by、order by、having、limit等子句以及聚合函數(shù),數(shù)據(jù)庫(kù)在讀取數(shù)據(jù)之后,需要對(duì)結(jié)果數(shù)據(jù)在協(xié)調(diào)節(jié)點(diǎn)進(jìn)行聚合,因此對(duì)于協(xié)調(diào)節(jié)點(diǎn)的內(nèi)存開(kāi)銷(xiāo)較重,協(xié)調(diào)節(jié)點(diǎn)需要能夠處理大數(shù)據(jù)量的內(nèi)存輪換。對(duì)于以上兩類(lèi)的SQL語(yǔ)句,常見(jiàn)的優(yōu)化方法包含創(chuàng)建本地表、join下推、排序下推、過(guò)濾下推等方式。
整體來(lái)說(shuō),分布式數(shù)據(jù)庫(kù)的優(yōu)勢(shì)在于突破了單機(jī)數(shù)據(jù)庫(kù)的容量限制,多節(jié)點(diǎn)可以實(shí)現(xiàn)高并發(fā);而劣勢(shì)在于,SQL的兼容性較差,落地過(guò)程伴隨著應(yīng)用程序改造,并且由于二階段提交的問(wèn)題,會(huì)導(dǎo)致額外的運(yùn)維成本。
NoSQL數(shù)據(jù)庫(kù)
2010年左右,MongoDB、redis、Neo4j、HBase等各類(lèi)非關(guān)系型數(shù)據(jù)庫(kù)的涌現(xiàn)引發(fā)了大家對(duì)NoSQL的思考,當(dāng)時(shí)也不斷有NoSQL會(huì)替代關(guān)系型數(shù)據(jù)庫(kù)的聲音。隨著近十年來(lái)的發(fā)展,NoSQL數(shù)據(jù)庫(kù)在細(xì)分領(lǐng)域表現(xiàn)得非常優(yōu)異,常見(jiàn)的NoSQL主要包含以下幾類(lèi):
- key-value數(shù)據(jù)庫(kù):一種以鍵值對(duì)存儲(chǔ)數(shù)據(jù)的一種數(shù)據(jù)庫(kù),目前主要代表為Redis。Redis支持存儲(chǔ)的value類(lèi)型包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類(lèi)型)。這些數(shù)據(jù)類(lèi)型都支持push/pop、add/remove、取交集并集和差集等更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,Redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是Redis會(huì)周期性地把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。
- 文檔數(shù)據(jù)庫(kù):面向集合的數(shù)據(jù)庫(kù),無(wú)需進(jìn)行結(jié)構(gòu)定義(簡(jiǎn)單來(lái)講就是不用創(chuàng)建表就可以使用),以MongoDB為代表。所謂“面向集合”(Collection-Oriented),意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中,被稱(chēng)為一個(gè)集合(Collection)。每個(gè)集合在數(shù)據(jù)庫(kù)中都有一個(gè)唯一的標(biāo)識(shí)名,并且可以包含無(wú)限數(shù)目的文檔。集合的概念類(lèi)似關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)里的表(table),不同的是它不需要定義任何模式(schema)。
- 圖數(shù)據(jù)庫(kù):隨著社交、電商、金融、零售、物聯(lián)網(wǎng)等行業(yè)的快速發(fā)展,現(xiàn)實(shí)社會(huì)織起了一張龐大而復(fù)雜的關(guān)系網(wǎng),傳統(tǒng)數(shù)據(jù)庫(kù)很難處理關(guān)系運(yùn)算,以neo4j、ArangoDB等為代表的圖數(shù)據(jù)庫(kù)滿(mǎn)足了此類(lèi)需求,將結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)(從數(shù)學(xué)角度叫做圖)上而不是表中。
- 列簇?cái)?shù)據(jù)庫(kù):大數(shù)據(jù)的興起也帶動(dòng)了列簇?cái)?shù)據(jù)庫(kù)的發(fā)展,主要代表為HBase和Cassandra。列簇?cái)?shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)在列族中,而列簇里的行則把許多列數(shù)據(jù)與本行的“行鍵”關(guān)聯(lián)起來(lái)。行是列的集合,由相似行構(gòu)成的集合就是列族。列族數(shù)據(jù)庫(kù)的各行不一定要具備完全相同的列,并且可以隨意向其中某行加入一列。
目前而言,NoSQL主要是活躍在擅長(zhǎng)的細(xì)分領(lǐng)域,但由于架構(gòu)、成熟度等諸多因素,其在事務(wù)的支持上還需進(jìn)一步完善,并且對(duì)于SQL支持度不高,也導(dǎo)致了研發(fā)人員額外的開(kāi)發(fā)成本,未來(lái)會(huì)向哪些方向發(fā)展有待觀望。
云原生數(shù)據(jù)庫(kù)
2015年,全球市場(chǎng)份額最大的云廠商AWS發(fā)布了云原生的數(shù)據(jù)庫(kù)產(chǎn)品Aurora,提出了log is database的新一代數(shù)據(jù)庫(kù)理念,也從性能及可靠性上與RDS形成了差異化。
隨后各個(gè)云廠商也推出了Aurze SQL Database、PolarDB以及CynosDB等云原生數(shù)據(jù)庫(kù)。在將計(jì)算和存儲(chǔ)等節(jié)點(diǎn)分離之后,各模塊的性能和彈性就可以各自提升,具備應(yīng)對(duì)大規(guī)模存儲(chǔ)的能力。
以Aurura為例,通過(guò)log is database的設(shè)計(jì)哲學(xué),將數(shù)據(jù)的更改變?yōu)橹粚?xiě)日志,即write-once,極大地降低了數(shù)據(jù)庫(kù)的寫(xiě)入操作。同時(shí)為了更好地適應(yīng)云計(jì)算,他們認(rèn)為應(yīng)該將數(shù)據(jù)庫(kù)系統(tǒng)這個(gè)“盒子”打開(kāi),在不同的層面進(jìn)行擴(kuò)展。
Aurora將恢復(fù)子系統(tǒng)委托給底層可靠的存儲(chǔ)系統(tǒng),依賴(lài)這個(gè)來(lái)保障系統(tǒng)服務(wù)層級(jí)(Service Level Agreement, SLA)。使得Aurora在沒(méi)有引入分布式事務(wù)以及無(wú)需對(duì)應(yīng)用進(jìn)行改造的前提下,將性能和彈性擴(kuò)展能力進(jìn)行了極大的提升。
商業(yè)銀行的挑戰(zhàn)與選型思考
對(duì)于商業(yè)銀行而言,隨著國(guó)產(chǎn)化浪潮、線(xiàn)上支付的興起以及大數(shù)據(jù)、AI等新技術(shù)的成熟,銀行IT系統(tǒng)主要發(fā)展向著國(guó)產(chǎn)化、智能化、服務(wù)化的方向演進(jìn)。銀行的IT系統(tǒng)按功能劃分大致可以分為四類(lèi):渠道服務(wù)系統(tǒng)、業(yè)務(wù)前置系統(tǒng)、賬務(wù)處理系統(tǒng)、管理信息系統(tǒng)。
渠道服務(wù)系統(tǒng)與傳統(tǒng)業(yè)務(wù)相比,已經(jīng)與各個(gè)線(xiàn)上平臺(tái)進(jìn)行了相關(guān)對(duì)接,隨著雙11、618等各類(lèi)平臺(tái)的促銷(xiāo)活動(dòng),高并發(fā)的支撐和資源能否快速?gòu)椥詳U(kuò)展成為線(xiàn)上渠道服務(wù)系統(tǒng)的必要考量因素。在這種背景下,可以采用基于私有云的彈性擴(kuò)容以及云原生數(shù)據(jù)庫(kù)的極致擴(kuò)展來(lái)應(yīng)對(duì)此類(lèi)的業(yè)務(wù)爆發(fā)場(chǎng)景。
由于歷史原因,核心賬務(wù)類(lèi)系統(tǒng)目前大多運(yùn)行在IBM的大型機(jī)或小型機(jī)上,此類(lèi)系統(tǒng)作為銀行系統(tǒng)的心臟,并發(fā)高、一致性要求高,且兼顧聯(lián)機(jī)交易及批處理場(chǎng)景,隨著業(yè)務(wù)發(fā)展,面臨著擴(kuò)容成本高、擴(kuò)容難度大的問(wèn)題。
并且隨著國(guó)際形勢(shì)的變化,也必將面臨著國(guó)產(chǎn)化之路,如何將核心數(shù)據(jù)庫(kù)從Power 下移到ARM或?qū)⒊蔀殂y行需要面對(duì)的課題。由于硬件本身的差異性,如何將現(xiàn)在的傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)遷移到分布式數(shù)據(jù)庫(kù)也必將是這個(gè)課題的核心重點(diǎn)和難點(diǎn)。
隨著金融業(yè)務(wù)放寬及渠道的拓展,需要通過(guò)數(shù)據(jù)支撐貸款審批、金融詐騙、洗錢(qián)以及實(shí)時(shí)營(yíng)銷(xiāo)等場(chǎng)景,對(duì)于數(shù)據(jù)類(lèi)系統(tǒng)的實(shí)時(shí)性要求提高,數(shù)據(jù)處理也從傳統(tǒng)的T+1、D+1向著D+0及實(shí)時(shí)的方向轉(zhuǎn)變。在這些需求下,圖數(shù)據(jù)庫(kù)、KV數(shù)據(jù)庫(kù)以及文檔數(shù)據(jù)庫(kù)等也快速地補(bǔ)充了進(jìn)來(lái),提供了多模數(shù)據(jù)處理及實(shí)時(shí)分析的能力。
總體來(lái)說(shuō),個(gè)人理解數(shù)據(jù)庫(kù)的架構(gòu)形態(tài)主要由三個(gè)原因引起:
- 由于業(yè)務(wù)量及數(shù)據(jù)量的增長(zhǎng),對(duì)數(shù)據(jù)庫(kù)的容量提出了新的要求;
- 由于應(yīng)用需求的變化,需要高速處理新型的數(shù)據(jù)類(lèi)型;
- 由于基礎(chǔ)架構(gòu)的進(jìn)步,對(duì)數(shù)據(jù)庫(kù)擴(kuò)展性和性能提出了新的解決方案。
而以上的三類(lèi)挑戰(zhàn),將會(huì)是今后的常態(tài)化現(xiàn)象,未來(lái)會(huì)出現(xiàn)越來(lái)越大的數(shù)據(jù)量要求、更多種類(lèi)的數(shù)據(jù)類(lèi)型,以及更健壯強(qiáng)大的基礎(chǔ)架構(gòu)。而如何不斷地使用新的工具來(lái)應(yīng)對(duì)挑戰(zhàn),打造可擴(kuò)展的系統(tǒng),支撐業(yè)務(wù)發(fā)展和業(yè)務(wù)訴求,必將是銀行業(yè)IT從業(yè)者長(zhǎng)期的使命。
近幾年,云和AI的崛起在數(shù)據(jù)庫(kù)領(lǐng)域碰撞出許多新技術(shù)與新思想。想知道云時(shí)代下數(shù)據(jù)庫(kù)將如何革新與創(chuàng)變?金融行業(yè)核心數(shù)據(jù)庫(kù)遷移與建設(shè)如何安全平穩(wěn)展開(kāi)?來(lái)2020 DAMS中國(guó)數(shù)據(jù)智能管理峰會(huì)上海站尋找答案:
- 《All in Cloud 時(shí)代,下一代云原生數(shù)據(jù)庫(kù)技術(shù)與趨勢(shì)》阿里巴巴集團(tuán)副總裁/達(dá)摩院首席數(shù)據(jù)庫(kù)科學(xué)家 李飛飛(飛刀)
- 《金融行業(yè)分布式數(shù)據(jù)庫(kù)需求及選型》工商銀行 數(shù)據(jù)中心系統(tǒng)三部副總經(jīng)理 趙永田
- 《從自研演進(jìn)看分布式數(shù)據(jù)庫(kù)》中國(guó)銀聯(lián) 云計(jì)算中心團(tuán)隊(duì)主管 周家晶
- 《開(kāi)源數(shù)據(jù)庫(kù)MySQL在民生銀行的應(yīng)用實(shí)踐》民生銀行 項(xiàng)目經(jīng)理 徐春陽(yáng)