天天看點

張亮:Sharding-Sphere成長記

在曆經八個月的緊張開發與精心打磨之後,Sharding-Sphere社群為程式員獻禮,将Sharding-Sphere 3.0.0正式版于10月24日程式員節釋出。在3.0.0釋出之際,寫下此文,與大家共同回顧這段充滿紀念的時光,分享我們的前進曆程。

前序

關注開源圈的同學可能知道,Sharding-Sphere的前身是Sharding-JDBC。

起源

Sharding-JDBC是一套擴充于Java JDBC層的分庫分表中間件,最初起源于當當的内部應用架構ddframe中的資料庫通路層元件。由于分庫分表需求的相對普遍,并且具備獨特的生命力與關注度,是以将其抽離成為獨立的項目,命名為Sharding-JDBC,并于2016年初開源。

Sharding-JDBC的最初目标是透明化分庫分表所帶來的複雜度,包括資料源的管理、根據業務進行的SQL改寫等。作為使用Java語言開發的ddframe架構中的一部分,Sharding-JDBC順其自然的選擇了JDBC作為其分庫分表擴充點的接入端。正如其名稱Sharding-JDBC所昭示,它是在JDBC層進行Sharding(分庫分表)的産品。

核心功能完善

Sharding-JDBC在其後的一年中有條不紊的釋出了1.x的6個大版本更新,分别是:

 ●  奠定了SQL解析、請求路由、SQL改寫、SQL執行和結果歸并的分庫分表的核心模型的1.0.x

 ●  原生支援Spring和行表達式的1.1.x

 ●  最大努力送達型柔性事務的1.2.x

 ●  讀寫分離的1.3.x

 ●  分布式主鍵的1.4.x

 ●  全新SQL解析引擎的1.5.x

分布式治理

