采⽤用Sharding-JDBC实现表分库分表+读写分离

1.软件环境

  • docker-CentOS7系统

  • 数据库mysql5.7.30

  • 各服务器IP和各功能:

IP数据库关系说明作用navcat连接名称
172.18.0.12master1主库负责分片数据的存储vx-localhost-master1
172.18.0.13master1的从库slave13负责分片数据的读取vx-localhost-slave13
172.18.0.14master1的从库slave14负责分片数据的读取vx-localhost-slave14
172.18.0.22master2主库负责分片数据的存储vx-localhost-master2
172.18.0.23master2的从库slave23负责分片数据的读取vx-localhost-slave23
172.18.0.24master2的从库slave24负责分片数据的读取vx-localhost-slave24

2.数据库设置:

mysql主从模式部署参考博文:https://blog.csdn.net/aofavx/article/details/106783795

1.使用docker从之前配置好的数据库主从镜像启动容器,并设置各容器ip和开放端口。
 docker run -d --privileged=true --name mysql-vx-master1 --network mysql --ip 172.18.0.12 -p 8022:22 -p 8021:21 -p 3312:3306 mysql-vx-master /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave11 --network mysql --ip 172.18.0.13 -p 8322:22 -p 8321:21 -p 3313:3306 mysql-vx-slave /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave12 --network mysql --ip 172.18.0.14 -p 8422:22 -p 8421:21 -p 3314:3306 mysql-vx-slave /usr/sbin/init
 

 docker run -d --privileged=true --name mysql-vx-master2 --network mysql --ip 172.18.0.22 -p 8122:22 -p 8121:21 -p 3322:3306 mysql-vx-master /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave23 --network mysql --ip 172.18.0.23 -p 8522:22 -p 8521:21 -p 3323:3306 mysql-vx-slave /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave24 --network mysql --ip 172.18.0.24 -p 8622:22 -p 8621:21 -p 3324:3306 mysql-vx-slave /usr/sbin/init
2.设置从数据库的同步主库配置
  • 从数据库172.18.0.13,172.18.0.14设置
mysql> change master to master_host='172.18.0.12',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=154;
  • 从数据库172.18.0.23,172.18.0.34设置
change master to master_host='172.18.0.22',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000029',master_log_pos=154;

3.主从数据库读写程序代码和配置

  • ​ 数据库表结构

    CREATE TABLE `c_order`(
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `is_del` bit(1) NOT NULL DEFAULT 0 COMMENT '是否被删除',
    `user_id` int(11) NOT NULL COMMENT '⽤用户id',
    `company_id` int(11) NOT NULL COMMENT '公司id',
    `publish_user_id` int(11) NOT NULL COMMENT 'B端⽤用户id',
    `position_id` int(11) NOT NULL COMMENT '职位ID',
    `resume_type` int(2) NOT NULL DEFAULT 0 COMMENT '简历类型:0附件 1在线',
    `status` varchar(256) NOT NULL COMMENT '投递状态 投递状态WAIT-待处理理 AUTO_FILTER-⾃自动过滤 PREPARE_CONTACT-待沟通 REFUSE-拒绝ARRANGE_INTERVIEW-通知⾯面试',
    `create_time` datetime NOT NULL COMMENT '创建时间',
    `update_time` datetime NOT NULL COMMENT '处理理时间',
    PRIMARY KEY (`id`),
    KEY `index_userId_positionId` (`user_id`, `position_id`),
    KEY `idx_userId_operateTime` (`user_id`, `update_time`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
    
  • ​ 实体类

在这里插入图片描述

  • ​ Repository类
    在这里插入图片描述在这里插入图片描述

  • 测试类
    在这里插入图片描述

  • application.yml配置文件

    使用spring.shardingsphere.sharding.tables.表名.database-strategy.inline.sharding-column指定按哪个字段 进行分片

    使用spring.shardingsphere.sharding.tables.表名.database-strategy.inline.algorithm-expression指定每个值被分配都哪个库。

    使用spring.shardingsphere.sharding.master-slave-rules设置各个主库和从库的读写分离配置。
    在这里插入图片描述
    在这里插入图片描述

4.测试结果

  • 添加数据

    每条insert语句都根据user_id规则被分配到对应主库执行。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    ​ 可以看到user_id为偶数的被分配到了master1,为奇数的被分配到了master2.

  • 查询数据
    在这里插入图片描述
    分别查询了从库slave11和slave23得到了总的记录数据。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页