1; 支持 支持 累加聚合 SELECT count(*) FROM t_order; SELECT sum(user_id) FROM t_order; 支持 支持 比較聚合 SELECT max(user_id) FROM t_order; SELE" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對(duì)比 Vitess,ShardingSphere 有哪些不同

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-30 14:31 ? 次閱讀

本篇為InfoQ中文站供稿

原文鏈接:
https://www.infoq.cn/article/NHSAAmN*MfpLiTiTTEu5?from=timeline&isappinstalled=0

ShardingSphere 是什么?

ShardingSphere 是一套開(kāi)源的分布式數(shù)據(jù)庫(kù)中間件解決方案組成的生態(tài)圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(規(guī)劃中)這 3 款相互獨(dú)立的產(chǎn)品組成。他們均提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫(kù)治理功能,可適用于如 Java 同構(gòu)、異構(gòu)語(yǔ)言、容器、云原生等各種多樣化的應(yīng)用場(chǎng)景。ShardingShpere 在剛剛過(guò)去的雙十一之前通過(guò)了 Apache 基金會(huì)的投票,正式進(jìn)入孵化器,成為 Apache 的首個(gè)分布式數(shù)據(jù)庫(kù)中間件。
ShardingSphere 可以采用混合使用 Sharding-JDBC 和 Sharding-Proxy 的部署方式滿足在線 + 管理的能力,也可以獨(dú)立使用 Sharding-JDBC 或 Sharding-Proxy。ShardingSphere 希望可以通過(guò)多元化的接入端架構(gòu)去滿足不同需求。

wKgaombRZzqAftIOAAKUC89FPm4636.png

Vitess 是什么?

Vitess源起于 Youtube,現(xiàn)已屬于 PlanetScale 的開(kāi)源產(chǎn)品。它致力于部署、擴(kuò)展和管理大型 MySQL 實(shí)例集群的數(shù)據(jù)庫(kù)解決方案。它結(jié)合了許多重要的 MySQL 功能和 NoSQL 數(shù)據(jù)庫(kù)的可擴(kuò)展性,提供數(shù)據(jù)分片、分布式事務(wù)以及管理大量 MySQL 實(shí)例等功能。

wKgaombRZzuAR6CxAAJMq4qKqL0673.png


Vitess 由負(fù)責(zé)元數(shù)據(jù)存儲(chǔ)的 Topology、負(fù)責(zé)應(yīng)用接入和 SQL 路由的 vtgate、負(fù)責(zé)重寫(xiě)和執(zhí)行 SQL 的 vttablet 以及兩類管理工具 vtctl(用于命令行) 和 vtctld(用于圖形界面) 等服務(wù)組件共同構(gòu)成。用戶可以通過(guò)支持 MySQL 協(xié)議的客戶端,或使用 Vitess 的客戶端 API 使用 Vitess。

應(yīng)用功能對(duì)比

面對(duì)這兩個(gè)同樣優(yōu)秀的產(chǎn)品,用戶該在何種場(chǎng)景下選用哪款產(chǎn)品,想必有所糾結(jié)。本文接下來(lái)將使用 Vitess v2.2 和 ShardingSphere 3.0.0,從應(yīng)用功能和管理功能的角度,以官方文檔為基礎(chǔ),進(jìn)行測(cè)試對(duì)比,盡可能展示出兩者在已有功能和實(shí)現(xiàn)思路側(cè)重點(diǎn)上的不同。

接入方式

Vitess 通過(guò)組件 vtgate 作為中心化的接入代理,用戶可以通過(guò) Vitess 的 gRPC 連接器或各類 MySQL 原生驅(qū)動(dòng)進(jìn)行連接。Vitess 的 gRPC 連接器目前僅支持 Java 和 Go 兩種語(yǔ)言,若使用原生驅(qū)動(dòng)則沒(méi)有語(yǔ)言限制,目前 Vitess 支持 MySQL 和 MariaDB 兩種數(shù)據(jù)庫(kù)。
ShardingSphere 提供 Proxy 和 JDBC 兩種接入方式,其中 Sharding-Proxy 和 vtgate 類似,提供了中心化的接入代理,用戶可以通過(guò) MySQL 原生驅(qū)動(dòng)進(jìn)行連接,理論上支持所有開(kāi)發(fā)語(yǔ)言,目前同樣支持 MySQL 和 MariaDB 數(shù)據(jù)庫(kù);Sharding-JDBC 可理解為增強(qiáng)版的 JDBC 驅(qū)動(dòng),提供無(wú)中心化的輕量級(jí)運(yùn)行方式,讓客戶端直連數(shù)據(jù)庫(kù),無(wú)網(wǎng)絡(luò)二次轉(zhuǎn)發(fā)的消耗。由于是 JDBC 的增強(qiáng),因此沒(méi)有數(shù)據(jù)庫(kù)類型的限制,可以支持 MySQL、Oracle、SQLServer 和 PostgreSQL 等。
通過(guò)表格,可以更直觀的比較雙方的接入方式區(qū)別:

Vitess Sharding-Proxy Sharding-JDBC
中心化
靜態(tài)入口 無(wú)
異構(gòu)語(yǔ)言 原生驅(qū)動(dòng)任意 gRPC 僅 Java 和 Go 任意 僅 Java
數(shù)據(jù)庫(kù) MySQL 和 MariaDB MySQL 和 MariaDB 任意

