文章目录

    • 1 读写分离原理
    • 2 Mysql 配置主从复制
      • 2.1 创建2个Mysql 数据库服务,并启动两个Mysql服务
      • 2.2 配置Master库的/etc/my.cnf
      • 2.3 配置Slave库的/etc/my.cnf
      • 2.4 Master上创建用于主从复置的账号
      • 2.5 Slave上设置从库向主库同步
  • 首先切换到从库登录
    • 3 ShardingSphere实现读写分离
      • 3.1 配置properties
      • 3.2 编写po
      • 3.3 编写mapper
      • 3.4 编写Test
      • 3.5 TestRest
        • 3.5.1 主库
        • 3.5.2 从库
        • 3.5.3 写入时
        • 3.5.4 读取时

1 读写分离原理

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

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

2 Mysql 配置主从复制

2.1 创建2个Mysql 数据库服务,并启动两个Mysql服务

2.2 配置Master库的/etc/my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
port=3306# Master
# 开启日志
log-bin = mysql-bin
# 日志格式按行同步
binlog-format = ROW
# 设置服务id,主从不能一致
server-id = 1
# 设置需要同步的数据库
binlog-do-db = user_db
# 设置忽略系统库同步
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0# character config
character_set_server=utf8mb4[mysqld_safe]
log-error=/usr/local/mysql/data/mysql.log
pid-file=/usr/local/mysql/data/mysql.pid# include all files from the config directory!includedir /etc/my.cnf.d

主要配置

# Master
# 开启日志
log-bin = mysql-bin
# 日志格式按行同步
binlog-format = ROW
# 设置服务id,主从不能一致
server-id = 1
# 设置需要同步的数据库
binlog-do-db = user_db
# 设置忽略系统库同步
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys

2.3 配置Slave库的/etc/my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
port=3306# Slave
# 开启日志
log-bin = mysql-bin
# 日志按照行进行数据同步
binlog-format = ROW
# 设置服务id,主从不能一致
server-id = 2
# 设置需要同步的数据库
replicate-do-db=user_db
# 设置忽略系统库
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = sys#replicate-wild-ignore_table = mysql.%
#replicate-wild-ignore_table = information_schema.%
#replicate-wildignore_table = performance_schema.%
#replicate-wild-ignore_table = sys.%# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0#character config
character_set_server=utf8mb4[mysqld_safe]
log-error=/usr/local/mysql/data/mysql.log
pid-file=/usr/local/mysql/data/mysql.pid#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

主要配置

# Slave
# 开启日志
log-bin = mysql-bin
# 日志按照行进行数据同步
binlog-format = ROW
# 设置服务id,主从不能一致
server-id = 2
# 设置需要同步的数据库
replicate-do-db=user_db
# 设置忽略系统库
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = sys

2.4 Master上创建用于主从复置的账号

mysql -uroot -p123456 -h192.168.124.12
CREATE USER 'sync'@'%' IDENTIFIED WITH mysql_native_password BY '123456';# 授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'%';show grants for sync;# 刷新权限
flush privileges;# 确认位点,记录下文件名及位点
show master status;

mysql 数据库中查询user表获取文件名和点位

mysql-bin.0000011 156

2.5 Slave上设置从库向主库同步

首先切换到从库登录

