ShardingSphere分库分表

打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

ShardingSphere

高性能架构模式

读写分离架构:
基本原理是将数据库读写操作分散到差异的节点上,主库负责处理变乱性的增删改操作,从库负责处理查询操作。避免由数据更新导致的行锁,来提拔性能。
一主一从:可以将查询请求匀称的分散到多个数据副本,提交性能。
多主多从:提拔系统的吞吐量,还提拔系统的可用性,当一台数据库宕机,备机启动,业务也正常执行。
CAP 理论:
在一个分布式系统中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。


  • AP:保证一致性,当N1 节点上的数据已经更新到 y,由 N1 和 N2 之间的通断停止,N2 节点上的数据还是 x,这时客户端访问N2节点,客户端提示发生了错误,这种处理方式,就违反了可用性。
  • CP:保证可用性,当N1 节点上的数据已经更新到 y,由 N1 和 N2 之间的通断停止,N2 节点上的数据还是 x,这时客户端访问N2节点,会返回 x,固然不是一个“精确”的结果,但是一个“公道”的结果,因为 x 是旧的数据,并不是一个错乱的值。
数据库分片



  • 读写分离:读写分离分散了数据库读写操作的压力,但没有分散存储压力。
  • 数据分片:将存放在单一数据库中的数据分散地存放至多个数据库或表中,数据分片的拆分方式又分为:垂直分片和水平分盘。
垂直分片

当我们单表行数,如果凌驾500万或者凌驾2GB,发起分库分表操作。
垂直分库:按照业务拆分的方式称为垂直分片,又称为(纵向拆分),一个数据库由多个数据表构成,每个表对应着差异的业务。而拆分之后,则是按照业务将表举行归类,分布到差异的数据库中。
  1. 例子:
  2. -- 用户表、订单表...放在同一个数据库中。
  3. select * from 用户表;
  4. select * from 订单表;
  5. -- 用户表、放一个数据库中。 select * from 用户表;
  6. -- 订单表、放一个数据库中。 select * from 订单表;
