sharding-jdbc与Sharding-Proxy

Sharding-JDBC

Sharding-JDBC 采用在 JDBC 层扩展分库分表,支持读写分离,是一个以 jar 形式提供服务的轻量级组件,其核心思路是小而美地完成最核心的事情,基于 JDBC 层进行分片的好处是轻量、简单、兼容性好以及无需额外的运维工作。缺点是无法跨语言,目前仅支持 Java。

Sharding-JDBC 适用场景

对于关系型数据库数据量很大的情况,需要进行水平拆库和拆表(即分库和分表),这种场景很适合使用 Sharding-JDBC。
举例说明:假设有一亿数据的用户库,放在 MySQL 数据库里查询性能会比较低,而采用水平拆库,将其分为 10 个库,根据用户的 ID 模10,这样数据就能比较平均的分在 10 个库中,每个库只有 1000w 记录,查询性能会大大提升。分片策略类型非常多,大致分为 Hash +Mod、Range、Tag 等。
Sharding-JDBC 还提供了读写分离的能力,用于减轻写库的压力。

Sharding-JDBC 不合适的场景

  1. 不适合 OLAP 的场景。虽然 Sharding-JDBC 也能做聚合分组查询,但大量的 OLAP 场景,仍然会比较慢,而且复杂的SQL(如子查询等)目前还没有支持。这种查询不太适合大数据和高并发的互联网 online 数据库,建议使用合理的 OLTP 查询(OLTP:联机事务处理(Online Transaction Processing))。
  2. 不适合事务强一致的要求。目前 Sharding-JDBC 的事务支持两种,一种是弱 XA,另一种是柔性事务(BASE)。因为 XA的两阶段或三阶段提交其性能较低,因此互联网公司基本不会采用。而无论是弱 XA还是柔性事务,都无法保证事务在任意时间段完全保证一致,其中柔性事务能保证数据的最终一致性,但达到最终一致性的时间仍然不可控。因此对于对跨库事务强一致要求很高的场景,需要从设计方面去考虑数据库schema 的合理性。

对于 JTA 事务,目前 Shariding-JDBC 没有实现 JTA 的标准。而且由于在互联网场景下使用 JTA 比较少见,因此暂时不支持 JTA 事务。

性能测试报告如下:

  1. 使用Sharding-JDBC,性能是大家最关心的问题。在数据量一致的情况下,使用Sharding-JDBC和原生JDBC的性能测试报告如下:
    查询操作:Sharding-JDBC的TPS为JDBC的TPS的99.8%。
    插入操作:Sharding-JDBC的TPS为JDBC的TPS的90.2%。
    更新操作:Sharding-JDBC的TPS为JDBC的TPS的93.1%。
    可以看到,Sharding-JDBC在查询中的性能损失非常低,插入和更新略高。

将单表的数据拆分为二,放入两个表中,使用Sharding-JDBC和原生JDBC的性能测试报告如下:
查询操作:TPS双库比单库可以增加大约94%的性能。
插入操作:TPS双库比单库可以增加大约60%的性能。
更新操作:TPS双库比单库可以增加大约89%的性能。
结果表明,Sharding-JDBC可有效利用水平扩展大幅度提升性能。

sharding-jdbc架构图

image.png

sharding-jdbc与sharding-proxy相似性以及区别

从设计理念上看确实有一定的相似性。主要流程都是SQL 解析 -> SQL 路由 -> SQL 改写 -> SQL 执行 -> 结果归并。但架构设计上是不同的。sharding-proxy是基于 Proxy,它复写了 MySQL 协议,将 服务 伪装成一个 MySQL 数据库,而 Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的。

sharding-jdbc支持读写分离

Sharding-JDBC 从 1.3.0 开始支持读写分离。其功能包括:

  1. 根据配置区分写库和多个读库,目前暂时只有轮训策略选取读库,可以配合分库分表使用。
  2. 通过 Hint 强制指定某次查询走写库。
  3. 如果在同一线程且同一数据库连接中有发现 DML 语句,则该 DML 之后的查询都从写库查询,DML 之前的 DQL 语句不受影响,仍然查询读库。其目的是保持同一用户线程的数据一致性。
    但限于 Sharding-JDBC 本身设计的考虑,数据库层面的主从切换以及主从数据同步,Sharding-JDBC并不负责。Sharding-JDBC 定位仍然是轻量级的增强版数据库驱动。因此由于主库和从库同步延迟导致的数据不一致,并不是Sharding-JDBC 的处理范畴。

官网参考:http://shardingsphere.io/document/current/en/quick-start/

Sharding-Proxy简介

Sharding-Proxy架构

image.png

Sharding-Proxy的定位是透明化的数据库代理,它封装了数据库二进制协议,用于完成对异构语言的支持。目前兼容MySQL和PG,可以使用任何兼容MySQL或PG协议的客户端进行访问,比如MySQL命令行、MySQL Workbench、Navicat等等,对DBA更加友好。
整个架构可以分为前端、后端和核心组件三部分。
前端负责与客户端进行网络通信,采用的是基于NIO的客户端/服务器框架,在Windows和Mac操作系统下采用NIO 模型,Linux系统自动适配为Epoll模型。通信的过程中完成对MySQL协议的编解码。核心组件得到解码的MySQL命令后,开始调用Sharding-Core对SQL进行解析、路由、改写、结果归并等核心功能。后端与真实数据库的交互目前借助于Hikari连接池。

sharding-jdbc与sharding-proxy比较

  1. Sharding-JDBC是Sharding-Sphere的第一个产品,也是Sharding-Sphere的前身。
    它定位为轻量级Java框架,在Java的JDBC层提供分库分表、读写分离、数据库治理、柔性事务等服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
  2. Sharding-Proxy是Sharding-Sphere的第二个产品。
    它定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。
    Sharding-Proxy屏蔽了底层的分库分表,您可以像使用一个简单的数据库一样来操作分库分表的数据。目前提供MySQL版本,它可以使用任何兼容MySQL协议的访问客户端(如:MySQL Command Client, MySQLWorkbench等)来访问Sharding-Proxy,进而进行DDL/DML等操作来变更数据,对DBA更加友好。

目前分库分表的中间件有两种思想,分别是:
1.类似 Sharding-JDBC 及 TDDL 的增强版 JDBC 驱动思想
2.类似 Sharding-proxy 增加中间层,然后在中间层进行分库分表思想

JDBC 驱动版的优点:
1、轻量,范围更加容易界定,只是 JDBC 增强,不包括 HA、事务以及数据库元数据管理
2、开发的工作量较小,无需关注 nio,各个数据库协议等
3、运维无需改动,无需关注中间件本身的 HA
4、性能高,JDBC 直连数据库,无需二次转发
5、可支持各种基于 JDBC 协议的数据库,如:MySQL,Oralce,SQLServer

Proxy 版的优点:
1、可以负责更多的内容,将数据迁移,分布式事务等纳入 Proxy 的范畴
2、更有效的管理数据库的连接
3、整合大数据思路,将 OLTP 和 OLAP 分离处理
因此两种方式互相可以互补,建议使用 Java 的团队,且仅 OLTP 的互联网前端操作。有可能会使用多种数据库的情况,可以选择 JDBC层的中间件;如果需要 OLAP 和 OLTP 混合,加以重量级的操作,如数据迁移,分布式事务等,可以考虑 Proxy 层的中间件。

参考:https://www.pianshen.com/article/396172812/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343