mysql -uroot -p123456 -h192.168.124.11 -P3306
# 先停止同步
stop slave;# 修改从库指向到主库,使用上一步记录的文件名以及位点
CHANGE MASTER TO
master_host='192.168.124.12',
master_port=3306,
master_user='sync',
master_password='123456',
master_log_file='mysql-bin.000011',
master_log_pos=156;# 启动同步
start slave;# 查看slave 的状态
show slave status;
CREATE SCHEMA `testdb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
CREATE TABLE `testdb`.`t_user` (`id` BIGINT NOT NULL,`name` VARCHAR(45) NOT NULL,`age` INT NOT NULL,PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
INSERT INTO `testdb`.`t_user` (`id`, `name`, `age`) VALUES ('1', 'zhangsan', '3');

需要注意的是数据库的字符集编码必须一致

3 ShardingSphere实现读写分离

3.1 配置properties

# sharding-JDBC分片策略(主从复制配置)# 配置数据源,给数据源命名
spring.shardingsphere.datasource.names=m0,s0# 配置数据源具体内容,连接池、驱动、地址、用户名和密码
# testdb 主服务器
spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysql://192.168.124.12:3306/testdb?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=123456# 配置数据源具体内容,连接池、驱动、地址、用户名和密码
# testdb 从服务器
spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s0.url=jdbc:mysql://192.168.124.11:3306/testdb?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s0.username=root
spring.shardingsphere.datasource.s0.password=123456# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true# 主从库逻辑数据源定义 ds0 为testdb
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=m0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s0# t_user 分表策略,固定分配至ds0的t_user真实表
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds$->{0}.t_userspring.shardingsphere.sharding.tables.t_user.key-generator.column=id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE# 打印sql输出日志
spring.shardingsphere.props.sql.show=true

3.2 编写po

package com.ccb.sharding.po;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("t_user")
public class Student {@TableId("id")private Long id;private String name;private int age;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

3.3 编写mapper

package com.ccb.sharding.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ccb.sharding.po.Student;
import com.ccb.sharding.po.User;
import org.springframework.stereotype.Repository;@Repository
public interface StudentMapper extends BaseMapper<Student> {}

3.4 编写Test

package com.ccb.sharding;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ccb.sharding.mapper.StudentMapper;
import com.ccb.sharding.po.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ShardingApplicationTests {@AutowiredStudentMapper studentMapper;// ================= 测试读写分离 ======================@Testpublic void addStudentMaster() {Student student = new Student();student.setName("Lily");student.setAge(23);studentMapper.insert(student);}@Testpublic void getStudentSlave(){QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("id",1278468912563892226L);Student student = studentMapper.selectOne(queryWrapper);System.out.println(student);}}

3.5 TestRest

3.5.1 主库

3.5.2 从库

Result

3.5.3 写入时

3.5.4 读取时

以上可以看到主从都有数据,并且写入时是主库master,读取时是从库slave,实现了目标主从复制、读写分离

6、ShardingSphere 之 读写分离相关推荐

  1. ShardingSphere(七) 读写分离配置,实现分库读写操作

    概述:本章通过介绍使用ShardingSphere实现数据库的读写分离操作.在实现读写分离之前,数据库的主从同步需要提前配置完成,主从同步实现不由Sharding提供.主从同步可参考上一章节<S ...

  2. ShardingSphere(六) 读写分离之mysql 主从同步配置

    概述:本周介绍mysql的主从同步配置,为下一步的Sharding 读写分离提供操作环境.mysql 主从同步主要通过主库开启binlog文件功能,然后从库通过监听binlog中内容进行数据在从库的实 ...

  3. 视频教程-ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表-Java

    ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上 ...

  4. 视频教程-ShardingSphere:SpringBoot2+MybatisPlus+读写分离+分库分表-Java

    ShardingSphere:SpringBoot2+MybatisPlus+读写分离+分库分表 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职 ...

  5. ShardingSphere JDBC 分库分表 读写分离 数据加密

    简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...

  6. shardingsphere之sharding-proxy读写分离学习笔记

    shardingsphere之sharding-proxy读写分离学习笔记 引言 重要提示 演示环境 版本信息 代码示例和参考 读写分离简介 主从复制 主从复制的原理和流程 sharding-prox ...

  7. shardingsphere读写分离+分表【笔记】

    shardingsphere读写分离+分表 用到的框架:mybatis-plus.druid.shardingsphere-jdbc-spring-boot-starter 依赖(gradle配置,m ...

  8. Shardingsphere的分库分表+读写分离+分页条件查询

    Shardingsphere的分库分表与读写分离 导入依赖 <dependencies><dependency><groupId>org.springframewo ...

  9. shardingsphere: SpringBoot整合shardingjdbc实现读写分离

    文章目录 1. 引入jar包 2. 编写application.properties 3. 事务测试 3.1 测试代码 附录 1. 引入jar包 <dependency><group ...

最新文章

  1. Linux 网络管理(1) - 网络配置文件
  2. UWP 剪贴板 Clipboard
  3. AOP概述及实现原理
  4. unity2018关联不到vs_原尚股份VS.长久物流,整车物流和零部件物流,谁才是好生意?...
  5. java继承父类执行顺序_java中子类继承父类程序执行顺序问题
  6. 发力金融市场,中兴通讯有何硬实力?
  7. 【Presto】Cannot connect to discovery server for announce: Announcement failed with status code 404
  8. 2021年中国电动气动控制器市场趋势报告、技术动态创新及2027年市场预测
  9. 无法定位程序输入点WSAPoll于动态链接库WS2-32.DLL
  10. MAMP 403 Forbidden You don't have permission to access / on this server.
  11. node js unknown option -v._mac os上搭建node环境(nvm, node.js, npm)
  12. 《Linux 命令行大全》.pdf
  13. 机器学习基石-林轩田-第一周笔记
  14. python乱码怎么解决方法_python中文乱码的解决方法
  15. android模拟器上https抓包
  16. 'grunt' 不是内部或外部命令,也不是可运行的程序 或批处理文件
  17. Spring RestTemplate 实践
  18. opencv实现靶纸弹孔识别计数功能
  19. Android Studio实现一个记账本项目
  20. 查看电脑可支持最大内存容量的方法

热门文章

  1. server的自增主键返回函数 sql_mybatis+sqlserver中返回非自增主键
  2. windows11图文安装流程
  3. js 时间比较_成都js聚合物弹性防水涂料生产厂家来电洽谈_鹏晨防水
  4. 塞尔达传说gba_【译介】塞尔达传说:不可思议的帽子2004年开发者访谈
  5. python让用户输入字符串_当用户输入字符串而不是整数时,如何保护我的python代码?...
  6. 解决GPU模型训练的随机性
  7. scala与python混合调用实验
  8. 最小二乘法与最大似然函数的区别
  9. tensorflow.GraphDef was modified concurrently during serialization
  10. php mysql 白屏_apache+php+mysql的白屏问题