三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实现读写分离的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离
MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离
MySQL 数据库MySQL 主从复制和 Sharding-JDBC 实现读写分离