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