分片模式

Vitess 在分片上采用了每個(gè)數(shù)據(jù)庫(kù)實(shí)例均創(chuàng)建一個(gè)分庫(kù),并且不進(jìn)行分表的方式,即多實(shí)例單庫(kù)單表。由于 Vitess 的分片模式相對(duì)固定,因此在配置分片時(shí)通過(guò) JSON 指定分片表、分片字段和分片算法,分片之后的庫(kù)名由 Vitess 自動(dòng)管理,表名不變。
ShardingSphere 支持單獨(dú)分庫(kù)、單獨(dú)分表和同時(shí)分庫(kù)分表的分片方式,并且提供四種不同的分片策略以及能夠讓用戶自行實(shí)現(xiàn)分片算法,使得用戶能夠更加自由地控制數(shù)據(jù)分片。
單純描述有些抽象,接下來(lái)分別創(chuàng)建一個(gè)分片的例子進(jìn)行測(cè)試.
首先模仿 Vitess 官方文檔的測(cè)試用例,創(chuàng)建了一個(gè)名為 testkeyspace 的鍵空間(keyspaces),為其設(shè)置了 2 個(gè)分片。同時(shí)指定了 t_order 和 t_order_item 兩張分表,分別使用 user_id 和 order_id 進(jìn)行 Hash 分片。
在建表完畢后,通過(guò) DataGrip 客戶端分別連接 vtgate 和實(shí)際 MySQL 實(shí)例進(jìn)行查看。
vtgate 執(zhí)行 show databases 和 show tables。

wKgZombRZzyAN5xKAAFR_NxG7Pk698.png

從 MySQL 實(shí)例的拓?fù)淇闯?,Vitess 在每一個(gè)分片數(shù)據(jù)庫(kù)實(shí)例中,都創(chuàng)建了一個(gè) vt${keyspace_name}的庫(kù),并且將建表語(yǔ)句廣播到所有數(shù)據(jù)庫(kù)執(zhí)行。
同樣模仿 ShardingSphere 的官方樣例,在 Sharding-Proxy 中配置 test_keyspace 分庫(kù)及 t_order,t_order_item 兩張分表。為了區(qū)別 ShardingSphere 和 Vitess 的分片能力,這里選用同時(shí)分庫(kù)分表的方式進(jìn)行分片,通過(guò) user_id 取余進(jìn)行分庫(kù)、order_id 取余進(jìn)行分表。
在進(jìn)行配置的時(shí)候,可以利用 InlineShardingStrategy 直接使用 Groovy 表達(dá)式簡(jiǎn)化配置,如本例中可簡(jiǎn)化配置為:

test_keyspace_${user_id % 2}

t_order_${order_id % 2}

t_order_item_${order_id % 2}

在建表完畢后,通過(guò) DataGrip 客戶端分別連接 Sharding-Proxy 和實(shí)際 MySQL 實(shí)例進(jìn)行查看。
Sharding-Proxy 執(zhí)行 show databases 和 show tables:

wKgaombRZzyARn8HAAD3M_iPH_E420.jpg


)
MySQL 實(shí)例中的拓?fù)浣Y(jié)構(gòu):

wKgZombRZz6AF6yPAAD2tKlTmFw054.jpg


同樣通過(guò)表格,直觀的展示兩者分片上的區(qū)別:

Vitess ShardingSphere
分庫(kù) 支持 支持
分表 不支持 支持
分庫(kù) + 分表 不支持 支持
配置方式 JSON Groovy 或?qū)崿F(xiàn)接口
多 Schema 切換 支持 支持

由此可見(jiàn),ShardingSphere 和 Vitess 在分片模式上有著很大的區(qū)別,ShardingSphere 具有更豐富更自由的分片方式,能夠應(yīng)付更多的應(yīng)用場(chǎng)景。

SQL 支持

由于 SQL 語(yǔ)法靈活復(fù)雜,分布式數(shù)據(jù)庫(kù)和單機(jī)數(shù)據(jù)庫(kù)的查詢場(chǎng)景又不完全相同,難免有和單機(jī)數(shù)據(jù)庫(kù)不兼容的 SQL 出現(xiàn)。針對(duì)該問(wèn)題,Vitess 和 ShardingSphere 都在官方文檔中進(jìn)行了說(shuō)明。
在 ShardingSphere 中,對(duì)于已支持和未支持的 SQL 種類作出了明確的標(biāo)注,對(duì)于常用的分頁(yè)、排序、分組、聚合都進(jìn)行了支持,并支持部分關(guān)聯(lián)查詢,具體內(nèi)容可以通過(guò)官方文檔 使用規(guī)范 > SQL 中進(jìn)行查閱。
而 Vitess 暫時(shí)沒(méi)有明確的文檔標(biāo)明已支持和未支持的 SQL 種類,只在 FAQ 中的test-case標(biāo)注了當(dāng)前已經(jīng)出現(xiàn)的未支持的 SQL 的情況。
為了更直觀地展示兩者 SQL 支持情況,這里選取了一部分常用的 SQL 類型,根據(jù)文檔說(shuō)明并結(jié)合實(shí)際測(cè)試結(jié)果,列出參考列表:

SQL 類型 測(cè)試 SQL Vitess ShardingSphere
全表查詢 SELECT * FROM t_order; 支持 支持
等值查詢 SELECT FROM t_order WHERE user_id = 7;
SELECT FROM t_order WHERE user_id = 7 and order_id=9;
支持 支持
范圍查詢 SELECT FROM t_order WHERE user_id in (7, 9);
SELECT FROM t_order WHERE user_id BETWEEN 7 AND 10;
SELECT FROM t_order WHERE user_id=7 or user_id=11;
SELECT FROM t_order WHERE user_id > 1;
支持 支持
累加聚合 SELECT count(*) FROM t_order; SELECT sum(user_id) FROM t_order; 支持 支持
比較聚合 SELECT max(user_id) FROM t_order;
SELECT min(user_id) FROM t_order;
支持 支持
平均聚合 SELECT avg(order_id) FROM t_order; 不支持 支持
分組 SELECT user_id, MAX(order_id) FROM t_order GROUP BY user_id;
SELECT sum(user_id), order_id FROM t_order GROUP BY order_id;
SELECT sum(user_id), test_int FROM t_order GROUP BY test_int;
SELECT count(order_id), status FROM t_order GROUP BY status; (status 為 VARCHAR 類型)
前 3 句支持 第 4 句不支持 支持
排序 / 分頁(yè) SELECT FROM t_order ORDER BY user_id;
SELECT FROM t_order ORDER BY user_id LIMIT 10, 10;
不支持 支持
去重 SELECT DISTINCT test_int FROM t_order; 支持 不支持
算式 SELECT * FROM t_order WHERE user_id=7+1; 支持 支持
關(guān)聯(lián)查詢 SELECT a.user_id, a.order_id, a.status, b.item_id FROM t_order a JOIN t_order_item b ON a.order_id = b.order_id;
SELECT a.user_id, a.test_int, a.status, b.item_id, b.user_id FROM t_order a JOIN t_order_item b ON a.test_int = b.user_id;
支持 支持
子查詢 SELECT x.user_id,x.status,x.item_id FROM (SELECT a.user_id, a.order_id, a.status, b.item_id FROM t_order a JOIN t_order_item b ON a.order_id = b.order_id) x;
SELECT count(x.item_id) FROM (SELECT a.user_id, a.order_id, a.status, b.item_id FROM t_order a JOIN t_order_item b ON a.order_id = b.order_id) x;
SELECT * FROM t_order WHERE test_int in (SELECT test_int FROM t_order);
第 1 句支持 后 2 句不支持 前 2 句支持 第 3 句不支持
UNION SELECT user_id, order_id, status FROM t_order UNION ALL SELECT item_id, order_id, user_id FROM t_order_item 不支持 不支持
INSERT INSERT INTO t_order (order_id, user_id, status, test_int) VALUES (1000, 1, “INIT”, 1);
INSERT INTO t_order (order_id, user_id, status, test_int) VALUES (1001, 2, “INIT”, 2), (1002, 3, “INIT”, 3);
支持 支持
無(wú)列名 INSERT INSERT INTO t_order VALUES (1000, 1, “INIT”, 1); 不支持 支持
DELETE DELETE FROM t_order WHERE user_id=1;
(條件有分片鍵) DELETE FROM t_order WHERE test_int=1;(條件無(wú)分片鍵) 支持 支持
UPDATE UPDATE t_order SET test_int=1 WHERE user_id=0; 支持 支持
分片鍵 UPDATE UPDATE t_order SET user_id=1 WHERE user_id=0; 不支持 不支持
CREATE CREATE TABLE messages (page BIGINT(20) UNSIGNED,time_created_ns BIGINT(20) UNSIGNED,message VARCHAR(10000),PRIMARY KEY (page, time_created_ns)) ENGINE=InnoDB 支持 支持
ALTER ALTER TABLE messages ADD COLUMN status VARCHAR(50); 支持 支持
DROP DROP TABLE messages; 支持 支持
TCL BEGIN; COMMIT; ROLLBACK; 支持 支持
DAL USE test_keyspace; DESC t_order;
SHOW CREATE TABLE t_order; 支持 支持
DCL CREATE USER ‘test_user’@’%’ IDENTIFIED BY ‘test’;
GRANT SELECT, INSERT ON test_keyspace. TO ‘test_user’@’%’;
REVOKE INSERT ON test_keyspace. FROM ‘test_user’@’%’;
DROP USER ‘test_user’@’%’;
不支持 支持

從測(cè)試結(jié)果看來(lái),對(duì)于常用的 SQL 類型,無(wú)論是 Vitess 還是 ShardingSphere 都可以比較好的支持。但是 Vitess 無(wú)法支持排序,因此也無(wú)法支持分頁(yè)對(duì)于部分應(yīng)用來(lái)說(shuō)可能是比較嚴(yán)重的問(wèn)題。相比 Vitess,ShardingSphere 除 DISTINCT 關(guān)鍵字以外,其他類型的 SQL 支持程度均持平或略有優(yōu)勢(shì)。通過(guò) SharingSphere 的官方 issue 列表中可知,DISTINCT 的支持目前正在進(jìn)行中,相信不久之后就會(huì)支持。

分片路由