在分庫分表功能逐漸成熟之後,在2017年,Sharding-JDBC進入了2.x時代。2.x主要實作的功能是資料庫治理,它可以通過注冊中心提供對配置的集中化和動态化,以及對資料庫和應用進行禁用和熔斷。在此基礎上,還增加了面向OpenTracing協定的鍊路追蹤能力,并且達成了與國内優秀的APM産品Apache SkyWalking(https://github.com/apache/incubator-skywalking)的合作協定,将Sharding-JDBC的追蹤資料對接入SkyWalking,并讓SkyWalking将采用Sharding-JDBC作為其存儲引擎成為可選項。

至此,分庫分表、分布式事務和資料庫治理都有了簡單的雛形。

發展

随着雲原生的普及,應用上雲和對異構語言的無差别支援漸漸成為當今主流。僅支援Java的Sharding-JDBC已經無法滿足雲原生的全部需要,在業界一直争論不休的在用戶端(JDBC或其他語言用戶端)還是服務端(Proxy)進行分片的優劣,也未有定論。

改名、之後再踏征途

2018年春節前夕,随着核心開發人員的加盟,京東數科(當時還叫京東金融)加入了Sharding-JDBC的開發工作中,并将其定位為面向雲化的資料庫中間件。在用戶端進行分庫分表的Sharding-JDBC,雖然可以作為輕量級微服務架構靈活應用,但卻沒有作為雲接入端進行統一管控的能力。是以,一個Proxy接入端呼之欲出。

Sharding-JDBC這個名字在過去的兩年中獲得了大量的積累,已經具備一定的辨識度,開發團隊并不希望完全放棄掉這個名字。是以,最初将新的代理端産品命名為Sharding-JDBC-Server,而将原有的Sharding-JDBC改名為Sharding-JDBC-Driver。

經過了反複的權衡,我們發起了社群投票。最終決定保留Sharding這個關鍵詞,将項目的名稱正式改為Sharding-Sphere,意為分片生态圈。無論是分布式事務還是多資料庫的治理,其本源都是分片;若采用單一的無分片資料庫,後續功能都将無需存在。分片生态圈由根據不同的接入端,由3個子項目組成,它們是基于JDBC用戶端接入的Sharding-JDBC(即原有項目)、基于代理端接入的Sharding-Proxy(今年的重點更新)、以及基于Sidecar模式接入的Sharding-Sidecar(明年的産品規劃)。

3.0.0于此刻正式起航,主要目标是将Sharding-JDBC的能力完全移植入Sharding-Proxy,使其具備支援異構語言的能力。雖然分片的核心邏輯并未變化,但相比于Sharding-JDBC,Sharding-Proxy有兩個難點是需要攻破的。

第一個難點是資料庫協定的實作。将代理端僞裝成為一個資料庫,能夠将接入的成本降至最低。Sharding-Proxy選擇最常用的MySQL協定做為首先支援的資料庫協定,并完整的實作了所有的應用程式運作時所需的協定包(如:COM_QUERY、COM_STMT_PREPARE、COM_STMT_EXECUTE)。目前對于管理端使用的一些協定包還未全部實作。

第二個難點是通信架構。JDBC層的通信是由各個資料庫驅動提供商通過BIO的方式實作的,雖然吞吐量欠佳,但卻容易實作。代理端為了更高的吞吐量,需要采用NIO的方式。Sharding-Proxy采用Netty作為通信架構,在接入層前端實作了完全無鎖的異步通信。目前接入端連接配接後端資料庫時,仍然采用JDBC的方式,未來會将其完全改為Netty異步通信的方式,進一步提升吞吐量,達成前後端完全無鎖通信的目标。以下是Sharding-Proxy的架構圖:

張亮:Sharding-Sphere成長記

在2018年5月,基本可用的Sharding-Proxy随着Sharding-Sphere 3.0.0.M1釋出。

同時,由于多家公司共同參與開發,Sharding-Sphere決定成立社群,将著作權完全歸屬至Sharding-Sphere社群,并成立了項目管理委員會(PMC),并且也完善了貢獻者和送出者的晉升制度。

随着新的裡程碑版本,Sharding-Sphere申請了全新的域名,并重新制作官網,重裝釋出。

擴大範圍、加強合作

Sharding-Sphere的更名,不僅僅是接入端的增強。作為分片生态圈,更完善的分布式事務和資料庫治理,也納入了項目範圍。

Sharding-Sphere将原有的分庫分表功能更名為資料分片,内容包擴核心流程、讀寫分離和分布式主鍵。Sharding-Sphere的核心流程子產品的幾個重點部分可以通過一張圖幫助使用者了解,下面分别是路由引擎、改寫引擎、執行引擎和歸并引擎的剖析圖:

張亮:Sharding-Sphere成長記

Sharding-Sphere對分布式事務進行了重新的設計和定位。廢棄掉原有的最大努力送達型柔性事務,取而代之的是采取剛柔并濟的實作方案:同時支援XA的強一緻事務,以及基于Saga的最終一緻性事務,基于消息的最終一緻性事務也在規劃中。

分布式事務子產品将定位從自研轉向整合,即整合現有的成熟事務方案,為本地事務、XA事務和柔性事務提供統一的分布式事務接口,并盡量彌補各個方案對資料庫層面的缺失。分布式事務子產品提供一套SPI事務處理接口,能夠無縫對接分布式事務的各個實作方案。分布式事務子產品的架構圖如下:

張亮:Sharding-Sphere成長記

Sharding-Sphere經過比較分析,選擇采用Apache ServiceComb的分布式事務解決方案來實作柔性事務, 通過在ServiceComb Saga執行引擎基礎上擴充sql執行子產品,實作了基于分布式Saga的事務執行和復原功能。

分布式事務子產品将于3.1.0的版本釋出,目前仍處于緊張的開發階段。

在資料庫治理方面,Sharding-Sphere全數保留了之前的功能,并提供了全新的APM鍊路追蹤資料,可以通過SkyWalking更直覺的觀測Sharding-Sphere。但目前仍未包括資料庫彈性擴縮功能,該部分功能将于明年規劃。

在高速發展的同時,Sharding-Sphere迎來了新的合作夥伴——翼支付。翼支付成立了創新中心部門,并投入開發資源加入到了Sharding-Sphere的開發團隊。這使得Sharding-Sphere的開源社群更加多元化和健康成長。Sharding-Sphere屬于社群而非公司,是以歡迎有興趣參與開發的公司一起打造更加多元化的社群和更加完善的項目。

上線、然後釋出

在Sharding-Sphere的旗下産品Sharding-Proxy逐漸成熟的同時,京東數科當仁不讓的成為了第一個吃螃蟹的人。京東數科将部分核心業務系統通過小流量 -> 大流量 –> 全流量的流程切換到Sharding-Proxy,目前Sharding-Proxy在生産環境中已經管理并運作着萬級别資料節點。

在經受考驗之後,随之而來的Sharding-Sphere 3.0.0.M2、3.0.0.M3和3.0.0.M4相繼釋出。在經曆了大量的性能調優和功能完善之後,終于在10月24日的程式員節釋出3.0.0穩定版。在經曆了京東數科嚴酷的生産環境驗證後,相信Sharding-Sphere可以成為架構師們進行技術選型時的其中一個參考。

面向未來

Sharding-Sphere 3.0.0的釋出并非終點,而是新的起點。3.1.0已經在同步開發,也将于不久的将來面世,提供更加優化的分布式事務解決方案。計劃于明年開啟的4.0.0對Sidecar模式的接入端以及自動化的彈性伸縮功能也完成了初步規劃。Sharding-Sphere的線路規劃如下圖:

張亮:Sharding-Sphere成長記

大事記

回顧心路曆程,Sharding-Sphere立足于當下,着眼于未來:

2018.2

 ●  Sharding-Sphere團隊更新組建,并開始着手Sharding-Proxy開發。

2018.5

 ●  Sharding-JDBC正式更名為Sharding-Sphere, 同時上線新官網。這預示着它新時代的到來。

 ●  Sharding-Sphere著作版權完全歸屬社群shardingsphere.io,并繼續使用Apache 2.0協定。

 ●  Sharding-Sphere 3.0.0.M1釋出,Sharding-Proxy正式上線。

2018.6

 ●  Sharding-Sphere與Apache ServiceComb建立合作夥伴關系,并開始分布式事務的全面規劃。

 ●  Sharding-Sphere與中國電信旗下翼支付建立合作夥伴關系,共同打造Sharding-Sphere新未來。

2018.8

 ●  Sharding-Proxy上線京東數科生産環境,并經受住了線上大規模生産資料的考驗。

Sharding-Sphere 3.0.0.M2釋出,資料庫治理子產品更新改造,提供更穩定功能。

2018.9

 ●  Sharding-Sphere 3.0.0.M3釋出,提供對XA分布式事務的支援。

 ●  Sharding-Sphere 3.0.0.M4釋出, 改造自動化執行引擎,支援多邏輯資料庫切換,增強鍊路追蹤。

2018.10

 ●  Sharding-Sphere 3.0.0正式版釋出。

如何擷取

Sharding-JDBC

<groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>3.0.0</version>           

Sharding-Proxy

docker pull shardingsphere/sharding-proxy           

源碼

https://github.com/sharding-sphere/sharding-sphere

https://gitee.com/sharding-sphere/sharding-sphere

官網

http://shardingsphere.io

原文釋出時間為:2018-10-26

本文作者:張亮

本文來自雲栖社群合作夥伴“

中生代技術

 ”,了解相關資訊可以關注“

”。