從緣起看未來:分佈式數據庫中間件ShardingSphere | 圖書推薦

分佈式數據庫中間件生態圈ShardingSphere是由分佈式數據庫中間件解決方案Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar組成的,它們均提供了標準化的數據分片、分佈式事務和數據庫治理功能,適用於Java同構、異構語言、容器、雲原生等各式各樣的應用場景。

ShardingSphere的初衷是,充分合理地在分佈式的場景下利用關係型數據庫的計算能力和存儲能力,而非實現一個全新的數據庫。ShardingSphere遵循的理念是,通過觀察不常發生改變的事物來獲取其本質。如今,關係型數據庫依然佔有巨大的市場份額,是各個公司的核心業務基石,未來也難於被撼動。ShardingSphere在目前階段的關注點是在原有基礎上擴展功能,而非完全顛覆傳統數據庫的功能。

ShardingSphere已於2018年11月10日正式進入Apache軟件基金會孵化器,並正式被命名爲Apache ShardingSphere。

1 緣起

ShardingSphere從開源至今,悄然地完成了從默默無聞到進入Apache軟件基金會成爲知名項目的進階。目前,已經有70多家公司聲明,在生產環境中使用了Apache ShardingSphere。那麼,它究竟起源於何處,又經歷了怎樣的發展歷程呢?下面我們就一起回顧一下ShardingSphere這兩年來所走過的路。

內部應用框架

ShardingSphere的前身是Sharding-JDBC,它最初是噹噹網架構部開發的內部應用框架dd-frame的其中一個模塊,名爲dd-rdb。這個模塊專門用於數據庫訪問以及簡單的分庫和分表。噹噹網的應用框架緣起於2014年,定位是針對整個電商平臺提供的統一開發框架,它的主要目標如下。

  • 分離技術與業務代碼,封裝技術細節,讓應用開發人員將精力集中在業務開發上。

  • 統一開發框架,使公司中所有項目的架構相似,降低跨組溝通及人員轉組的成本。

  • 提供工具箱,標準化技術組件。

  • 組件可插拔,不強制業務開發人員使用框架的全部內容。

  • 靈活地提供定製化功能,框架本身對引入其他第三方技術組件不做限制。

  • 推動服務化。

  • 提供統一的監控和日誌標準。

  • 模板代碼自動化生成,降低書寫難度。

  • 爲私有云和自動化運維做準備,將系統劃分爲業務、框架、雲平臺、治理幾個層次。

dd-frame的模塊組成如圖1所示。

圖1 dd-frame的模塊組成

dd-frame的核心模塊dd-container的使用方式與Spring Boot類似,只是在2014年時,Spring Boot還未十分流行,因此纔出現了“重複造輪子”的情況。

最初,開發dd-rdb只是爲了使噹噹網內部的MyBatis的使用、數據庫訪問代碼的生成以及基於Spring的多數據源路由等功能更加標準化。然而,隨着對數據分片需求的不斷增加,單純的動態多數據源路由已經無法滿足應用開發方的需求了,因此噹噹網決定在dd-frame的dd-rdb模塊中實現一套完善的數據分片框架。

由於數據分片功能相對獨立,因此噹噹網於2016年年初將此模塊從dd-rdb中剝離,向社區開源,並將其命名爲Sharding-JDBC,表明它是一個在Java的JDBC層實現分庫和分表的數據庫中間層框架。

開源之後,社區討論最多的經典話題之一是,Sharding-JDBC爲何選擇在JDBC層實現數據分片,而不開啓一個獨立的代理層進行數據分片。其實原因很簡單,因爲Sharding-JDBC是由基於Java開發的應用框架dd-frame演化而來的,它本身就是Java框架,而非獨立部署的中間件。

值得一提的是,除了Sharding-JDBC,dd-frame中還開源了另外的兩個項目——DubboX與Elastic-Job。

