1 配置读写分离
创建一个用于读写分离操作的配置文件 application-master-slave.properties。
在配置文件中,设置主从库连接信息:
spring.shardingsphere.datasource.names=master,slave
设置分片节点名为 master, slave。
#datasource
spring.shardingsphere.datasource.names=master,slave
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://192.168.137.3:3366/shardingjdbc1?characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456
spring.shardingsphere.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.slave.jdbc-url=jdbc:mysql://192.168.137.3:3377/shardingjdbc2?characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=123456
在配置文件中,设置主从库节点名及负载均衡方法
spring.shardingsphere.masterslave.load-balance-algorithm-type=ROUND_ROBIN
这里设置为轮询的方式。
需要注意的是,slave节点的key是复数
spring.shardingsphere.masterslave.slave-data-source-names
而master节点的key是单数
spring.shardingsphere.masterslave.master-data-source-name
spring.shardingsphere.masterslave.name=datasource
spring.shardingsphere.masterslave.master-data-source-name=master
spring.shardingsphere.masterslave.slave-data-source-names=slave
spring.shardingsphere.masterslave.load-balance-algorithm-type=ROUND_ROBIN
设置用于做读写分离的表及主键生成算法
spring.shardingsphere.sharding.tables.province.key-generator.column=id
spring.shardingsphere.sharding.tables.province.key-generator.type=SNOWFLAKE
2 关闭主从复制
为了方便观察 ShardingJDBC 在做数据插入操作时,会向哪个数据库节点添加数据。需要首先关闭 MySQL 数据库的主从复制功能。
关闭的方法很简单,进入从库的 MySQL 字符串界面,输入如下指令即可:
stop slave
3 验证数据插入
3.1 向数据表 province 中添加一条记录
package com.myjdbc;
import com.myjdbc.entity.Province;
import com.myjdbc.repository.ProvinceRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ShardingJdbc.class)
public class TestMasterSlave {
@Resource
private ProvinceRepository provinceRepository;
@Test
public void testAdd(){
Province province = new Province();
province.setName("广东");
provinceRepository.save(province);
}
}
3.2 运行测试程序
观察控制台,仅向 master 节点发送了数据插入操作。
4 验证数据查询
4.1 创建数据查询的测试方法
使用 findAll() 方法查询数据表中所有记录,并将其打印出来。
@Test
public void queryData(){
List<Province> all = provinceRepository.findAll();
all.forEach(System.out::println);
}
4.2 运行测试程序
观察控制台,可以看到程序仅向 slave 节点发送了查询请求。
5 总结
通过以上测试可以发现:
- 通过 ShardingJDBC 做数据表更新操作时,包括新增、修改、删除等,仅将请求发给数据库集群中的主节点;
- 通过 ShardingJDBC 做数据表查询操作时,仅将请求发给数据库集群中的从节点。
从而实现了数据库集群的读写分离。