聊一聊ShardingSphere的读写分离

什么是 ShardingSphere

Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。

ShardingSphere-JDBC

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。

ShardingSphere-Proxy

ShardingSphere-Proxy 定位为透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持。

ShardingSphere支持很多功能,比如数据分片、分布式事务、读写分离、高可用等等。今天我们主要聊一聊ShardingSphere-JDBC的读写分离。
首先我们要进行MySQL的主从搭建,为了更好的学习我们搭建一主两从。在docker中通过不同的端口,进行MySQL的搭建。
主服务器的搭建:

docker run -d \
-p 3306:3306 \
-v /yy/mysql/master/conf:/etc/mysql/conf.d \
-v /yy/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name yy-mysql-master \
mysql:8.0.29
//修改config文件夹下my.cnf文件
[mysqld]
server-id=1
-p docker的3306端口映射到宿主机3306端口;-v 是docker中文件夹映射到宿主机的文件夹;--name 是docker中Mysql的名称

在docker中创建MySQL后,执行下面代码查看是否成功

//进入容器,后面是避免中文乱码
docker exec -it yy-mysql-master env LANG=C.UTF-8 /bin/bash
//避免低版本客户端连接失败,8.0版本检验方式改变了
alter user 'root'@'%' identified with mysql_native_password by '123456';
//在主服务器中查询status,记录下面数据,在从服务器中有用
show master status;
 binlog.000003 |     1357 
主机中创建slave用户
create user 'yy_slave'@'%'
设置密码
alter user 'yy_slave'@'%' identified with mysql_native_password by '123456'
授予复制权限 
grant replication slave on *.* to 'yy_slave'@'%';
刷新
flush privileges;
//slave1
docker run -d \
-p 3307:3306 \
-v /yy/mysql/slave1/conf:/etc/mysql/conf.d \
-v /yy/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name yy-mysql-slave1 \
mysql:8.0.29
//修改config文件夹下my.cnf文件
[mysqld]
server-id=2
alter user 'root'@'%' identified with mysql_native_password by '123456';

change master to master_host='IP地址',
master_user='yy_slave',master_password='123456',master_port=3306,
master_log_file='binlog.000003',master_log_pos=1357;
docker run -d \
-p 3308:3306 \
-v /yy/mysql/slave2/conf:/etc/mysql/conf.d \
-v /yy/mysql/slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name yy-mysql-slave2 \
mysql:8.0.29
//修改config文件夹下my.cnf文件
[mysqld]
server-id=3

alter user 'root'@'%' identified with mysql_native_password by '123456';

change master to master_host='IP地址',
master_user='yy_slave',master_password='123456',master_port=3306,
master_log_file='binlog.000003',master_log_pos=1357;

为了更好的测试ShardingSphere的读写分离,我们创建SpringBoot的项目进行测试:
用到jar包:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.1.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

application.properties文件

# 应用名称
spring.application.name=sharding-sph

spring.profiles.active=dev

spring.shardingsphere.mode.type=Memory

# 配置真实数据源
spring.shardingsphere.datasource.names=master,slave1,slave2

# 配置第 1 个数据源
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://IP地址:3306/db_user?serverTimezone=UTC&characterEncoding=UTF-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456

# 配置第 2 个数据源
spring.shardingsphere.datasource.slave1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.jdbc-url=jdbc:mysql://IP地址:3307/db_user?serverTimezone=UTC&characterEncoding=UTF-8
spring.shardingsphere.datasource.slave1.username=root
spring.shardingsphere.datasource.slave1.password=123456

# 配置第 3 个数据源
spring.shardingsphere.datasource.slave2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave2.jdbc-url=jdbc:mysql://IP地址:3308/db_user?serverTimezone=UTC&characterEncoding=UTF-8
spring.shardingsphere.datasource.slave2.username=root
spring.shardingsphere.datasource.slave2.password=123456

spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=master
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=slave1,slave2
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-name=alg_round

# 负载均衡算法配置
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_round.type=ROUND_ROBIN
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_random.type=RANDOM
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weiht.type=WEIGHT
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weiht.props.slave1=1.0
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weiht.props.slave2=2.0