DubboX是服務化模塊dd-soa的核心組件,是在阿里巴巴開源的Dubbo的基礎上進行的擴展及二次開源,目前DubboX已捐獻回Dubbo,Dubbo已進入Apache孵化階段。

Elastic-Job是作業模塊dd-job的核心組件,是一個分佈式的作業調度框架,分爲可以通過jar提供輕量級服務的Elastic-Job-Lite,以及可以通過Mesos提供一站式資源調度與彈性作業的Elastic-Job-Cloud。

開源歷程

ShardingSphere的前身Sharding-JDBC,是dd-frame 2.x版本中的重點規劃模塊,於2015年9月進入開發階段,歷經3個月的緊張開發與測試,於2015年12月正式完成,其1.0.0版本在噹噹網內部正式發佈。

由於採用dd-frame作爲Java應用腳手架的項目非常多(當時噹噹網70%以上的Java項目中都用到dd-frame),因此憑藉着對dd-frame 1.x的完全兼容,Sharding-JDBC迅速在公司內部推廣開來。由於之前開源的DubboX和Elastic-Job都收穫了良好的口碑,因此Sharding-JDBC自然而然地走上了開源之路。

不少國內的優秀開源產品都是先在公司內部經受時間的充分驗證,然後再剝離業務邏輯和內部環境依賴,最終開源貢獻給社區的。這樣做的好處是產品相對成熟,但也有一些缺憾,具體如下。

  • 後續支持匱乏。產品已經足夠應對公司的業務場景需求,缺乏後續提升的動力。文檔和技術支持也相對較少,甚至會出現文檔和代碼不同步的狀況。

  • 與公司業務場景耦合較爲嚴重。大部分產品都是爲了解決特定領域的問題而產生的,比如有的公司可能並不需要分表,有的公司只需支持幾種預定製的分片策略。

  • 開源不完整。和公司業務耦合緊密的部分無法開源。

  • 缺乏黏性。成型的項目功能繁多、代碼結構複雜,社區志願者難於擴展或修改其核心邏輯。如果測試覆蓋率不夠,便難以保證修改後的代碼質量。以上一系列問題會導致項目與社區間的黏性不高,難於找尋可合作開發的志願者。

  • 分支衆多,難於維護。由於開源之後公司缺乏持續提升的動力,和本公司關係不大的功能需求得不到重視,因此各公司都開發自己的分支。開源項目雖然在最初給社區注入了新鮮思想,但最終並沒有吸取社區的精華。

爲了彌補這些缺憾,噹噹網採用了全新的開源策略,在Sharding-JDBC完成初版的時候即向社區和公司內部同時推廣,這樣做的好處如下。

  • 後續支持完善。Sharding-JDBC與噹噹網內部落地綁定,可以同時獲得來自公司內部和社區的支持。雖然無法承諾社區的優先級高於公司內部的優先級,但開發團隊會綜合考慮社區與公司內部的需求,以更廣闊的視角儘量整合與優化升級路線。

  • 完整開源。代碼的snapshot版本將會首先出現在GitHub上。

  • 共同發展。Sharding-JDBC的初版代碼相對簡單,社區的開源愛好者可以非常輕鬆地理解其核心,爲可持續發展奠定良好基礎,並且Sharding-JDBC也會吸納社區精華,讓更多地愛好者參與代碼貢獻。

