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

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

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

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 協議與大多數主流數據庫服務器通訊。mysql

Mycat

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

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

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

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

  • 支持 SQL92 標準;
  • 支持MySQL、Oracle、DB二、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、DB二、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 定位爲關係型數據庫中間件,旨在充分合理地在分佈式的場景下利用關係型數據庫的計算和存儲能力,而並不是實現一個全新的關係型數據庫。apache

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 老師,一個專一於數據庫領域的分享者。歡迎點贊👍、評論📝、收藏❤️!

相關文章
相關標籤/搜索