分布式數(shù)據(jù)庫(kù)將數(shù)據(jù)進(jìn)行分片的主要目的之一就是希望執(zhí)行的操作能分散在一個(gè)或其中數(shù)個(gè)分片中,而不是在所有分片中,因此如何觸發(fā)分片路由,縮小分片范圍也是需要重點(diǎn)關(guān)注的功能。
Vitess 在 VSchema Guide 文檔說(shuō)明 Select、Update、Delete 通過(guò) Where 條件中的等值條件進(jìn)行路由,等值條件僅包括了 = 及 IN;Insert 則根據(jù)插入字段是否包含分片鍵來(lái)進(jìn)行分片路由。
ShardingSphere 除了支持 Where 條件中的 = 及 IN 進(jìn)行分片路由之外,還可以通過(guò) BETWEEN 進(jìn)行分片路由 (需要使用 RangeShardingAlgorithm 或 ComplexShardingStrategy),Insert 時(shí)同樣根據(jù)插入字段來(lái)進(jìn)行分片路由。
為了驗(yàn)證分片路由的執(zhí)行條件,首先要開(kāi)啟 MySQL 數(shù)據(jù)庫(kù)的 GENERAL_LOG 參數(shù)

SET GLOBAL GENERAL_LOG = 1;

SHOW VARIABLES LIKE '%general_log%';

開(kāi)啟該參數(shù)之后,MySQL 數(shù)據(jù)庫(kù)將會(huì)記錄所有執(zhí)行過(guò)的 SQL,通過(guò)查看分片庫(kù)中實(shí)際執(zhí)行的 SQL,來(lái)判斷是分片路由還是廣播。
之后在 Vitess 中執(zhí)行數(shù)個(gè)測(cè)試 SQL:

SELECT * FROM t_order WHERE user_id = 7;

SELECT * FROM t_order WHERE user_id in (7, 9);

SELECT * FROM t_order WHERE user_id=7 or user_id=11;

SELECT * FROM t_order WHERE user_id BETWEEN 7 AND 11;

從 Vitess 分片 1 的 general_log,找到 Mysql 實(shí)際執(zhí)行了如下 SQL:

select * from t_order where user_id in (9)

select * from t_order where (user_id = 7 or user_id = 11)

select * from t_order where user_id between 7 and 11

從 Vitess 分片 2 的 general_log,找到 Mysql 實(shí)際執(zhí)行了如下 SQL:

select * from t_order where user_id = 7

select * from t_order where user_id in (7)

select * from t_order where (user_id = 7 or user_id = 11)

select * from t_order where user_id between 7 and 11

由于 user_id=7 屬于分片 2,所以 SQL1 不會(huì)分發(fā)到分片 1 中,而 SQL2 也被實(shí)際改寫(xiě),只將 user_id=9 分發(fā)到了分片 1,說(shuō)明對(duì)于 = 以及 IN,Vitess 的確能夠正確進(jìn)行路由分片; 因?yàn)?user_id 7 和 11 均屬于分片 2,所以對(duì)于等值 OR 查詢 Vitess 并沒(méi)有解析到條件內(nèi)部,而是直接執(zhí)行了廣播。
然后在 ShardingSphere 中執(zhí)行測(cè)試 SQL:

SELECT * FROM t_order WHERE order_id = 1007 AND user_id=7;

SELECT * FROM t_order WHERE order_id = 1007;

SELECT * FROM t_order WHERE order_id in (1007, 1008);

SELECT * FROM t_order WHERE order_id in (1007, 1009);

SELECT * FROM t_order WHERE order_id=1007 or order_id=1011;

從 ShardingSphere 分片 1 的 general_log,發(fā)現(xiàn) Mysql 實(shí)際執(zhí)行了如下 SQL:

SELECT * FROM t_order_1 WHERE order_id = 1007

SELECT * FROM t_order_0 WHERE order_id in (1007, 1008)

SELECT * FROM t_order_1 WHERE order_id in (1007, 1008)

SELECT * FROM t_order_1 WHERE order_id in (1007, 1009)

SELECT * FROM t_order_1 WHERE order_id=1007 or order_id=1011

SELECT * FROM t_order_1 WHERE order_id=1007 or order_id=1010

SELECT * FROM t_order_0 WHERE order_id=1007 or order_id=1010

從 ShardingSphere 分片 2 的 general_log,發(fā)現(xiàn) Mysql 實(shí)際執(zhí)行了如下 SQL:

SELECT * FROM t_order_1 WHERE order_id = 1007 AND user_id=7

SELECT * FROM t_order_1 WHERE order_id = 1007

SELECT * FROM t_order_0 WHERE order_id in (1007, 1008)

SELECT * FROM t_order_1 WHERE order_id in (1007, 1008)

SELECT * FROM t_order_1 WHERE order_id in (1007, 1009)

SELECT * FROM t_order_1 WHERE order_id=1007 or order_id=1011

SELECT * FROM t_order_1 WHERE order_id=1007 or order_id=1010

SELECT * FROM t_order_0 WHERE order_id=1007 or order_id=1010

