阿里Mycat 和京東ShardingSphere:分佈式數據庫中間件哪家強?

大家好!我是隻談技術不剪髮的 Tony 老師。今天給大家介紹兩個非常流行的開源分佈式數據庫中間件:Mycat 和 ShardingSphere(包括 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar 3 款產品)。

首先給出它們的功能比較:

Mycat Sharding-JDBC Sharding-Proxy Sharding-Sidecar
官方網站 官方網站 官方網站 官方網站 官方網站
源碼地址 GitHub GitHub GitHub GitHub
官方文檔 Mycat 權威指南 官方文檔 官方文檔 官方文檔
開發語言 Java Java Java Java
開源協議 GPL-2.0/GPL-3.0 Apache-2.0 Apache-2.0 Apache-2.0
數據庫 MySQL
Oracle
SQL Server
PostgreSQL
DB2
MongoDB
SequoiaDB
MySQL
Oracle
SQLServer
PostgreSQL
任何遵循 SQL92 標準的數據庫
MySQL/PostgreSQL MySQL/PostgreSQL
連接數
應用語言 任意 Java 任意 任意
代碼入侵 需要修改代碼
性能 損耗略高 損耗低 損耗略高 損耗低
無中心化
靜態入口
管理控制檯 Mycat-web Sharding-UI Sharding-UI Sharding-UI
分庫分表 單庫多表/多庫單表 ✔️ ✔️ ✔️
多租戶方案 ✔️ -- -- --
讀寫分離 ✔️ ✔️ ✔️ ✔️
分片策略定製化 ✔️ ✔️ ✔️ ✔️
分佈式主鍵 ✔️ ✔️ ✔️ ✔️
標準化事務接口 ✔️ ✔️ ✔️ ✔️
XA強一致事務 ✔️ ✔️ ✔️ ✔️
柔性事務 -- ✔️ ✔️ ✔️
配置動態化 開發中 ✔️ ✔️ ✔️
編排治理 開發中 ✔️ ✔️ ✔️
數據脫敏 -- ✔️ ✔️ ✔️
可視化鏈路追蹤 -- ✔️ ✔️ ✔️
彈性伸縮 開發中 開發中 開發中 開發中
多節點操作 分頁
去重
排序
分組
聚合
分頁
去重
排序
分組
聚合
分頁
去重
排序
分組
聚合
分頁
去重
排序
分組
聚合
跨庫關聯 跨庫 2 表 Join
ER Join
基於 caltlet 的多表 Join
-- -- --
IP 白名單 ✔️ -- -- --
SQL 黑名單 ✔️ -- -- --
存儲過程 ✔️ -- -- --

Mycat

Mycat 是基於阿里 Cobar 演變而來的一款開源分佈式數據庫中間件,是一個實現了 MySQL 協議的 Server。前端用戶可以把它看做是一個數據庫代理,用 MySQL 客戶端工具和命令行訪問;而其後端可以用 MySQL 原生(Native)協議與多個 MySQL 服務器通信,也可以用 JDBC 協議與大多數主流數據庫服務器通信。

Mycat

對於 DBA,MyCat 就是 MySQL Server,而 MyCat 後面連接的 MySQL Server 就好像是 MySQL 的存儲引擎,如 InnoDB、MyISAM 等,因此 Mycat 本身並不存儲數據,數據是在後端的 MySQL 上存儲的,數據可靠性以及事務等都是由 MySQL 保證的。

對於軟件工程師,MyCat 是一個近似等於 MySQL 的數據庫服務器。你可以用連接 MySQL 的方式去連接 MyCat(除了端口不同,MyCat 默認端口是 8066 而非 3306),大多數情況下可以用你熟悉的對象映射框架使用 MyCat。但建議對於分片表,儘量使用基礎的 SQL 語句,因爲這樣能達到最佳性能,特別是幾千萬甚至幾百億條記錄的情況下。

對於架構師,MyCat 是一個強大的數據庫中間件;不僅僅可以用作讀寫分離、以及分表分庫、容災備份,而且可以用於多租戶應用開發、雲平臺基礎設施。讓你的架構具備很強的適應性和靈活性,藉助於即將發佈的 MyCat 智能優化模塊,系統的數據訪問瓶頸和熱點一目瞭然,根據這些統計分析數據,你可以自動或手工調整後端存儲,將不同的表映射到不同存儲引擎上,而整個應用的代碼一行也不用改變。

MyCat 目前的發佈版本爲 1.6,正在開發 Mycat 2.0。提供的關鍵特性包括:

  • 支持 SQL92 標準;
  • 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL 等 DB 的常見 SQL 語法;
  • 遵守 MySQL 原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理;
  • 基於心跳的自動故障切換,支持讀寫分離,支持 MySQL 主從,以及 Galera Cluster 集羣;
  • 支持 Galera for MySQL 集羣,Percona Cluster 或者 MariaDB cluster;
  • 基於 Nio 實現,有效管理線程,解決高併發問題;
  • 支持數據的多片自動路由與聚合,支持 sum、count、max 等常用的聚合函數,支持跨庫分頁;
  • 支持單庫內部任意 join,支持跨庫 2表 join,甚至基於 caltlet 的多表 join;
  • 支持通過全局表,ER 關係的分片策略,實現了高效的多表 join 查詢;
  • 支持多租戶方案;
  • 支持分佈式事務(弱 xa);
  • 支持 XA 分佈式事務(1.6.5);
  • 支持全局序列號,解決分佈式下的主鍵生成問題;
  • 分片規則豐富,插件化開發,易於擴展;
  • 強大的 web,命令行監控;
  • 支持前端作爲 MySQL 通用代理,後端 JDBC 方式支持 Oracle、DB2、SQL Server 、 MongoDB 、巨杉;
  • 支持密碼加密;
  • 支持服務降級;
  • 支持 IP 白名單;
  • 支持 SQL 黑名單、SQL 注入攻擊攔截;
  • 支持 prepare 預編譯指令(1.6);
  • 支持非堆內存(Direct Memory)聚合計算(1.6);
  • 支持 PostgreSQL 的 native 協議(1.6);
  • 支持 mysql 和 Oracle 存儲過程,out 參數、多結果集返回(1.6);
  • 支持 zookeeper 協調主從切換、zk 序列、配置 zk 化(1.6);
  • 支持庫內分表(1.6);
  • 集羣基於 ZooKeeper 管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。

