分库分表中间件华山论剑

分库分表中间件

分库分表的缺点:

  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阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335