ShardingSphere 的等值查詢和 Vitess 一樣,能準(zhǔn)確的確定對(duì)應(yīng)分片表進(jìn)行查詢,當(dāng) SQL 中存在庫(kù)級(jí)分片鍵 user_id 時(shí)(SQL1),ShardingSphere 只將 SQL 定位在了分片 2 的 t_order_1 分表;而查詢不帶有庫(kù)級(jí)分片時(shí)(SQL2),ShardingSphere 進(jìn)行了庫(kù)級(jí)的廣播,但仍然能夠?qū)?SQL 定位在 t_order_1 表;而對(duì)于 IN 方式,雖然能夠準(zhǔn)確的定位到分片表,但是不會(huì)對(duì) IN 的條件進(jìn)行重寫(xiě)(分片 1 的 SQL2-4);對(duì)于 OR 的等值查詢,ShardingSphere 能夠定位到具體的分片,比 Vitess 優(yōu)秀;最后由于測(cè)試用例使用的是 InlineShardingStrategy,因此無(wú)法對(duì) BETWEEN AND 的 SQL 進(jìn)行測(cè)試。
經(jīng)過(guò)測(cè)試,Vitess 和 ShardingSphere 都可以對(duì)等值條件進(jìn)行準(zhǔn)確的分片路由;ShardingSphere 相比于 Vitess 多支持了 OR 等值的分片路由,并且在實(shí)現(xiàn)了特定算法或特定策略時(shí),還能夠支持 BETWEEN AND 的分片路由。
另外,對(duì)于強(qiáng)制分片路由,Vitess 在 FAQ 中回答需要用戶直接連接到對(duì)應(yīng)分片的 vttablet 進(jìn)行操作,而 ShardingSphere 支持 Hint 方式進(jìn)行強(qiáng)制分片路由,依舊使得分片對(duì)應(yīng)用透明。由此看來(lái),ShardingSphere 在分片路由上的功能,也要略強(qiáng)于 Vitess。

路由條件 Vitess ShardingSphere
= 值 正確路由 正確路由
IN 正確路由 正確路由
OR 等值 直接廣播 正確路由
BETWEEN AND 直接廣播 正確路由需要用戶實(shí)現(xiàn)特定算法接口

結(jié)果歸并

當(dāng)分片路由將 SQL 路由到多個(gè)分片,或無(wú)法使用分片路由而進(jìn)行廣播時(shí),如何將多個(gè)分片的結(jié)果合并為一個(gè)正確的結(jié)果,就涉及到結(jié)果歸并。
Vitess 在文檔中沒(méi)有對(duì)結(jié)果歸并詳細(xì)的說(shuō)明,從在之前的 SQL 測(cè)試中能夠發(fā)現(xiàn),Vitess 對(duì)于一般的結(jié)果僅是簡(jiǎn)單的將各個(gè)分片的結(jié)果集按照分片順序連接起來(lái);對(duì)于部分聚合的結(jié)果歸并,如 count 和 sum,Vitess 能夠正確的進(jìn)行合并;但是對(duì)于一些復(fù)雜的歸并類型,比如 avg 或 order by 的結(jié)果歸并,就無(wú)法支持;在測(cè)試過(guò)程中,還發(fā)現(xiàn) Vitess 會(huì)對(duì) Limit 的分頁(yè) SQL 進(jìn)行改寫(xiě),比如分頁(yè) SQL

SELECT * FROM t_order LIMIT 10,10;

就會(huì)改寫(xiě)成

SELECT * FROM t_order LIMIT 20;

然后將 2 個(gè)分片的結(jié)果集合并之后再獲取 10~20 的結(jié)果。
ShardingSphere 在文檔 歸并引擎 一節(jié)中對(duì)結(jié)果歸并有非常詳細(xì)的描述,將歸并分類為遍歷、排序、分組、分頁(yè)和聚合 5 種類型。不僅和 Vitess 一樣能夠?qū)⒎制慕Y(jié)果集普通地連接起來(lái),而且還支持了 avg 和 order by 的結(jié)果歸并。同時(shí)對(duì)于 Limit 分頁(yè) SQL,也進(jìn)行了改寫(xiě)。
正是由于 ShardingSphere 對(duì)結(jié)果歸并有著更好的支持,所以 ShardingSphere 在 SQL 支持上能夠比 Vitess 表現(xiàn)的更好。

分布式事務(wù)

事務(wù)是數(shù)據(jù)庫(kù)中一個(gè)重要且常用的功能,對(duì)于分布式數(shù)據(jù)庫(kù)而言同樣不可或缺。因此 Vitess 和 ShardingSphere 都提供了一些可選的分布式事務(wù)功能。
Vitess 提供了 3 個(gè)級(jí)別的分布式事務(wù),單庫(kù)事務(wù)、多庫(kù)事務(wù)、兩階段提交事務(wù),用戶可選擇其中一種作為 Vitess 的分布式事務(wù)實(shí)現(xiàn):

單庫(kù)事務(wù)指的是僅允許單個(gè)數(shù)據(jù)庫(kù)事務(wù)。嘗試超出單個(gè)數(shù)據(jù)庫(kù)的任何事務(wù)都將失敗。

多庫(kù)事務(wù)允許事務(wù)跨越多個(gè)數(shù)據(jù)庫(kù),但每個(gè)數(shù)據(jù)庫(kù)均為單獨(dú)提交,即弱 XA,可能會(huì)出現(xiàn)部分提交導(dǎo)致數(shù)據(jù)不一致,且無(wú)法回滾。

兩階段提交類似于多庫(kù)事務(wù),但能保持多數(shù)據(jù)庫(kù)間的原子性,即其中一個(gè)數(shù)據(jù)庫(kù)提交失敗時(shí),其他數(shù)據(jù)庫(kù)的提交將會(huì)回滾以保持?jǐn)?shù)據(jù)一致。