复制代码
垂直拆分可以缓解数据量和访问量带来的题目,但不能办理存储压力。
垂直分表
  1. 例子:
  2. -- 一个用户表,拆分用户详情表,它们的关系是一对一的关系,就是垂直分表。
  3. -- 当我们表很大的时候,需要垂直分表。
  4. -- 水平分表适合表行数特别大的表,水平分表属于水平分片`
复制代码
水平分片

水平分片又称为横向拆分,当单表凌驾500万条,需要思量水平分片,分为水平分表和水平分库;不再将数据根据业务逻辑分类,而是根据某个字段,根据某种规则将数据分散至多个库或表中。


  • **水平分表:**单表切分为多表后,新的表在同一个数据库服务器中。
  • **水平分库:**如果单表拆分为多表后,单台服务器依然无法满足性能要求,需要将多个表分散在差异的数据库服务器中。
  1. 例子:
  2. -- 水平分表。
  3. select * from 用户表 where id = 1;  
  4. -- id % 2 = 1 存一个表,  (同一个数据库)
  5. -- id % 2 = 0 存另一个表,(同一个数据库)
  6. -- 水平分库。
  7. select * from 用户表 where id = 1;
  8. -- id % 2 = 1 存一个表,  (不同一个数据库)
  9. -- id % 2 = 0 存另一个表,(不同一个数据库)
复制代码
常用办理方案:


  • Apache ShardingSphere(步伐级别和中间件级别)
  • MyCat(数据库中间件) - 中间件封装指的是独立一套系统出来
ShardingSphere

官网:https://shardingsphere.apache.org/index_zh.html
文档:https://shardingsphere.apache.org/document/5.1.1/cn/overview/


  • ShardingSphere-JDBC:代码封装,在JDBC层提供的框架,客户端直连接数据库,以jar包形式提供服务。
  • ShardingSphere-Proxy:中间件封装,现在提供 MySQL 和 PostgreSQL版本。
条件要求
一. 数据库配置

需要预备3台Mysql数据库,完成一主多的配置;
配置文档:https://blog.csdn.net/yanshengren520/article/details/136771432


  • 主服务器:容器名mysql-master,端口3306
  • 从服务器:容器名mysql-slave1,端口3307
  • 从服务器:容器名mysql-slave2,端口3308
二. 创建项目

创建个SpringBoot项目
  1. <!-- 依赖包 -->
  2. <dependency>
  3.     <groupId>org.apache.shardingsphere</groupId>
  4.     <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  5.     <version>5.1.1</version>
  6. </dependency>
复制代码
完成基本的SpringBoot项目配置(Mapper和实体的创建)
三. 配置读写分离

对应的文档配置说明:https://shardingsphere.apache.org/document/5.1.1/cn/user-manual/shardingsphere-jdbc/
配置文件:
  1. #----------------------第一部分:模式配置 ---------------------
  2. # 这里使用:内存模式
  3. spring.shardingsphere.mode.type=Memory
  4. # 以内存的模式进行配置,内存模式,该配置文件存的是(源数据信息)信息,
  5. # 在集群模式下,该配置文件(源数据信息)会被持久化,在多个服务之间共享数据。内存模式就是将该配置文件加载到内存中。
  6. # 打印SQl
  7. spring.shardingsphere.props.sql-show=true
  8. #----------------------第二部分:数据源配置 ---------------------
  9. # 配置真实数据源  (这里只是分别起名)
  10. # master代表主库,slave1,slave2是从库(完成一主多从的配置)
  11. spring.shardingsphere.datasource.names=master,slave1,slave2
  12. # 配置第 1 个数据源
  13. # 这里的 master与上面的master第一个名字对应
  14. spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
  15. spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
  16. spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
  17. spring.shardingsphere.datasource.master.username=root
  18. spring.shardingsphere.datasource.master.password=123456
  19. # 配置第 2 个数据源
  20. # 同上,需要注意:slave1与上面名字保持一致
  21. spring.shardingsphere.datasource.slave1.type=com.zaxxer.hikari.HikariDataSource
  22. spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
  23. spring.shardingsphere.datasource.slave1.jdbc-url=jdbc:mysql://xxxIP地址:3307/db
  24. spring.shardingsphere.datasource.slave1.username=root
  25. spring.shardingsphere.datasource.slave1.password=123456
  26. # 配置第 3 个数据源
  27. spring.shardingsphere.datasource.slave2.type=com.zaxxer.hikari.HikariDataSource
  28. spring.shardingsphere.datasource.slave2.driver-class-name=com.mysql.jdbc.Driver
  29. spring.shardingsphere.datasource.slave2.jdbc-url=jdbc:mysql://xxxIP地址:3308/db
  30. spring.shardingsphere.datasource.slave2.username=root
  31. spring.shardingsphere.datasource.slave2.password=123456
  32. #----------------------第三部分:规则配置 ---------------------
  33. # 【规则配置】 - 读写分离的配置
  34. # 读写分离类型,如: Static (上面的数据源配置是写死,不是动态获取的,写Static),Dynamic
  35. # 读写分离的数据源名字 ,
  36. #    例子:spring.shardingsphere.rules.readwrite-splitting.data-sources.<这里可起该数据源的名字>.type=Static
  37. spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static
  38. # 写数据源名称有哪些:(master代表)
  39. spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=master
  40. # 读数据源名称,多个从数据源用逗号分隔
  41. spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=slave1,slave2
  42. # 负载均衡算法名称 (可以自己起名字,然后根据下面的算法配置,选择要使用的算法)
  43. spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-name=yan_random
  44. # 负载均衡算法配置:算法有:ROUND_ROBIN 轮询算法 、RANDOM 随机访问算法、WEIGHT 权重访问算法。
  45. #   例子:spring.shardingsphere.rules.readwrite-splitting.load-balancers.<这里写上面起的算法名字>.type=ROUND_ROBIN
  46. # 轮询算法配置
  47. spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_robin.type=ROUND_ROBIN
  48. # 随机访问算法配置
  49. spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_random.type=RANDOM
  50. # 权重访问算法配置
  51. spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_weight.type=WEIGHT
  52. spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_weight.props.slave1=1
  53. spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_weight.props.slave2=2
复制代码
四. 配置垂直分片

  1. #----------------------第一部分:模式配置 ---------------------
  2. # 这里使用:内存模式
  3. spring.shardingsphere.mode.type=Memory
  4. # 打印SQl
  5. spring.shardingsphere.props.sql-show=true
  6. #----------------------第二部分:数据源配置 ---------------------
  7. # 配置真实数据源  (这里只是分别起名) (代表不同的数据库)
  8. spring.shardingsphere.datasource.names=server-order,server-user
  9. # 配置第 1 个数据源
  10. # 这里的 master与上面的master第一个名字对应
  11. spring.shardingsphere.datasource.server-order.type=com.zaxxer.hikari.HikariDataSource
  12. spring.shardingsphere.datasource.server-order.driver-class-name=com.mysql.jdbc.Driver
  13. spring.shardingsphere.datasource.server-order.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
  14. spring.shardingsphere.datasource.server-order.username=root
  15. spring.shardingsphere.datasource.server-order.password=123456
  16. # 配置第 2 个数据源
  17. # 同上,需要注意:slave1与上面名字保持一致
  18. spring.shardingsphere.datasource.server-user.type=com.zaxxer.hikari.HikariDataSource
  19. spring.shardingsphere.datasource.server-user.driver-class-name=com.mysql.jdbc.Driver
  20. spring.shardingsphere.datasource.server-user.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
  21. spring.shardingsphere.datasource.server-user.username=yan
  22. spring.shardingsphere.datasource.server-user.password=123456
  23. #----------------------第三部分:规则配置 ---------------------
  24. #【规则配置】 - 垂直分片的配置
  25. # 标准分片表配置
  26. # 值由:数据源名 + 表名组成,以小数点分隔。 <table-name>:逻辑表名由:在实体类的@TableName注解,就是逻辑表
  27. # 支持 inline 表达式。在水平分片里,有配置
  28. # 例子:spring.shardingsphere.rules.sharding.tables.<逻辑表名>.actual-data-nodes=数据源.真实的表
  29. spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order.t_order
  30. spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=server-user.t_user
  31. # 垂直分片:相当于一个服务,多各数据源
复制代码
五. 配置水平分片

水平分库的配置

  1. #----------------------第一部分:模式配置 ---------------------
  2. # 这里使用:内存模式
  3. spring.shardingsphere.mode.type=Memory
  4. # 打印SQl
  5. spring.shardingsphere.props.sql-show=true
  6. #----------------------第二部分:数据源配置 ---------------------
  7. # 配置真实数据源  (这里只是分别起名)
  8. # (代表不同的数据库)
  9. spring.shardingsphere.datasource.names=server-user,server-order1,server-order2
  10. # 配置第 1 个数据源
  11. # 这里的 master与上面的master第一个名字对应
  12. spring.shardingsphere.datasource.server-order1.type=com.zaxxer.hikari.HikariDataSource
  13. spring.shardingsphere.datasource.server-order1.driver-class-name=com.mysql.jdbc.Driver
  14. spring.shardingsphere.datasource.server-order1.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
  15. spring.shardingsphere.datasource.server-order1.username=root
  16. spring.shardingsphere.datasource.server-order1.password=123456
  17. # 配置第 2 个数据源
  18. # 同上,需要注意:slave1与上面名字保持一致
  19. spring.shardingsphere.datasource.server-order2.type=com.zaxxer.hikari.HikariDataSource
  20. spring.shardingsphere.datasource.server-order2.driver-class-name=com.mysql.jdbc.Driver
  21. spring.shardingsphere.datasource.server-order2.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
  22. spring.shardingsphere.datasource.server-order2.username=yan
  23. spring.shardingsphere.datasource.server-order2.password=123456
  24. # 配置第 3 个数据源
  25. spring.shardingsphere.datasource.server-user.type=com.zaxxer.hikari.HikariDataSource
  26. spring.shardingsphere.datasource.server-user.driver-class-name=com.mysql.jdbc.Driver
  27. spring.shardingsphere.datasource.server-user.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
  28. spring.shardingsphere.datasource.server-user.username=root
  29. spring.shardingsphere.datasource.server-user.password=123456
  30. #----------------------第三部分:规则配置 ---------------------
  31. # 【规则配置】 - 水平分片的配置
  32. # 标准分片表配置
  33. # 值由:数据源名 + 表名组成,以小数点分隔。 <table-name>:逻辑表名由:在实体类的@TableName注解,就是逻辑表
  34. # 例子:spring.shardingsphere.rules.sharding.tables.<逻辑表名>.actual-data-nodes=数据源.真实的表
  35. #spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=server-user.t_user
  36. # 准备:server-order1数据源中有2个表(t_order1 和 t_order2)和 server-order2数据源中有2个表(t_order1 和 t_order2)
  37. # 测试 - server-order1的数据源是否ok
  38. #spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order1.t_order1
  39. # 测试 - server-order2的数据源是否ok
  40. #spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order2.t_order1
  41. # 测试 - 全部配置
  42. #spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order1.t_order1,server-order1.t_order2,server-order2.t_order1,server-order2.t_order2
复制代码
行表达式的inline 表达式配置
规则地址:https://shardingsphere.apache.org/document/5.1.1/cn/features/sharding/concept/inline-expression/
取模分片

  1. # 测试 水平分库的配置
  2. # 第一部分和第二部分,同上
  3. #----------------------第三部分:规则配置 ---------------------
  4. # 【规则配置】 - 水平分片的配置
  5. # 测试 - 该配置支持 inline 表达式。注意:t_c_order是逻辑表
  6. # 测试 - 解析数据节点是:server-order1和server-order2,他们分别有t_order1的表
  7. spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order$->{1..2}.t_order1
  8. # 测试 - 水平分库:
  9. # 分片规则:表中`user_id`为偶数时,数据插入`server-order1数据源`,`user_id`为奇数时,数据插入`server-order2数据源`
  10. # 分库策略 - 取模分片算法
  11. # 分片列名称,以什么字段
  12. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
  13. # 分库策略:
  14. # 分片列名称,以什么字段
  15. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
  16. # 分片算法名称 (可以自己起名字,然后根据下面的算法配置,选择要使用的算法)
  17. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-algorithm-name=alg_mod
  18. #
  19. # 分片算法类型 (alg_inline_userid)名字与上面的(分片算法名称)保持一致
  20. # 算法1: - 行表达式分片算法: INLINE
  21. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.type=INLINE
  22. # 分片算法属性配置 ,值:是表达式,规则是:数据源.某个字段进行(取模分片算法),因为server-order数据源从1开始,需要+1操作
  23. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.props.algorithm-expression=server-order$->{user_id % 2 +1}
  24. #
  25. # 算法2: - 取模分片算法: MOD
  26. # 分片算法类型
  27. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.type=MOD
  28. # 分片算法属性配置。这个配置,需要数据源从0开始
  29. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.props.sharding-count=2
复制代码
哈希取模分片

  1. # 测试 水平分库+分表的配置
  2. # 第一部分和第二部分,同上
  3. #----------------------第三部分:规则配置 ---------------------
  4. # 【规则配置】 - 水平分片的配置
  5. # 测试 - 该配置支持 inline 表达式。注意:t_c_order是逻辑表
  6. spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order$->{1..2}.t_order$->{0..1}
  7. # 测试 - 水平分库:分片规则:表中`user_id`为偶数时,数据插入`server-order1数据源`,
  8. #                           `user_id`为奇数时,数据插入`server-order2数据源`
  9. #     - 水平分表:分片规则:表中`order_no`是字符串,进行哈希取模,
  10. #                        哈希值为偶数时,插入到t_order0中,
  11. #                               奇数插入到t_order1表中。
  12. # --------- 分库策略:
  13. # 分片列名称,以什么字段(进行分库).逻辑表.database-xxx
  14. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
  15. # 分片算法名称 (可以自己起名字,然后根据下面的算法配置,选择要使用的算法)
  16. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-algorithm-name=alg_inline
  17. #
  18. # 分片算法类型 (alg_inline_userid)名字与上面的(分片算法名称)保持一致
  19. # 算法1: - 行表达式分片算法: INLINE
  20. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.type=INLINE
  21. # 分片算法属性配置 ,值:是表达式,规则是:数据源.某个字段进行(取模分片算法),因为server-order数据源从1开始,需要+1操作
  22. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.props.algorithm-expression=server-order$->{user_id % 2 +1}
  23. #
  24. # --------- 分表策略:
  25. # 分片列名称,以什么字段(进行分表).逻辑表.table-xxx
  26. spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-column=order_no
  27. ## 分片算法名称
  28. spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-algorithm-name=alg_hash_mod
  29. #
  30. ## 算法:哈希取模分片算法: HASH_MOD
  31. ## 分表策略,以哈希取模分片算法(与上面的算法名称保持一致)
  32. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.type=HASH_MOD
  33. ## 分片算法属性配置,有2个,配置2个分片数量
  34. spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.props.sharding-count=2
复制代码
分片算法

分片算法有许多,官网地址:https://shardingsphere.apache.org/document/5.1.1/cn/user-manual/shardingsphere-jdbc/builtin-algorithm/sharding/#%E8%A1%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%88%86%E7%89%87%E7%AE%97%E6%B3%95
有:取模分片算法、哈希取模分片算法、基于分片容量的范围分片算法、基于分片边界的范围分片算法、主动时间段分片算法、标准分片算法、时间范围分片算法、复合分片算法、Hint 分片算法、自定义类分片算法
六 分布式主键

雪花算法:
方式1:基于MyBatisPlus的id计谋,在实体注解,添加该注解
  1. @TableId(type = IdType.ASSIGN_ID)
  2. private Long id;
复制代码
方式2:ShardingSphere-JDBC的全局序列配置
  1. # 在配置文件中配置:
  2. # --------- 分布式主键配置 ---- 需要在实体配置对应注解 @TableId(type = IdType.AUTO)
  3. # 分布式序列列名称(逻辑表)中的主键是:
  4. spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.column=id
  5. # 分布式序列算法名称
  6. spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.key-generator-name=alg_snowflake
  7. # 分布式序列算法类型(alg_snowflake)的名字,于上面一致
  8. spring.shardingsphere.rules.sharding.key-generators.alg_snowflake.type=SNOWFLAKE
复制代码
七 多表关联

  1. # 测试 水平分库+分表的配置
  2. # 第一部分和第二部分,同上
  3. #----------------------第三部分:规则配置 ---------------------
  4. # 标准分片表配置(数据节点配置)
  5. spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order$->{1..2}.t_order$->{0..1}
  6. spring.shardingsphere.rules.sharding.tables.t_order_item.actual-data-nodes=server-order$->{1..2}.t_order_item$->{0..1}
  7. #
  8. # --------- 分库策略:
  9. # 分片列名称
  10. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
  11. spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-algorithm-name=alg_mod
  12. # 配置t_order_item的逻辑表的 分库策略,(与t_c_order一致)
  13. spring.shardingsphere.rules.sharding.tables.t_order_item.database-strategy.standard.sharding-column=user_id
  14. spring.shardingsphere.rules.sharding.tables.t_order_item.database-strategy.standard.sharding-algorithm-name=alg_mod
  15. #
  16. # --------- 分表策略:
  17. # 分片列名称
  18. spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-column=order_no
  19. # 分片算法名称
  20. spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-algorithm-name=alg_hash_mod
  21. # 配置t_order_item的逻辑表的 分表策略,(与t_c_order一致)
  22. spring.shardingsphere.rules.sharding.tables.t_order_item.table-strategy.standard.sharding-column=order_no
  23. spring.shardingsphere.rules.sharding.tables.t_order_item.table-strategy.standard.sharding-algorithm-name=alg_hash_mod
  24. #
  25. # --------- 分布式主键配置:
  26. # 分布式序列列名称
  27. spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.column=id
  28. # 分布式序列算法名称
  29. spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.key-generator-name=alg_snowflake
  30. # 配置t_order_item的逻辑表的 主键策略,(与t_c_order一致)
  31. spring.shardingsphere.rules.sharding.tables.t_order_item.key-generate-strategy.column=id
  32. spring.shardingsphere.rules.sharding.tables.t_order_item.key-generate-strategy.key-generator-name=alg_snowflake
复制代码
八 绑定表

在原来水平分片配置的基础上添加如下配置:
  1. #------------------------绑定表
  2. spring.shardingsphere.rules.sharding.binding-tables[0]=t_order,t_order_item
复制代码
如果不配置绑定表,查询是有多少数据库,每张表查询差异的表,配置绑定表,查询根据配置规则去查询,从而效率提拔。
九 广播表

全部的分片数据源中都存在的表,表结构及其数据在每个数据库中均完全一致。
  1. # 测试 水平分库+分表的配置
  2. # 第一部分和第二部分,同上,字典表 - t_dict
  3. #----------------------第三部分:规则配置 ---------------------
  4. # --------- 配置广播表 (每个数据源,都要添加,去掉相同的数据源)
  5. spring.shardingsphere.rules.sharding.tables.t_dict.actual-data-nodes=server-order$->{1..2}.t_dict
  6. # 广播表配置
  7. spring.shardingsphere.rules.sharding.broadcast-tables[0]=t_dict
  8. # 这样保证,添加数据,每个库都有该表,同样的数据; 查询数据,随机负载均衡规则,只从一个节点获取数据
复制代码
ShardingSphere-Proxy

获取方式:


  • 二进制发布包
    地址:https://shardingsphere.apache.org/document/5.1.1/cn/downloads/
  • Docker
  • Helm
使用二进制发布包安装

步骤1:下载解压包
该apache-shardingsphere-5.1.1-shardingsphere-proxy-bin.tar.gz可以Linux系统运行,又可以在windows系统运行。
Linux:将文件上传至/opt目次,并解压
  1. tar -zxvf apache-shardingsphere-5.1.1-shardingsphere-proxy-bin.tar.gz
复制代码
windows:使用解压软件解压文件,就可以
步骤2:添加MySQL驱动
解压文件后,在bin的同目次下,创建ext-lib目次,放Mysql的驱动包
  1. mysql-connector-java-8.0.22.jar
复制代码
步骤3:修改配置文件
该配置文件:conf/server.yaml
  1. # 放开这里,AUTHORITY是用户认证相关配置
  2. # root@%:root 用户名和密码,%代表任何服务器都可以访问
  3. # provider 下的 ALL_PRIVILEGES_PERMITTED 代表所有的访问权限
  4. rules:
  5.   - !AUTHORITY
  6.     users:
  7.       - root@%:root
  8. #      - sharding@:sharding
  9.     provider:
  10.       type: ALL_PRIVILEGES_PERMITTED
  11. # ...
  12. # 开启这个,sql-show: true 打印SQL语句
  13. props:
  14. #  max-connections-size-per-query: 1
  15. # ...
  16.   sql-show: false
复制代码
步骤4:举行启动
Linux 操作系统请运行 bin/start.sh
Windows 操作系统请运行 bin/start.bat
指定端口号和配置文件目次:bin/start.bat ${proxy_port} ${proxy_conf_directory}
  1. # windows里启动方式,双击,关闭就关闭窗口就可以 --- start.bat
  2. # Linux里启动方式,-- start.sh
  3. # Linux里关闭服务  -- stop.sh
  4. # --------------
  5. # 在bin目录进行cmd运行windows启动,默认端口是3307
  6. start.bat
复制代码
启动乐成

举行访问,就像登录mysql数据库一样
  1. mysql -h127.0.0.1 -P3307 -uroot -p
  2. # 输入密码
复制代码
使用Docker安装

步骤1:启动容器
  1. docker run -d \
  2. -v /xxx/server/proxy-a/conf:/opt/shardingsphere-proxy/conf \
  3. -v /xxx/server/proxy-a/ext-lib:/opt/shardingsphere-proxy/ext-lib \
  4. -e ES_JAVA_OPTS="-Xmx256m -Xms256m -Xmn128m" \
  5. -p 3321:3307 \
  6. --name server-proxy-a \
  7. apache/shardingsphere-proxy:5.1.1
  8. # 宿主机映射,conf是配置文件目录,ext-lib是添加MySQL驱动的目录
  9. # -e 是由于需要大量的内存,调试阶段,可以把内存设置小点
  10. # server-proxy-a 是该容器的名字
  11. # 3321 映射的端口号,对外连接的端口号
复制代码
步骤2:配置MySQL驱动
将MySQl驱动包上传到/xxx/server/proxy-a/ext-lib目次下。
步骤3:修改配置文件
该配置文件:conf/server.yaml,该配置文件上传到/xxx/server/proxy-a/conf目次下。
  1. # 放开这里,AUTHORITY是用户认证相关配置
  2. # root@%:root 用户名和密码,%代表任何服务器都可以访问
  3. # provider 下的 ALL_PRIVILEGES_PERMITTED 代表所有的访问权限
  4. rules:
  5.   - !AUTHORITY
  6.     users:
  7.       - root@%:root
  8. #      - sharding@:sharding
  9.     provider:
  10.       type: ALL_PRIVILEGES_PERMITTED
  11. # ...
  12. # 开启这个,sql-show: true 打印SQL语句
  13. props:
  14. #  max-connections-size-per-query: 1
  15. # ...
  16.   sql-show: false
复制代码
步骤4:重启容器
  1. docker restart server-proxy-a
复制代码
步骤5:远程连接
  1. mysql -h对应的IP地址 -P3321 -uroot -p
复制代码
常见题目
容器可以乐成的创建并启动,但是无法远程连接,排除防火墙和网络等题目后,可能是容器可分配内存不足导致。
  1. # 进入容器
  2. docker exec -it server-proxy-a env LANG=C.UTF-8 /bin/bash
  3. # 查看日志,如果有`cannot allocate memory`代表容器内存不足
  4. cd /opt/shardingsphere-proxy/logs
  5. # 查看日志
  6. tail stdout.log
复制代码
配置读写分离

修改配置:config-readwrite-splitting.yaml
  1. # 虚拟中间件的表
  2. schemaName: readwrite_splitting_db
  3. dataSources:
  4.   write_ds:
  5.     url: jdbc:mysql://xxxIP地址:3306/db?serverTimezone=UTC&useSSL=false
  6.     username: root
  7.     password: yanshengren
  8.     connectionTimeoutMilliseconds: 30000
  9.     idleTimeoutMilliseconds: 60000
  10.     maxLifetimeMilliseconds: 1800000
  11.     maxPoolSize: 50
  12.     minPoolSize: 1
  13.   read_ds_0:
  14.     url: jdbc:mysql://xxxIP地址:3307/db?serverTimezone=UTC&useSSL=false
  15.     username: root
  16.     password: 123456
  17.     connectionTimeoutMilliseconds: 30000
  18.     idleTimeoutMilliseconds: 60000
  19.     maxLifetimeMilliseconds: 1800000
  20.     maxPoolSize: 50
  21.     minPoolSize: 1
  22.   read_ds_1:
  23.     url: jdbc:mysql://xxxIP地址:3308/db?serverTimezone=UTC&useSSL=false
  24.     username: root
  25.     password: 123456
  26.     connectionTimeoutMilliseconds: 30000
  27.     idleTimeoutMilliseconds: 60000
  28.     maxLifetimeMilliseconds: 1800000
  29.     maxPoolSize: 50
  30.     minPoolSize: 1
  31. rules:
  32. - !READWRITE_SPLITTING
  33.   dataSources:
  34.     readwrite_ds:
  35.       type: Static
  36.       props:
  37.         write-data-source-name: write_ds
  38.         read-data-source-names: read_ds_0,read_ds_1
复制代码
实时查看日志

  1. # 默认的日志文件,可以查看具体sql语句
  2. tail -f /xxx/shardingsphere-proxy/logs/stdout.log
复制代码
应用步伐访问Proxy

跟其他服务访问mysql一样
  1. # 对应的配置文件
  2. # 应用名称
  3. spring.application.name=sharding-proxy-xxx
  4. # 开发环境设置
  5. spring.profiles.active=dev
  6. #mysql数据库连接(proxy)
  7. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  8. # 虚拟中间件的表,跟上面的配置一样 - readwrite_splitting_db
  9. spring.datasource.url=jdbc:mysql://127.0.0.1:3307/readwrite_splitting_db?serverTimezone=GMT%2B8&useSSL=false
  10. spring.datasource.username=root
  11. spring.datasource.password=root
  12. #mybatis日志
  13. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
复制代码
垂直分片

修改配置config-sharding.yaml
  1. schemaName: sharding_db
  2. dataSources:
  3.   ds_0:
  4.     url: jdbc:mysql://xxxIP地址:3301/db?serverTimezone=UTC&useSSL=false
  5.     username: root
  6.     password: 123456
  7.     connectionTimeoutMilliseconds: 30000
  8.     idleTimeoutMilliseconds: 60000
  9.     maxLifetimeMilliseconds: 1800000
  10.     maxPoolSize: 50
  11.     minPoolSize: 1
  12.   ds_1:
  13.     url: jdbc:mysql://xxxIP地址:3302/db?serverTimezone=UTC&useSSL=false
  14.     username: root
  15.     password: 123456
  16.     connectionTimeoutMilliseconds: 30000
  17.     idleTimeoutMilliseconds: 60000
  18.     maxLifetimeMilliseconds: 1800000
  19.     maxPoolSize: 50
  20.     minPoolSize: 1
  21. rules:
  22. - !SHARDING
  23.   tables:
  24.     t_user:
  25.       actualDataNodes: ds_0.t_user
  26.     t_order:
  27.       actualDataNodes: ds_1.t_order
复制代码
水平分片

修改配置config-sharding.yaml
  1. schemaName: sharding_db
  2. dataSources:
  3.   ds_user:
  4.     url: jdbc:mysql://xxxIP地址:3301/db?serverTimezone=UTC&useSSL=false
  5.     username: root
  6.     password: 123456
  7.     connectionTimeoutMilliseconds: 30000
  8.     idleTimeoutMilliseconds: 60000
  9.     maxLifetimeMilliseconds: 1800000
  10.     maxPoolSize: 50
  11.     minPoolSize: 1
  12.   ds_order0:
  13.     url: jdbc:mysql://xxxIP地址:3310/db?serverTimezone=UTC&useSSL=false
  14.     username: root
  15.     password: 123456
  16.     connectionTimeoutMilliseconds: 30000
  17.     idleTimeoutMilliseconds: 60000
  18.     maxLifetimeMilliseconds: 1800000
  19.     maxPoolSize: 50
  20.     minPoolSize: 1
  21.   ds_order1:
  22.     url: jdbc:mysql://xxxIP地址:3311/db?serverTimezone=UTC&useSSL=false
  23.     username: root
  24.     password: 123456
  25.     connectionTimeoutMilliseconds: 30000
  26.     idleTimeoutMilliseconds: 60000
  27.     maxLifetimeMilliseconds: 1800000
  28.     maxPoolSize: 50
  29.     minPoolSize: 1
  30. # 具体配置,跟ShardingSphere一样
  31. rules:
  32. - !SHARDING
  33.   tables:
  34.     t_user:
  35.       actualDataNodes: ds_user.t_user
  36.     t_order:
  37.       actualDataNodes: ds_order${0..1}.t_order${0..1}
  38.       databaseStrategy:
  39.         standard:
  40.           shardingColumn: user_id
  41.           shardingAlgorithmName: alg_mod
  42.       tableStrategy:
  43.         standard:
  44.           shardingColumn: order_no
  45.           shardingAlgorithmName: alg_hash_mod
  46.       keyGenerateStrategy:
  47.         column: id
  48.         keyGeneratorName: snowflake
  49.     t_order_item:
  50.       actualDataNodes: ds_order${0..1}.t_order_item${0..1}
  51.       databaseStrategy:
  52.         standard:
  53.           shardingColumn: user_id
  54.           shardingAlgorithmName: alg_mod
  55.       tableStrategy:
  56.         standard:
  57.           shardingColumn: order_no
  58.           shardingAlgorithmName: alg_hash_mod
  59.       keyGenerateStrategy:
  60.         column: id
  61.         keyGeneratorName: snowflake
  62.   bindingTables:
  63.     - t_order,t_order_item
  64.   broadcastTables:
  65.     - t_dict
  66.   shardingAlgorithms:
  67.     alg_inline_userid:
  68.       type: INLINE
  69.       props:
  70.         algorithm-expression: server-order$->{user_id % 2}
  71.     alg_mod:
  72.       type: MOD
  73.       props:
  74.         sharding-count: 2
  75.     alg_hash_mod:
  76.       type: HASH_MOD
  77.       props:
  78.         sharding-count: 2
  79.   
  80.   keyGenerators:
  81.     snowflake:
  82.       type: SNOWFLAKE
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表