写点什么

ShardingSphere-Proxy 分库分表(一)

作者:@@神农
  • 2022 年 3 月 17 日
  • 本文字数:4960 字

    阅读完需:约 16 分钟

一、ShardingSphere-Proxy 的核心概念

  • ShardingSphere-Proxy 概念

  • 官方地址:

  • ShardingSphere-Proxy 就是数据库的代理,如图:


  • ShardingSphere-Proxy 主要代理哪些数据库

  • 默认代理:Mysql、PostSql

  • 实现代理的目的

  • 主要是为了完成分库分表

  • 实现读写分离

  • 这两个也是 ShardingSphere-Proxy 的两大核心功能。

  • 分库分表

  • 分库的概念和目的

  • 概念

  • 数据库中的表存储到不同的数据库中;如图:


  • 目的

  • 防止一个库中多个表出现资源竞争【CPU、内存】,导致性能下降。

  • 分表的概念和目的

  • 概念

  • 将数据库中一张表分成多张表,如图:


  • 目的

  • 分表是解决表中数据量过大,提升用户查询和添加数据的性能。

  • 比如:以 mysql 数据库为例,当用户添加数据会通过 mysql 的 InnoDB 引擎存储到数据中,InnoDB 引擎要想保证数据的性能在一定的范围之内,表中的数据量最大的峰值为 2000w,如果超过 2000W 那么添加数据的性能会下降,所以我们要将超过 2000W 数据量的表拆分成多个表,这样才能保证用户的体验度。

  • 缺陷

  • 并发量过大,表会出现资源竞争[CPU、内存]的问题,这样导致性能下降,用户的体验度变差。

  • 解决方案:分库

  • 分库分表

  • 目的

  • 解决表资源竞争和数据量过大的问题。

二、ShardingSphere-Proxy 的应用场景

  • 场景

  • 单体项目和微服务项目都能用到分库分表。

三、ShardingSphere-Proxy 分布分表落地

  • 工具

  • ShardingSphere-Proxy

  • 方案

  • 进程内

  • 如图:


  • 缺陷

  • 资源竞争问题。

  • 异常影响问题。

  • 进程外 【推荐】

  • 如图:


  • 缺陷

  • 维护量大的问题。

  • 性能相对进程内弱一些。

  • 可以放在内网中进行通信【docker】

  • 实现

  • 条件

  • Mysql 数据库 版本:5.7

  • ShardingSphere-Proxy

  • 网盘下载地址


        链接:https://pan.baidu.com/s/15yUIDQOdDDwUtVLNxNa9Cg         提取码:3hp3
复制代码


- Java的JDK
- 网盘下载地址
复制代码


        链接:https://pan.baidu.com/s/1A-ksNN0YicT3hXjFscGGwA         提取码:r9e0
复制代码


- 下载Mysql的连接驱动  文件放到根目录 lab文件夹下 
网盘下载地址:
复制代码


      链接:https://pan.baidu.com/s/1924iUe7wxGpStAzxxv2K3g       提取码:jy7z
复制代码


  • 配置

  • 分表

  • 配置

  • config-sharding.yaml 分片的配置文件


            # 3、创建客户端连接库  hmms:虚拟的数据库名称【最好和真实的数据库名称一样】 在server.yaml命名            schemaName: hmms                        # 1、连接mysql            dataSources:              hmmsdatasources-0:  #节点名称  自定义                url: jdbc:mysql://127.0.0.1:3306/真实数据库名称?serverTimezone=UTC&useSSL=false                username: 数据库用户名                password: 数据库密码                 connectionTimeoutMilliseconds: 30000                idleTimeoutMilliseconds: 60000                maxLifetimeMilliseconds: 1800000                maxPoolSize: 50                            # 2、分片规则            shardingRule:              tables: #表                user: #逻辑表名  要对哪个表进行分表                  actualDataNodes: hmmsdatasources-0.user-${0..1} #分几张表   这个是两个表   #hmmsdatasources-0:节点名称                    tableStrategy: #数据分表策越                    inline:                      shardingColumn: useid #分表字段                      algorithmExpression: user-${useid % 2} #对useid取模分表                   #创建多个表                #表名: #逻辑表名  要对哪个表进行分表                  #actualDataNodes: hmmsdatasources-0.表名-${0..1} #分几张表   这个是两个表   #hmmsdatasources-0:节点名称  
复制代码


     2. server.yaml
复制代码


            authentication:              users:                root: #数据库用户名                  password: 数据密码                sharding:                  password: sharding                   authorizedSchemas: hmms
复制代码


     3. ShardingSpere-Proxy
运行命令
复制代码


            #根目录bin文件下执行命令             start.bat
复制代码


        运行结果如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7121143f98ac457685eb143407266079.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