ShardingSphere 同樣提供了 3 種類型的分布式事務(wù),本地事務(wù)、XA 事務(wù)及柔性事務(wù)(開(kāi)發(fā)中,預(yù)計(jì) 3.1.0 發(fā)布):

本地事務(wù)類似于 Vitess 的多庫(kù)事務(wù),各個(gè)數(shù)據(jù)庫(kù)獨(dú)立提交,即弱 XA。

XA 事務(wù)即兩階段提交事務(wù),默認(rèn)采用 Atomikos 事務(wù)管理器。

柔性事務(wù)采用 SAGA 模型進(jìn)行事務(wù)控制,以保證數(shù)據(jù)的最終一致性。其中 ShardingSphere 在 3.x 之前的版本也使用過(guò)最大努力送達(dá)型事務(wù),但由于無(wú)回滾能力,因此已經(jīng)廢棄,轉(zhuǎn)而使用能力更加強(qiáng)大的 SAGA。

Vitess 和 ShardingSphere 當(dāng)前版本的分布式事務(wù)功能相當(dāng),但是 Vitess 的官方文檔和 roadmap 計(jì)劃中,似乎沒(méi)有實(shí)現(xiàn)柔性事務(wù)的計(jì)劃,因此一旦 ShardingSphere 3.1.0 中支持柔性事務(wù),在分布式事務(wù)功能上將能支持更多的應(yīng)用場(chǎng)景。

讀寫(xiě)分離

Vitess 的不提供默認(rèn)的讀寫(xiě)分離功能,但是提供在 SQL 中通過(guò) @指定的方式進(jìn)行從庫(kù)的查詢,例如在 SQL 中通過(guò) ks@master 將查詢指向主庫(kù),而使用 ks@replica 或 ks@rdonly 將查詢指向從庫(kù)或備庫(kù)。
ShardingSphere 的讀寫(xiě)分離功能只需要在配置中指定主庫(kù)和從庫(kù),ShardingSphere 能自動(dòng)地將 DML 路由至主庫(kù),DQL 路由至從庫(kù);同時(shí) ShardingSphere 允許多個(gè)從庫(kù)并配置負(fù)載均衡策略將請(qǐng)求疏導(dǎo)到不同的從庫(kù);另外 ShardingSphere 還可以通過(guò) Hint 進(jìn)行強(qiáng)制主庫(kù)路由。
ShardingSphere 的讀寫(xiě)分離功能,無(wú)論從對(duì) SQL 的入侵程度,還是從功能的實(shí)現(xiàn)程度,都略強(qiáng)于 Vitess 的讀寫(xiě)分離。

分布式主鍵

Vitess 的分布式主鍵,用戶可通過(guò)設(shè)定全局非分片的外部查詢表來(lái)實(shí)現(xiàn)。如 Vitess 在官方文檔中的用例,將 user_id(主分片鍵)列配上全局序列表 user_seq,組成自增分布式主鍵;
ShardingSphere 提供靈活的配置分布式主鍵生成策略方式。 在分片規(guī)則配置中可配置每個(gè)表的主鍵生成策略,默認(rèn)使用雪花算法(snowflake)生成 64bit 的長(zhǎng)整型數(shù)據(jù)。ShardingSphere 的雪花算法的時(shí)間紀(jì)元從 2016 年 11 月 1 日零點(diǎn)開(kāi)始,可以使用到 2156 年,相信能滿足絕大部分系統(tǒng)的要求。

管理功能對(duì)比

配置管理

Vitess 將數(shù)據(jù)庫(kù)信息、分片信息等元數(shù)據(jù)信息,存儲(chǔ)在 zookeeper 或 Etcd 注冊(cè)中心中,并配以 GUI 系統(tǒng) vtctld 和命令行系統(tǒng) vtctl 對(duì) Vitess 的功能進(jìn)行管理和控制。同時(shí) Vitess 提供 workflows,將一些常用操作流程,變成可控制的工作流,使運(yùn)維人員能夠自動(dòng)快速地執(zhí)行諸如主從切換、數(shù)據(jù)遷移、平衡分片等操作。
ShradingSphere 同樣可以將分片信息,配置信息等元數(shù)據(jù),存儲(chǔ)在 zookeeper 或 Etcd 注冊(cè)中心中,但暫時(shí)沒(méi)有提供 GUI 或命令控制臺(tái)功能,對(duì)配置和 ShardingSphere 程序進(jìn)行控制和管理,用戶需要在 zookeeper 或 Etcd 的 API 或自帶的控制臺(tái)中,修改其中的信息。

監(jiān)控

Vitess 在 vtagate 和 vttablet 中提供了簡(jiǎn)易的 GUI,用戶通過(guò) GUI 頁(yè)面不僅能夠查看 Vitess 本身部分組件的健康狀況,QPS 等信息,還能獲取一部分底層數(shù)據(jù)庫(kù)的監(jiān)控信息。
ShardingSphere 自身并不提供監(jiān)控,但是可以通過(guò)一些 APM 系統(tǒng)進(jìn)行應(yīng)用監(jiān)控。目前 ShardingSphere 提供兩種方式對(duì)接應(yīng)用性能監(jiān)控系統(tǒng):

