1.软件环境
-
docker-CentOS7系统
-
数据库mysql5.7.30
-
各服务器IP和各功能:
IP | 数据库关系说明 | 作用 | navcat连接名称 |
---|---|---|---|
172.18.0.12 | master1主库 | 负责分片数据的存储 | vx-localhost-master1 |
172.18.0.13 | master1的从库slave13 | 负责分片数据的读取 | vx-localhost-slave13 |
172.18.0.14 | master1的从库slave14 | 负责分片数据的读取 | vx-localhost-slave14 |
172.18.0.22 | master2主库 | 负责分片数据的存储 | vx-localhost-master2 |
172.18.0.23 | master2的从库slave23 | 负责分片数据的读取 | vx-localhost-slave23 |
172.18.0.24 | master2的从库slave24 | 负责分片数据的读取 | vx-localhost-slave24 |
2.数据库设置:
mysql主从模式部署参考博文:https://blog.youkuaiyun.com/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得到了总的记录数据。