4. MySql 数据库
- 新建真实数据库名称
复制代码


              SET NAMES utf8mb4;              SET FOREIGN_KEY_CHECKS = 0;                            -- ----------------------------              -- Table structure for user              -- ----------------------------              DROP TABLE IF EXISTS `user`;              CREATE TABLE `user`  (                `useid` int(11) NOT NULL,                `usenam` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录名',                `usepwd` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录密码',                `usestate` int(11) NULL DEFAULT 2 COMMENT '-1:删除1:注销 2:正常 3:挂失',                `usekey` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户秘钥',                `usetel` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机',                `createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '添加人',                `createbytime` datetime(0) NULL DEFAULT NULL COMMENT '添加时间',                `modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',                `modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',                PRIMARY KEY (`useid`) USING BTREE              ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;                            SET FOREIGN_KEY_CHECKS = 1;
复制代码


          如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/99ed8284c8814b4bb333d5e8ab7e7250.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

- 新建 3307 虚拟数据库连接
如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c1008a094b154af79b0f986068da842b.png#pic_center)


- 删除表
删除3306中hmms库的user表,并在虚拟的数据库中执行新建表的脚本,运行结果如下:
虚拟数据库:
![在这里插入图片描述](https://img-blog.csdnimg.cn/8721d0a8e37b4ddfb4a98edde3739e27.png#pic_center)

真实数据库
![在这里插入图片描述](https://img-blog.csdnimg.cn/f56fd16ea02047948046d7a2685fb3f9.png#pic_center)

- 添加数据
虚拟数据库中添加两条数据,运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f2973fa5d3f94d90a1f33427a7350ca7.png#pic_center)

真实数据库 表一,运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ec475b8323174741adfb18abaf24d99f.png#pic_center)

真实数据库 表二,运行结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e95432d9f2464909bdf7ae25fb8123ff.png#pic_center)

2. 分库
- 配置
复制代码


         # 3、创建客户端连接库         schemaName: hmms                  # 1、连接mysql         dataSources:           hmmsdatasources-0: #真实数据库0             url: jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false             username: 用户名             password: 密码              connectionTimeoutMilliseconds: 30000             idleTimeoutMilliseconds: 60000             maxLifetimeMilliseconds: 1800000             maxPoolSize: 50           hmmsdatasources-1: #真实数据库1             url: jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false             username: 用户名             password: 密码              connectionTimeoutMilliseconds: 30000             idleTimeoutMilliseconds: 60000             maxLifetimeMilliseconds: 1800000             maxPoolSize: 50                          # 2、分片规则         shardingRule:           tables: #表             user: #逻辑表名               actualDataNodes: hmmsdatasources-${0..1}.user #分表               tableStrategy: #数据分表策越                 inline:                   shardingColumn: useid #分表字段                   algorithmExpression: user-${useid % 2} #对useid取模分表             defaultDatabaseStrategy: # 数据分库策略             inline:              shardingColumn: useid #分库字段              algorithmExpression: hmmsdatasources-${useid % 2}  #对Id取模分库productdatasources-0  
复制代码


3. 分库分表
- 配置
复制代码


         # 3、创建客户端连接库         schemaName: hmms                  # 1、连接mysql         dataSources:           hmmsdatasources-0: #真实数据库0             url: jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false             username: 用户名             password: 密码              connectionTimeoutMilliseconds: 30000             idleTimeoutMilliseconds: 60000             maxLifetimeMilliseconds: 1800000             maxPoolSize: 50           hmmsdatasources-1: #真实数据库1             url: jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false             username: 用户名             password: 密码              connectionTimeoutMilliseconds: 30000             idleTimeoutMilliseconds: 60000             maxLifetimeMilliseconds: 1800000             maxPoolSize: 50                          # 2、分片规则         shardingRule:           tables: #表             user: #逻辑表名               actualDataNodes: hmmsdatasources-${0..1}.user-${0..1} #分表               tableStrategy: #数据分表策越                 inline:                   shardingColumn: useid #分表字段                   algorithmExpression: user-${useid % 2} #对useid取模分表           defaultDatabaseStrategy: # 数据分库策略             inline:              shardingColumn: useid #分库字段              algorithmExpression: hmmsdatasources-${useid % 2}  #对Id取模分库productdatasources-0  
复制代码

四、ShardingSphere-Proxy 运行原理

  • 整体架构


  • 总共 6 个阶段:

  • 1、Database Adaptors:数据库的选择

  • 2、SQL Parser:解析 sql

  • 3、SQL Router:sql 路由 去哪一个真实数据库执行

  • 4、SQL Rewriter:sql 优化重写 核心 保证性能

  • 5、SQL Executor Engine:执行 sql 语句 真实数据库获取结果

  • 6、Result Merger:结果合并 从多个表获取结果

五、ShardingSphere_Proxy 分片原理

  • 分片的概念

  • 就是将数据分片到不同的表中。

  • 分片键

  • 分片键就是表中的字段。就是根据什么字段分片的。

  • 分片算法

  • 根据规则【分片算法】按分片键将数据分到不同的表中。

  • 取模算法

  • 缺陷

  • 只能时数字类型

  • hash+取模

  • 如果分片键为字符类型,就用 hash+取模的方式进行分片。


      Math.abs(分片键.hashCode()%2)
复制代码


发布于: 刚刚阅读数: 2
用户头像

@@神农

关注

还未添加个人签名 2022.03.14 加入

好好学习,天天向上!

评论

发布
暂无评论
ShardingSphere-Proxy分库分表(一)_分库分表_@@神农_InfoQ写作平台