使用 OpenTracing API 發(fā)送性能追蹤數(shù)據(jù)。面向 OpenTracing 協(xié)議的 APM 產(chǎn)品都可以和 ShardingSphere 自動(dòng)對(duì)接,比如 SkyWalking,Zipkin 和 Jaeger。

使用 SkyWalking 的自動(dòng)探針。

數(shù)據(jù)庫(kù)管理

Vitess 提供了備份數(shù)據(jù)庫(kù)數(shù)據(jù)的功能,能將數(shù)據(jù)庫(kù)的數(shù)據(jù)、配置,連同 vttablet 一同備份到 NFS、云存儲(chǔ)或本地文件系統(tǒng)中,在備份的過(guò)程中,還能進(jìn)行自動(dòng)壓縮以提高備份效率,并且 Vitess 可以從備份中快速創(chuàng)建出 vttable 并加入集群中。Vitess 還提供了主從切換和重設(shè)主從關(guān)系的功能,該功能不僅可以由 DBA 有計(jì)劃的使用 workflow 執(zhí)行,還可以在數(shù)據(jù)庫(kù)節(jié)點(diǎn)失效或有問(wèn)題時(shí)自動(dòng)執(zhí)行。Vitess 也提供了重分片 (Resharding) 的數(shù)據(jù)遷移方式,使得用戶能夠在修改分片規(guī)則后平滑地將舊分片的數(shù)據(jù)遷移到新分片上,Vitess 會(huì)在新分片上復(fù)制,驗(yàn)證和保持?jǐn)?shù)據(jù)最新,而現(xiàn)有分片繼續(xù)提供實(shí)時(shí)讀寫(xiě)流量。當(dāng) Vitess 準(zhǔn)備切換時(shí),只需幾秒鐘的只讀停機(jī)時(shí)間即可進(jìn)行遷移。在切換執(zhí)行期間,可以讀取現(xiàn)有數(shù)據(jù),但無(wú)法寫(xiě)入新數(shù)據(jù)。
ShardingSphere 目前僅提供了熔斷實(shí)例和禁用從庫(kù)的功能,在 roadmap 中還規(guī)劃實(shí)現(xiàn)多數(shù)據(jù)副本和彈性伸縮的功能。

總結(jié)

Vitess 和 ShardingSphere 作為當(dāng)下優(yōu)秀的數(shù)據(jù)庫(kù)中間件和分布式數(shù)據(jù)庫(kù)解決方案,在數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫(kù)治理等功能上均有所建樹(shù),但是雙方在功能側(cè)重上有部分差異。
關(guān)于數(shù)據(jù)分片、分布式事務(wù)等 OTLP 應(yīng)用功能方面,ShardingSphere 比 Vitess 提供了更豐富和自由的分片方式、提供了更多的 SQL 支持和更容易觸發(fā)的分片路由、提供了侵入性更低的讀寫(xiě)分離并即將提供更多種的分布式事務(wù)類型。因此 ShardingSphere 在應(yīng)用功能方面要強(qiáng)于 Vitess。
而關(guān)于管理方面的功能,Vitess 相比 ShardingSphere 增加了 GUI 的控制方式、提供了數(shù)據(jù)庫(kù)的備份和主從切換功能、并提供部分自身和數(shù)據(jù)庫(kù)的監(jiān)控。因此 Vitess 在管理方面的功能要優(yōu)于 ShardingSphere。
ShardingSphere 還在快速發(fā)展中,未來(lái)也會(huì)對(duì)數(shù)據(jù)庫(kù)治理及彈性數(shù)據(jù)遷移做大量工作。如果目前想找一個(gè)完美的在線功能 + 管理功能的解決方案,可以混合部署,在線查詢更新用 ShardingSphere,然后使用 Vitess 進(jìn)行數(shù)據(jù)的管理和監(jiān)控,并可以自行開(kāi)發(fā)插件,同步 Vitess 和 ShardingSphere 的注冊(cè)中心配置,使其動(dòng)態(tài)生效。
最后,通過(guò)一個(gè)簡(jiǎn)單的表格,總結(jié)一下 Vitess 和 ShardingSphere 的對(duì)比結(jié)論:

Vitess ShardingSphere
分片模式 僅分庫(kù) 分庫(kù) + 分表 + 分庫(kù)分表
SQL 支持 略少于 ShardingSphere 略多于 Vitess
分片路由 支持 = 和 IN 支持 =、IN、OR、BETWEEN AND 允許用戶 Hint 強(qiáng)制路由
分布式事務(wù) 1PC(弱 XA)和 2PC(強(qiáng) XA) 1PC(弱 XA)、2PC(強(qiáng) XA) 將支持柔性事務(wù) SAGA
讀寫(xiě)分離 在 SQL 中指向主庫(kù)或從庫(kù) 配置之后由 ShardingSphere 自動(dòng)路由
分布式主鍵 通過(guò)全局非分片序列表實(shí)現(xiàn) 實(shí)現(xiàn)接口,默認(rèn)使用雪花算法
配置管理 支持 Zookeeper 和 Etcd 提供 2 類管理端 支持 Zookeeper 和 Etcd 暫無(wú)管理端
數(shù)據(jù)庫(kù)治理 提供簡(jiǎn)單數(shù)據(jù)庫(kù)監(jiān)控 提供數(shù)據(jù)備份、主從切換、重分片數(shù)據(jù)遷移等 僅提供熔斷、禁用從庫(kù)功能