spring.shardingsphere.props.sql-show=true
@Data
@TableName("t_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String uname;
}

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    UserMapper userMapper;

    @RequestMapping("insert")
    public void insert(){
        User user = new User();
        user.setUname("yy");
        userMapper.insert(user);
    }

    @Transactional
    @RequestMapping("insertAndSelect")
    public void insert2(){
        User user = new User();
        user.setUname("铁锤");
        userMapper.insert(user);

        List<User> users = userMapper.selectList(null);
    }

    @RequestMapping("SelectAll")
    public void insert3(){
        List<User> users = userMapper.selectList(null);
        for(User user:users){
            System.out.println(user);
        }
    }
}

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

在这里插入图片描述
在这里插入图片描述

最后查询数据库,我们可以发现从服务器能够及时同步主服务的数据,并且查询也能做到读写分离以及轮询(权重、随机)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ShardingSphere是一个开源的分布式数据库中间件,它提供了读写分离的功能。读写分离是指将读操作和写操作分别分配到不同的数据库实例上,以提高数据库的读写性能和可扩展性。ShardingSphere通过配置数据源和路由规则,可以实现读写分离的功能。在实际应用中,可以将读操作分配到多个只读数据库实例上,从而提高查询性能;而将写操作分配到主数据库实例上,保证数据的一致性。 ### 回答2: ShardingSphere是一个开源的数据库分库分表中间件,它提供了读写分离功能。读写分离是指将数据库的读操作和写操作分别分配给不同的数据库节点来执行,从而提高数据库的性能和可扩展性。 ShardingSphere的读写分离功能可以通过配置文件来实现。首先,我们需要在配置文件中指定主库和从库的连接信息,主库用于执行写操作,从库用于执行读操作。然后,我们需要指定如何切换读操作和写操作的逻辑,例如通过简单的轮询、权重分配等方式实现。此外,ShardingSphere还支持自定义的扩展逻辑,可以根据业务需求进行个性化的读写切换策略。 使用ShardingSphere的读写分离功能可以带来多个优势。首先,通过将读操作分配给从库,可以有效减轻主库的负载,提高主库的性能和稳定性。其次,通过水平拆分数据表,可以将大表分散到多个数据库中,进一步提升系统的扩展性和并发处理能力。另外,读写分离还可以提高数据的可用性,当主库出现故障时,从库仍然能够继续提供读服务,保证系统的正常运行。 总之,ShardingSphere的读写分离功能可以帮助我们优化数据库的性能和可扩展性,降低系统的负载压力,并提高系统的可用性和稳定性。通过合理配置读写切换逻辑,可以根据实际需求灵活地控制负载均衡和数据分布,从而满足不同规模和复杂度的应用场景的需求。 ### 回答3: ShardingSphere是一款开源的分布式数据库中间件,它提供了读写分离的功能。 读写分离是指将数据库的读操作和写操作分别分配给不同的数据库节点进行处理,以提高系统的读取性能和扩展性。具体来说,在一个读写分离架构中,通常会有一个主数据库节点用于处理写操作,而多个从数据库节点用于处理读操作。当应用程序发送读请求时,其中一个从节点会被选中来处理该请求,而当应用程序发送写请求时,会被发送到主节点处理。 使用ShardingSphere进行读写分离可以带来如下好处: 1. 提高系统的并发处理能力:由于读操作通常占据了系统的大部分请求,在多个从节点上分担读操作的负载可以有效提高系统的并发处理能力。 2. 加强系统的稳定性:当主节点发生故障时,从节点可以自动接替主节点的功能,从而保证系统可以继续正常运行,不受主节点故障的影响。 3. 提高系统的扩展性:通过增加从节点,可以很容易地扩展系统的读取性能,而无需修改应用程序的代码。 使用ShardingSphere进行读写分离的步骤如下: 1. 配置数据源:在配置文件中设置主数据库节点和从数据库节点的连接信息,包括URL、用户名、密码等。 2. 配置规则:通过ShardingSphere提供的规则配置功能,定义读写分离的规则,包括主节点、从节点的选择策略等。 3. 启动应用程序:在应用程序中引入ShardingSphere的依赖,启动应用程序时,ShardingSphere会自动基于规则配置对读写操作进行路由。 总之,ShardingSphere提供了强大的读写分离功能,可以帮助我们实现高性能、可扩展性和稳定性的分布式系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值