分库分表 - ShardingSphere

 1 总述

Mycat 和 ShardingSphere(包括 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar 3 款产品)都是非常流行的开源分布式数据库中间件,各自具有一些独特的功能,也有很多企业成功应用的案例。通过个人比较这两者的官方文档、社区活跃度等信息,目前 Apache ShardingSphere 体系更加完善,社区更加活跃。

这两者都是国人开源产品中的佼佼者,希望能够越来越好!另外,还有一款值得关注的分布式数据库中间件 DBLE(专注于 MySQL),可以看做 Mycat 增强版。

X.1 比较

MycatSharding-JDBCSharding-ProxySharding-Sidecar
官方网站官方网站官方网站官方网站官方网站
源码地址GitHubGitHubGitHubGitHub
官方文档Mycat 权威指南官方文档官方文档官方文档
开发语言JavaJavaJavaJava
开源协议GPL-2.0/GPL-3.0Apache-2.0Apache-2.0Apache-2.0
数据库MySQL
Oracle
SQL Server
PostgreSQL
DB2
MongoDB
SequoiaDB
MySQL
Oracle
SQLServer
PostgreSQL
任何遵循 SQL92 标准的数据库
MySQL/PostgreSQLMySQL/PostgreSQL
连接数
应用语言任意Java任意任意
代码入侵需要修改代码
性能损耗略高损耗低损耗略高损耗低
无中心化
静态入口
管理控制台Mycat-webSharding-UISharding-UISharding-UI
分库分表单库多表/多库单表✔️✔️✔️
多租户方案✔️------
读写分离✔️✔️✔️✔️
分片策略定制化✔️✔️✔️✔️
分布式主键✔️✔️✔️✔️
标准化事务接口✔️✔️✔️✔️
XA强一致事务✔️✔️✔️✔️
柔性事务--✔️✔️✔️
配置动态化开发中✔️✔️✔️
编排治理开发中✔️✔️✔️
数据脱敏--✔️✔️✔️
可视化链路追踪--✔️✔️✔️
弹性伸缩开发中开发中开发中开发中
多节点操作分页
去重
排序
分组
聚合
分页
去重
排序
分组
聚合
分页
去重
排序
分组
聚合
分页
去重
排序
分组
聚合
跨库关联跨库 2 表 Join
ER Join
基于 caltlet 的多表 Join
------
IP 白名单✔️------
SQL 黑名单✔️------
存储过程✔️------

X.2 Mycat

Mycat 是基于阿里 Cobar 演变而来的一款开源分布式数据库中间件,是一个实现了 MySQL 协议的 Server。前端用户可以把它看做是一个数据库代理,用 MySQL 客户端工具和命令行访问;而其后端可以用 MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信。
Mycat

对于 DBA,MyCat 就是 MySQL Server,而 MyCat 后面连接的 MySQL Server 就好像是 MySQL 的存储引擎,如 InnoDB、MyISAM 等,因此 Mycat 本身并不存储数据,数据是在后端的 MySQL 上存储的,数据可靠性以及事务等都是由 MySQL 保证的。

对于软件工程师,MyCat 是一个近似等于 MySQL 的数据库服务器。你可以用连接 MySQL 的方式去连接 MyCat(除了端口不同,MyCat 默认端口是 8066 而非 3306),大多数情况下可以用你熟悉的对象映射框架使用 MyCat。但建议对于分片表,尽量使用基础的 SQL 语句,因为这样能达到最佳性能,特别是几千万甚至几百亿条记录的情况下。

对于架构师,MyCat 是一个强大的数据库中间件;不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施。让你的架构具备很强的适应性和灵活性,借助于即将发布的 MyCat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

MyCat 目前的发布版本为 1.6,正在开发 Mycat 2.0。提供的关键特性包括:支持 SQL92 标准;
支持MySQL、Oracle、DB2、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、DB2、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开发版)。

X.3 ShardingSphere

Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

ShardingSphere

ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。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,并采用同一注册中心统一配置分片策略,能够灵活的搭建适用于各种场景的应用系统,架构师可以更加自由的调整适合于当前业务的最佳系统架构。

2 ShardingSphere

分库分表为了解决数据库在不同机器上部署实现离散存储,提高并发处理能力的qps和tps;

分表不分库为了解决单表数据量过大带来的qps或tps瓶颈问题;

分库后会导致事务使用繁琐,只能由分布式事务来实现事务机制,因此能不分库就不分库;

X.1 为什么要分库分表

X.2 水平拆分与垂直拆分

  • 对于库来说:垂直拆分就是把一个单库拆成多个子库,如用户库、订单库、风控库;水平拆分就是把相同给功能的库复制多份。
  • 对于表来说:垂直拆分就是把一个单表拆成多个子表,如字段比较多的表可以把冷热数据拆分出来;水平拆分就是把相同功能的表复制多份。

X.2 一主一从/读写分离

写走主,读走从。主从结构搭建详见mysql博文

X.3  分库分表策略

方式:分库分表、分库不分表、分表不分库

逻辑表

数据节点

ds$->{0..1}.ds_user$->{0..1} 表示分成ds0/ds1两个库,ds_user0/ds_user1两个表

分片策略

把crud逻辑数据落到对应的库对应的表中,组装好要访问的数据库和数据表对应的sql 

分库分表案例

  


分库不分表案例 

分表不分库案例  

注意: 如上图,设置为分片的字段age必须出现在value和字段名中,建议分片字段是数字类型;数据源和表的分片字段不要设置一样,不然会导致数据分布均居

 标准分片策略

 标准分片策略:使用自定义的类来处理分片逻辑

基于上面的”分库分表案例“配置,只将分片策略的inline改为standard,下面案例是根据日期分片字段把数据分到不同库中,年龄分片字段来决定分到哪个表

这样就实现了按照日期来把数据分到对应的表中,再实现了按年龄把数据放到对应表中

分库分表后的查询 

 

X.4 分布式主键 

 

X.5 按年月分库分表

一般按年来分、按年月来分、按年月日。这里介绍按照年月来分,即传一个指定一个分片时间字段,传进来的时间值在列出的分表中则将数据插入分表中;如年数据量不大则可以按照年进行数据归档,那么传进当前年份即可把数据落到当前年份的表中。

分表不分库

需要现在a数据库中新建表

 

分库分表 

给b表也创建表

一定要指定表的分片键,上面的分库键为orderid,是雪花算法自动生成的,即有n个库就取余n这样数据就会落到0-n之间

用for循环包裹如下代码



通过雪花算法得到的orderid将数据分配到对应的数据库中,由于上面是取余2因此奇偶到ds1/ds2 

X.6 分页和统计 


每页数据 

X.7 事务管理 

本地事务

和以前本地事务用法一样

两阶段事务 

前一致性:出异常后就回滚

Seata


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不努力谁会可怜你?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值