堅定了與社區共謀發展的開源路線之後,Sharding-JDBC又經過了兩個月的解耦和精煉,於2016年2月在GitHub上發佈了首個版本。從首次開源至今,Sharding-JDBC經歷了許多“關鍵時刻”。

  • 2016年2月,1.0.0版本發佈,主要功能是分庫和分表,實現了JDBC接口,並且完整實現了SQL解析、SQL改寫、請求路由、結果歸併的標準處理流程。

  • 2016年3月,1.1.0版本發佈,大幅提升了Sharding-JDBC配置的友好度,增加了YAML、Spring命名空間和行表達式的配置方式。

  • 2016年5月,1.2.0版本發佈,實現了最大努力送達型柔性事務,完成了對分佈式事務的初步支持。

  • 2016年6月,1.3.0版本發佈,支持讀寫分離。

  • 2016年11月,1.4.0版本發佈,支持無中心化分佈式自增主鍵。至此,數據分片功能已基本實現。

  • 2017年7月,1.5.0版本發佈,使用全新的自研SQL解析引擎替代了原有的Druid解析引擎,SQL兼容性大幅提升。

  • 017年12月,2.0.0版本發佈,正式將com.dangdang的Maven座標與包名改爲io.shardingjdbc,噹噹網將Sharding-JDBC正式交給社區運作和託管。2.x版本主打數據庫治理功能,同時與Apache SkyWalking達成合作,提供SkyWalking的自動探針,並加入OpenTracing組織。

  • 2018年3月,3.0.0.M1版本發佈。由於京東金融等公司加入開發,Sharding-JDBC經過社區投票,正式更名爲ShardingSphere,將原Sharding-JDBC併入ShardingSphere生態圈,並且新開發了Sharding-Proxy,以透明化數據庫中間層的新形態提供多樣化服務。同時,PMC(項目管理委員會)成立,向實現社區化邁出了重要的一步。

  • 2018年6月,ShardingSphere與Apache ServiceComb達成合作共識,將採用 Apache ServiceComb-saga作爲ShardingSphere柔性事務的決策執行引擎。

  • 2018年10月末,ShardingSphere的3.0.0穩定版本發佈。

  • 2018年“雙11”的前一天,ShardingSphere通過Apache軟件基金會的投票,正式成爲Apache孵化項目,軟件更名爲Apache ShardingSphere。

2 核心功能

在經過了三個主版本的發佈之後,它的穩定性已經過充分的驗證,功能也愈加多樣化。接下來我們將詳細介紹ShardingSphere的三個主要核心功能模塊——數據分片、分佈式事務和數據庫治理。

數據分片

數據分片是提升互聯網應用性能的有效手段,但它也是一把雙刃劍,在性能提升的同時,各種複雜度也隨之而來。正因有數據分片,纔會衍生出分佈式事務和數據庫治理等需求,它是所有數據類分佈式場景的起源。ShardingSphere的名字也起源於Sharding(分片),這是ShardingSphere中最核心的部分。

ShardingSphere同時提供分庫與分表的能力,可以將分庫與分表功能靈活混用,以解決各類場景下的不同問題。

ShardingSphere對垂直分片、水平分片以及讀寫分離等幾種場景的支持都很友好。合理混用分庫、分表與讀寫分離可以最大限度地提升系統的性能。

無論數據分片的邏輯如何複雜,其真實的物理數據庫散落在何方,ShardingSphere始終秉承着向用戶展現一個邏輯數據庫與面向業務邏輯的若干邏輯數據表的理念。使用方工程師無須考慮數據分片的細節,只需面向自己的業務邏輯表編寫SQL即可。

在ShardingSphere目前提供的兩個產品中,對於數據分片的處理流程是完全一致的。流程包括SQL解析、SQL路由、SQL改寫、SQL執行、結果歸併,如圖2所示。

圖10-2 數據分片流程

分佈式事務

ShardingSphere同時支持本地事務、強一致性的XA事務和最終一致性的柔性事務,它允許每次訪問數據庫時自由選擇事務類型。

分佈式事務對業務操作完全透明,極大地降低了接入成本。分佈式事務整合了現有的成熟事務方案,爲本地事務、XA事務和柔性事務提供了統一的分佈式事務接口,彌補了當前方案的不足。因此,提供一站式的分佈式事務解決方案是ShardingSphere分佈式事務模塊的主要設計目標。圖3是ShardingSphere的分佈式事務架構圖。

