三Sharding-JDBC实现读写分离

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三Sharding-JDBC实现读写分离相关的知识,希望对你有一定的参考价值。

一、Sharding-JDBC实现读写分离

1.1、读写分离概念

为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行的操作。

让主数据库(master)处理事务性增、改、删操作,而从数据库(slave)处理查询操作。

1.2、读写分离原理

**主从复制:**当主服务器有写入(insert / update / delete)语句时候,从服务器自动获取。
读写分离:insert / update / delete语句操作一台服务器,select操作另一台服务器。

Sharding-JDBC通过SQL语句语义分析,实现读写分离过程,不会做数据同步。

二、mysql配置读写分离

首先准备两台MySQL服务器,在Linux上安装MySQL,请参考:https://blog.csdn.net/qq_15092079/article/details/81629238
mysql数据库的主从同步,实现读写分离

准备的两台MySQL服务器如下:
master:192.168.64.110
slave:192.168.64.111

2.1、master主服务器的配置

2.1.1、配置文件my.cnf

说明:
server-id 服务器唯一标识。
log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。

server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=db_user

2.1.2、创建从服务器的用户和权限

grant replication slave on *.* to sync_user@'192.168.64.%' identified by '123456';

2.1.3、重启MySQL服务

2.1.4、查看主服务器状态

2.2、salve从服务器的配置

2.2.1、配置文件my.cnf的修改

备注:
#备注:
#server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
#relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
#replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
#replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。

server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
# replicate-do-db=db_user

2.2.2、重启MySQL服务

2.2.3、连接master主服务器

change master to master_host='192.168.64.110',master_port=3306,master_user='sync_user',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;

2.2.4、启动slave数据同步

#启动slave数据同步
mysql> start slave;
#停止slave数据同步(若有需要)
mysql> stop slave;

2.2.5、查看slave信息

Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功。
如果没有设置为YES,请参考如下链接,进行处理。
Slave_SQL_Running:No的两种解决办法
MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法

2.3、测试

2.3.1、在master主数据库,创建数据。

create database db_user;

use db_user;

CREATE TABLE t_user  (
  user_id bigint(0) NOT NULL,
  user_name varchar(50)  NULL DEFAULT NULL,
  ustatus varchar(2)  NULL DEFAULT NULL,
  PRIMARY KEY (user_id)
);

INSERT INTO t_user(user_id,user_name,ustatus) VALUES('1','zhangsan','1');

2.3.2、查看slave从数据库

发现从数据库中,也出现了db_user库、t_user表,且表中还有一条测试数据存在,证明同步数据成功。

三、Sharding-JDBC操作读写分离

3.1、代码

  • User.java
package com.xbmu.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_user") // 指定表
public class User 
    private Long userId;
    private String userName;
    private String ustatus;

  • UserMapper.java
package com.xbmu.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xbmu.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> 

  • application.properties
# sharding-jdbc分片策略
# 配置数据源、给数据源起名称
spring.shardingsphere.datasource.names=m1,s1

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true

# 配置数据源具体内容,包括连接池、驱动、地址、用户名和密码
# master主数据源
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://192.168.64.110:3306/db_user?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root

# slave从数据源
spring.shardingsphere.datasource.s1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s1.url=jdbc:mysql://192.168.64.111:3306/db_user?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s1.username=root
spring.shardingsphere.datasource.s1.password=root

# 主库从库逻辑数据源定义 ds0 为 db_user
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=m1
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s1

# t_user分表策略,固定分配至ds0的t_user真实表
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds0.t_user

# 指定db_user库中t_user表里面主键user_id生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

  • ShardingjdbcdemoApplicationTests.java
package com.xbmu;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xbmu.entity.User;
import com.xbmu.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests 

    @Autowired
    private UserMapper userMapper;
    @Test
    public void addUserDB()
        User user = new User();
        user.setUserName("lucy");
        user.setUstatus("0");
        userMapper.insert(user);
    
    @Test
    public void findUserDB()
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id","");
        User user = userMapper.selectOne(wrapper);
        System.out.println(user);
    


3.2、测试



以上是关于三Sharding-JDBC实现读写分离的主要内容,如果未能解决你的问题,请参考以下文章

Sharding-JDBC 几行配置实现读写分离~

MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离

MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离

MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离

MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离

Sharding-JDBC实现读写分离