ShardingJDBC 10_读写分离的实现

210 阅读1分钟

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 节点发送了数据插入操作。 image.png

4 验证数据查询

4.1 创建数据查询的测试方法

使用 findAll() 方法查询数据表中所有记录,并将其打印出来。

@Test
public void queryData(){
    List<Province> all = provinceRepository.findAll();
    all.forEach(System.out::println);
}

4.2 运行测试程序

观察控制台,可以看到程序仅向 slave 节点发送了查询请求。

image.png

5 总结

通过以上测试可以发现:

  • 通过 ShardingJDBC 做数据表更新操作时,包括新增、修改、删除等,仅将请求发给数据库集群中的主节点;
  • 通过 ShardingJDBC 做数据表查询操作时,仅将请求发给数据库集群中的从节点。

从而实现了数据库集群的读写分离。