圖3 ShardingSphere的分佈式事務架構圖

數據庫治理

ShardingSphere提供了註冊中心和應用性能監控這兩個功能,其中數據庫治理方面仍有大量未完成的功能,未來將會陸續開源。

註冊中心用於實現配置集中化和配置動態化。藉助註冊中心,ShardingSphere提供了熔斷和禁用的能力,熔斷是指控制和截流數據庫訪問程序對數據庫的訪問,禁用是指停止對讀寫分離中的某一從庫進行訪問。註冊中心目前支持使用ZooKeeper和etcd。

ShardingSphere並不負責採集、存儲和展示與應用性能監控相關的數據,而是將SQL解析與SQL執行這兩部分數據分片的核心信息發送至應用性能監控系統,並交由其處理。換句話說,ShardingSphere僅負責產生具有價值的數據,並通過標準協議將數據遞交至相關係統。ShardingSphere可以通過兩種方式對接應用性能監控系統。

3 未來規劃

ShardingSphere目前仍在快速發展中,圖4描述了ShardingSphere的詳盡演進路線。

圖4 ShardingSphere的詳盡演進路線

ShardingSphere 1.X版本的主要定位爲面向JDBC驅動的數據分片框架,已經於2016年發佈,經過了近三年的打磨,其功能已趨於完善。

ShardingSphere的2.X版本是對治理的探索,集成了註冊中心和OpenTracing,於2017年發佈,在微服務以及自治理方面進行了很大改進。

截止到本書寫作之時,ShardingSphere的3.0.0正式版已經發布,其中的主要功能組件是Sharding-Proxy。Sharding-Proxy經過了近十個月的開發,已經被京東內部的一級系統逐漸採用。相對於JDBC驅動,增加了Proxy的ShardingSphere生態更加趨於完善。

ShardingSphere的3.1.0版本與3.0.0版本是同步開發的,主要是面向分佈式事務的。在3.0.0版本發佈後不久,3.1.0版本就發佈了。

ShardingSphere的4.X版本仍處於規劃中,預計將增加Database Mesh的基礎組件Sharding-Sidecar,並且完善多數據副本及彈性伸縮功能,爲雲原生和自動化數據庫完成最後的閉環。

作者簡介

張亮,京東數科數據研發負責人,Apache ShardingSphere發起人 & PPMC

熱愛開源,目前主導開源項目ShardingSphere(原名Sharding-JDBC)和Elastic-Job。擅長以Java爲主分佈式架構以及以Kubernetes和Mesos爲主的雲平臺方向,推崇優雅代碼,對如何寫出具有展現力的代碼有較多研究。

目前主要精力投入在將ShardingSphere打造爲業界一流的金融級數據解決方案之上。ShardingSphere已經進入Apache孵化器,是京東集團首個進入Apache基金會的開源項目,也是Apache基金會首個分佈式數據庫中間件。

Apache ShardingSphere(Incubator) 項目地址:https://shardingsphere.apache.org

本文節選自新書《未來架構:從服務化到雲原生》

互聯網架構不斷演化,經歷了從集中式架構到分佈式架構,再到雲原生架構的過程。雲原生因能解決傳統應用升級緩慢、架構臃腫、無法快速迭代等問題而成了未來雲端應用的目標。本書首先介紹架構演化過程及雲原生的概念,讓讀者對基礎概念有一個準確的瞭解,接着闡述分佈式、服務化、可觀察性、容器調度、Service Mesh、雲數據庫等技術體系及原理,並介紹相關的SkyWalking、Dubbo、Spring Cloud、Kubernetes、Istio等開源解決方案,最後深度揭祕開源分佈式數據庫生態圈ShardingSphere的設計、實現,以及進入Apache基金會的歷程,非常適合架構師、雲計算從業人員閱讀、學習。

要想了解更多關於Service Mesh和未來機構趨勢的精彩內容,請點擊這裏購買圖書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章