分庫分表中間件華山論劍

分庫分表中間件

分庫分表的缺點:

  1. 引入分布式事務的問題;
  2. 跨節點 Join 的問題;
  3. 跨節點合并排序分頁等聚合類SQL問題;
  4. 多數據源管理問題;
  5. 擴容縮容,數據遷移等問題;

分庫分表的經驗:

  • 第一原則:能不切分盡量不要切分。
  • 第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。
  • 第三原則:數據切分盡量通過數據冗余或表分組(Table Group)來降低跨庫 Join 的可能。
  • 第四原則:由于數據庫中間件對數據 Join 實現的優劣難以把握,而且實現高性能難度極大,業務讀取盡量少使用多表 Join。

接下來主要比較cobar,mycat,sharding-jdbc三個人氣較高的分庫分表中間件;

1. cobar

Cobar is a proxy for sharding databases and tables,compatible with MySQL protocal and MySQL SQL grama,underlying storage only support MySQL for support foreground business more simple,stable,efficient and safety。
說明cobar的前身是amoeba

網址

  1. cobar github
  2. cobar 官網 -- 無

架構圖

Cobar_architecture

特性

  • 不支持跨庫(數據節點)的關聯操作:join、分頁、排序、子查詢。
  • BLOB, BINARY, VARBINARY字段不能使用。若特殊需求需要這三種字段,禁止使用PreparedStatement的setBlob()或setBinaryStream()方法設置參數。
  • 對于拆分表(分庫表),不能更新已有記錄的拆分字段(分庫字段)值。
  • 只支持MySQL數據節點,使用mysql-jdbc-5.1以上版本,推薦5.1.6或者5.1.12版本。
  • 對于拆分表,插入操作須給出列名,必須包含拆分字段。

備注: cobar限制摘自cobar github

SQL優化示例

  • select * from t_order where partition_key in(...)的優化(根據條件往目標服務器上發送SQL然后對返回的結果merge)
  • select * from t_order where user_id=12 and article_id=10023的優化(兩個字段作為拆分字段:X軸上user_id取模,Y軸上article_id取模)
  • select * from t_order order by txn_time desc limit 100,2的優化(方式1:往所有服務器上發送limit 0, 102然后對返回的結果merge,如果偏移量太大,問題比較嚴重;方式2:假設各個分庫數據分布大致一樣... ...)
  • select sum(price) from t_order group by item_id的優化(往所有服務器上發送select sum(price), item_id from t_order group by item_id order by item_id然后對返回的結果merge)

cobar缺點

  • SQL批處理模式采用SQL并發執行,所以事務會跨庫,可能導致數據不一致;
  • cobar前端后端之間的"寫隊列"可能導致阻塞,MyCAT將數據結構由數組改為鏈表,且達到指定閾值會產生告警日志;
  • 部署雙機cobar負載均衡前提下,可能出現主備兩個庫都在寫數據;原因是cobar啟動時默認第一個datasource進行數據讀寫操作;
  • cobar連接池的缺陷,cobar連接池的管理基于分片,假設db-server1和db-server2上各50個分片,且連接池上限為1000,那么每個片只有20個連接在連接池中;各分片之間的連接池不互通,從而導致饑飽不均--db-server1上可用連接充足但是某分片連接耗盡;
  • 不支持讀寫分離;

來源于MyCAT權威指南

2. MyCAT

MyCAT is an enforced database which is a replacement for MySQL and supports transaction and ACID. MyCAT is combined with the traditional database and new distributed data warehouse. In a word, MyCAT is a fresh new middleware of database. Mycat’s target is to smoothly migrate the current stand-alone database and applications to cloud side with low cost and to solve the bottleneck problem caused by the rapid growth of data storage and business scale.
說明MyCAT的前身是cobar,1.4 版本以后 完全的脫離基本cobar內核;

網址

  1. MyCAT github
  2. MyCAT 官網

特性

  • 遵守Mysql原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理。
  • 基于心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群。
  • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster。
  • 支持單庫內部任意join,支持跨庫2表join,甚至基于caltlet的多表join。
  • 集群基于ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。
  • 支付多租戶;

MyCAT特性來源于MyCAT官網

3. shardding-jdbc

Sharding-JDBC is a JDBC extension, provides distributed features such as sharding, read/write splitting, BASE transaction and database orchestration.

網址

  1. shardding-jdbc github
  2. shardingjdbc 官網

架構圖

sharding-jdbc架構圖

特性

  • Aggregation functions, group by, order by and limit SQL supported in distributed database.
  • Join (inner/outer) query supported.
  • Sharding operator =, BETWEEN and IN supported.
  • Sharding algorithm customization supported.
  • Hint supported(強制主庫路由).
  • BASE Transaction(柔性事務--最大努力送達事務).
  • Read/Write Splitting.
  • Distributed Unique Time-Sequence Generation.

限制

  • 不支持or;(1.5.x之前支持OR,1.5.x之后不再支持,原因是有or時SQL的解析和路由都非常復雜,某些or的SQL性能非常差不適合分布式數據庫使用)
  • 不支持HAVING
  • 不支持UNION & UNION ALL
  • 不支持DISTINCT聚合
  • 不支持存儲過程,函數,游標的操作
  • 不支持執行native的SQL
  • 不支持savepoint相關操作
  • 不支持Schema/Catalog的操作
  • 不支持自定義類型映射

sharding-jdbc限制來源于http://shardingjdbc.io/1.x/docs/01-start/limitations/

分庫分表

  • 支持多分片鍵
  • 支持通過=,BETWEEN,IN分片
  • 支持級聯表
  • 支持多表笛卡爾積查詢
  • 支持多表結果歸并
  • 支持聚合查詢結果歸并
  • 支持AVG函數改寫為SUM/COUNT
  • 支持ORDER BY結果歸并
  • 支持GROUP BY結果歸并
  • 支持LIMIT分頁查詢以及多庫表結果改寫及歸并

輕量級數據庫中間件利器Sharding-JDBC深度解析

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380