1.分库分表的问题
在系统设计阶段,就要完成垂直分库和垂直分表. 在数据量不断上升,数据库性能无法满足需求的时候, 首先要考虑的是缓存、 读写分离、索引技术等方案.如果数据量不断增加,并且持续增长再考虑水平分库和水平分表
- 事务一致性问题:分库之后 一个请求可能要访问多个数据库,如何保证事务的一致性
- 跨节点关联问题:在代码层面进行控制,将关联查询拆分执行后合并结果
- 分页查询排序问题:将多个库中的数据查出来,根据排序字段再在内存中排序
- 主键避重问题:表中的数据存储在不同的数据库, 主键自增无法保证ID不重复, 需要单独设计全局主键
- 公共表问题:不同的数据库,都需要从公共表中获取数据. 可以在每一个库都创建这个公共表, 所有对公共表的更新操作,都同时发送到所有分库执行
2.ShardingJDBC
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成
shardingJDBC:适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC;基于任何第三方的数据库连接池,如:DBCP, C3P0, Druid等;支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。
使用Sharding-Jdbc前需要人工对数据库进行分库分表,在应用程序中加入Sharding-Jdbc的Jar包,应用程序通过Sharding-Jdbc操作分库分表后的数据库和数据表,由于Sharding-Jdbc是对Jdbc驱动的增强,使用Sharding-Jdbc就像使用Jdbc驱动一样,在应用程序中是无需指定具体要操作的分库和分表的
-
mycat和ShardingJDBC的区别
- mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包
- 使用mycat时不需要修改代码,而使用sharding-jdbc时需要修改代码
- Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的
-
sharding JDBC入门
- 创建数据库lg_order, 模拟将订单表进行水平拆分, 创建两张表pay_order_1 与 pay_order_2,这两张表是订单表拆分后的表,我们通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为偶数的落入pay_order_1表 ,为奇数的落入pay_order_2表, 再通过Sharding-Jdbc 进行查询
- 创建数据库
CREATE DATABASE lg_order CHARACTER SET ‘utf8‘; DROP TABLE IF EXISTS pay_order_1; CREATE TABLE pay_order_1 ( order_id BIGINT(20) PRIMARY KEY AUTO_INCREMENT , user_id INT(11) , product_name VARCHAR(128), COUNT INT(11) ); DROP TABLE IF EXISTS pay_order_2; CREATE TABLE pay_order_2 ( order_id BIGINT(20) PRIMARY KEY AUTO_INCREMENT , user_id INT(11) , product_name VARCHAR(128), COUNT INT(11) );
- 创建SpringBoot项目引入maven依赖
- 分片规则配置(水平分表)
- 编写程序
3.ShardingJDBC 分库分表
4.ShardingJDBC 操作公共表
Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库,而
Sharding-JDBC 是基于 JDBC 的扩展,是以 jar 包的形式提供轻量级服务的