ShardingSphere

Apache ShardingSphere 是一套開源的分佈式數據庫中間件解決方案組成的生態圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(規劃中)這 3 款相互獨立,卻又能夠混合部署配合使用的產品組成。它們均提供標準化的數據分片、分佈式事務和數據庫治理功能,可適用於如 Java 同構、異構語言、雲原生等各種多樣化的應用場景。

ShardingSphere

ShardingSphere 定位爲關係型數據庫中間件,旨在充分合理地在分佈式的場景下利用關係型數據庫的計算和存儲能力,而並非實現一個全新的關係型數據庫。

ShardingSphere 項目由噹噹捐入 Apache,並在京東數科逐漸發展壯大,成爲業界首個 Apache 分佈式數據庫中間件項目(據說當初 Mycat 立志也是希望加入 Apache)。ShardingSphere 已經在 2020 年 4 月 16 日成爲 Apache 頂級項目(Apache官方發佈從 4.0.0 版本開始)。
status
下面我們分別看看組成 ShardingSphere 的 3 款產品。

Sharding-JDBC

Sharding-JDBC 定位爲輕量級 Java 框架,在 Java 的 JDBC 層提供的額外服務。它使用客戶端直連數據庫,以 jar 包形式提供服務,無需額外部署和依賴,可理解爲增強版的 JDBC 驅動,完全兼容 JDBC 和各種 ORM 框架。

Sharding-JDBC

  • 適用於任何基於 JDBC 的 ORM 框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template 或直接使用 JDBC。
  • 支持任何第三方的數據庫連接池,如:DBCP、C3P0、BoneCP、Druid、HikariCP 等。
  • 支持任意實現 JDBC 規範的數據庫。目前支持 MySQL、Oracle、SQLServer、PostgreSQL 以及任何遵循 SQL92 標準的數據庫。

Sharding-Proxy

Sharding-Proxy 屬於和 Mycat 對標的產品,它定位爲透明化的數據庫代理端,提供封裝了數據庫二進制協議的服務端版本,用於完成對異構語言的支持。目前先提供 MySQL/PostgreSQL 版本,它可以使用任何兼容 MySQL/PostgreSQL 協議的訪問客戶端(如:MySQL Command Client、MySQL Workbench、Navicat 等)操作數據,對 DBA 更加友好。

Sharding-Proxy

  • 嚮應用程序完全透明,可直接當做 MySQL/PostgreSQL 使用。
  • 適用於任何兼容 MySQL/PostgreSQL 協議的的客戶端。

Sharding-Sidecar

Sharding-Sidecar 目前正在規劃中,定位爲 Kubernetes 的雲原生數據庫代理,以 Sidecar 的形式代理所有對數據庫的訪問。 通過無中心、零侵入的方案提供與數據庫交互的的齧合層,即 Database Mesh,又可稱數據網格。

Sharding-Sidecar
Database Mesh 的關注重點在於如何將分佈式的數據訪問應用與數據庫有機串聯起來,它更加關注的是交互,是將雜亂無章的應用與數據庫之間的交互有效的梳理。使用 Database Mesh,訪問數據庫的應用和數據庫終將形成一個巨大的網格體系,應用和數據庫只需在網格體系中對號入座即可,它們都是被齧合層所治理的對象。

混合架構

Sharding-JDBC 採用無中心化架構,適用於 Java 開發的高性能的輕量級 OLTP 應用;Sharding-Proxy 提供靜態入口以及異構語言的支持,適用於 OLAP 應用以及對分片數據庫進行管理和運維的場景。

shardingsphere-hybrid
ShardingSphere 是多接入端共同組成的生態圈。 通過混合使用 Sharding-JDBC 和 Sharding-Proxy,並採用同一註冊中心統一配置分片策略,能夠靈活的搭建適用於各種場景的應用系統,架構師可以更加自由的調整適合於當前業務的最佳系統架構。

總結

Mycat 和 ShardingSphere 都是非常流行的開源分佈式數據庫中間件,各自具有一些獨特的功能,也有很多企業成功應用的案例。通過個人比較這兩者的官方文檔、社區活躍度等信息,目前 Apache ShardingSphere 體系更加完善,社區更加活躍。這兩者都是國人開源產品中的佼佼者,希望能夠越來越好!

另外,還有一款值得關注的分佈式數據庫中間件 DBLE(專注於 MySQL),可以看做 Mycat 增強版。

我是隻談技術不剪髮的 Tony 老師,一個專注於數據庫領域的分享者。歡迎點贊👍、評論📝、收藏❤️!

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