ShardingSphere-读写分离
读写分离
- 依赖于 MySQL的主从集群 搭建手册
- 查询 走的是从库(Slave)
- 新增、更新、删除走的是主库(Master)
MySQL主从集群
节点角色 | 主机地址 | 端口 | 用户名 | 密码 | 库名 |
---|---|---|---|---|---|
master | 192.168.40.128 | 3306 | root | Root@123456 | db_demo |
slave | 192.168.40.129 | 3306 | root | Root@123456 | db_demo |
创建 user
表
主节点执行见表语句
CREATE TABLE `user` (
`id` bigint NOT NULL,
`client_id` bigint NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
从节点刷新查看
项目代码
复用之前的
user
表操作代码即可
读写分离配置
application.yml
# 主从配置 读写分离
server:
port: 8081
spring:
main:
# 一个实体类对应两张表,覆盖
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: m1,s1 # 主库 从库
m1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.40.128:3306/db_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: Root@123456
s1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.40.129:3306/db_demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: Root@123456
sharding:
tables:
user:
# 分表策略 固定分配到主库的user表 即 m1.user
actual-data-nodes: m1.user
# 主库从库规则定义
master-slave-rules:
m1:
# 主库
master-data-source-name: m1
# 从库
slave-data-source-names: s1
props:
# 打印SQL日志
sql:
show: true
测试结果
新增测试
- 测试类代码
@Test
void insert() {
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(i + 1);
user.setName("user_" + user.getId());
user.setClientId(10000);
user.setAge(18 + i);
userMapper.insert(user);
}
}
- 运行结果
操作的必须是主库 对应的数据源
m1
- 主库查看
- 从库查看
更新测试
- 修改前
- 测试类代码
修改 id=5 的记录的 name,
user_5
=>Tom
@Test
void update() {
User user = new User();
user.setId(5);
user.setName("Tom");
userMapper.updateById(user);
}
- 运行结果
操作的必须是主库 对应的数据源
m1
- 查看主库
- 查看从库
删除测试
删除 id=5 的记录
- 测试代码
@Test
void delete() {
userMapper.deleteById(5);
}
- 运行结果
操作的必须是主库 对应的数据源
m1
- 查看主库
- 查看从库
查询测试
指定ID查询,查找id为 2、3 的记录
- 测试代码
@Test
void selectById() {
List<User> list = userMapper.selectList(new QueryWrapper<User>().in("id", 2, 3));
System.out.println(JSONArray.toJSONString(list));
}
- 运行结果
操作的必须是从库 对应的数据源
s1
总结
- 完美的诠释了
读写分离
- 验证了
MySQL主从集群的正确性
新增
、更新
、删除
都 操作主库 且 同步到从库查询
只能操作 从库