審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    與傳統(tǒng)模式的芯片設(shè)計(jì)進(jìn)行對(duì)比FPGA芯片哪些優(yōu)勢(shì)

    FPGA是什么?FPGA何作用?與傳統(tǒng)模式的芯片設(shè)計(jì)進(jìn)行對(duì)比,F(xiàn)PGA芯片哪些優(yōu)勢(shì)?
    發(fā)表于 09-14 07:59

    關(guān)于ARM上的Vitess資料合集

    1、如何解決 arm 上 Vitess 的大部分依賴問(wèn)題Vitess 為大規(guī)模 MySQL 集群實(shí)例管理/擴(kuò)展/部署提供了解決方案。它結(jié)合了 NoSQL 的可擴(kuò)展性和 MySQL的很多
    發(fā)表于 03-30 10:05

    Vitess在aarch64上的依賴問(wèn)題詳解

    。MySQL 與 NoSQL權(quán)衡下圖是Vitess與MySQL/NoSQL之間的對(duì)比。支持的平臺(tái)和數(shù)據(jù)庫(kù)支持的平臺(tái)官方對(duì)Ubuntu 14.04和debian 8做了持續(xù)性地測(cè)試。其它平臺(tái)也應(yīng)該能正常工作。支持
    發(fā)表于 07-11 14:30

    在arm機(jī)器上如何編譯vitess并運(yùn)行l(wèi)ocal用例呢

    AppArmor某些MySQL版本默認(rèn)的AppArmor配置不能被Vitess識(shí)別。如果沒(méi)有關(guān)閉,可能會(huì)遇到下面的錯(cuò)誤使用下面命令將AppArmor關(guān)閉,并重啟機(jī)器以確保其生效?;蛘邔ysqld設(shè)置為
    發(fā)表于 07-11 14:46

    M261各種休眠方式的對(duì)比嗎?

    M261各種休眠方式的對(duì)比嗎?比較器,DAC等在休眠時(shí)可運(yùn)行? 哪種休眠方試電流最???
    發(fā)表于 06-20 07:25

    SWD的接口對(duì)比JTAG接口什么優(yōu)勢(shì)?

    SWD的接口對(duì)比JTAG接口什么優(yōu)勢(shì)
    發(fā)表于 10-09 07:09

    內(nèi)轉(zhuǎn)子電機(jī)對(duì)比外轉(zhuǎn)子電機(jī)什么優(yōu)勢(shì)?

    內(nèi)轉(zhuǎn)子電機(jī)對(duì)比外轉(zhuǎn)子電機(jī)什么優(yōu)勢(shì)
    發(fā)表于 10-09 07:53

    FT232對(duì)比CH430什么優(yōu)勢(shì)?

    FT232對(duì)比CH430什么優(yōu)勢(shì)
    發(fā)表于 10-09 07:06

    異步電機(jī)對(duì)比同步電機(jī)什么優(yōu)點(diǎn)?

    異步電機(jī)對(duì)比同步電機(jī)什么優(yōu)點(diǎn)
    發(fā)表于 10-11 06:21

    卡爾曼濾波算法對(duì)比其他的濾波算法什么優(yōu)點(diǎn)?

    卡爾曼濾波算法對(duì)比其他的濾波算法什么優(yōu)點(diǎn)
    發(fā)表于 10-11 06:42

    ZYNQ對(duì)比其他處理器什么優(yōu)勢(shì)?

    ZYNQ對(duì)比其他處理器什么優(yōu)勢(shì)
    發(fā)表于 11-07 07:01

    投影機(jī)對(duì)比度:究竟差距多大

    投影機(jī)對(duì)比度:究竟差距多大 翻開(kāi)目前不同品牌的投影機(jī)產(chǎn)品資料,對(duì)比度指標(biāo)一定會(huì)引起您的注意,因?yàn)樵谶@個(gè)指標(biāo)中,不同品牌、同檔次的
    發(fā)表于 02-06 09:41 ?4468次閱讀

    幾種芯片的對(duì)比

    幾種芯片的對(duì)比,,希望幫助對(duì)大家
    發(fā)表于 01-20 17:31 ?2次下載

    51單片機(jī)總線與非總線的程序什么不同詳細(xì)對(duì)比資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)總線與非總線的程序什么不同詳細(xì)對(duì)比資料說(shuō)明。
    發(fā)表于 06-12 17:46 ?1次下載
    51單片機(jī)總線與非總線的程序<b class='flag-5'>有</b>什么不同詳細(xì)<b class='flag-5'>對(duì)比</b>資料說(shuō)明

    YouTube數(shù)據(jù)庫(kù)如何保存巨量視頻文件?

    主要的數(shù)據(jù)庫(kù)是由 Vitess 支撐的 MySQL,Vitess是一個(gè)數(shù)據(jù)庫(kù)集群系統(tǒng),用于 MySQL 的水平擴(kuò)展。另外,使用 Memcache 實(shí)現(xiàn)緩存并使用 Zookeeper 進(jìn)行節(jié)點(diǎn)的協(xié)調(diào)。
    的頭像 發(fā)表于 01-08 11:23 ?710次閱讀