MySQL主从复制和读写分离

MySQL主从复制

介绍

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据车(slave,即从库)从另一台MySQL数据库〈master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

原理

🌼主库执行增删改操作发生改变时,会将所有的更新记录保存到二进制文件中(Binary log)。
🌼从库复制时,会创建两个线程,I/O线程和SQL线程。

  1. I/O线程会读取Binarylog文件内容,并写入中继日志(Relay log)。
  2. SQL线程会读取Relaylog文件,并解析成具体的操作,在自己的库中重新执行一次,从而达到从库与主库的数据一致。
    在这里插入图片描述

配置

前提条件:两台服务器,每台服务器都安装了MySQL
主库:10.0.0.100
从库:10.0.0.101

配置主库(master)

🌼修改mysql数据库的配置文件/etc/my.cnf

vim /etc/my.cnf

文件中加入以下内容

log-bin=mysql-bin # 启用二进制日志 
server-id=100 # 服务器唯一ID

在这里插入图片描述
🌼重启mysql服务

systemctl restart mysqld

🌼为从库创建用户

# 登录mysql
mysql -uroot -proot
# 执行下面命令
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';

注:上面SQL的作用是创建一个用户xiaoming,密码为Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户对主库进行复制。

🌼记录File和Position的值

show master status;

在这里插入图片描述
注:上面SQL的作用是查看master的状态,执行完此SQL后不要再执行任何操作

配置从库(slave)

🌼修改mysql数据库的配置文件/etc/my.cnf

vim /etc/my.cnf

文件中加入以下内容

server-id=101 # 服务器唯一ID

注:此处的id号101不能和主库相同
在这里插入图片描述
🌼重启mysql服务

systemctl restart mysqld

🌼从库与主库连接

# 登录数据库
mysql -uroot -proot

# 执行下面命令
# 注意分号里面的内容改成自己的配置
change master to master_host='10.0.0.100',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=439;

其中master_log_file和master_log_pos来自主库执行show master status命令,查询出的内容。

如果此处报错this cperation cannot be performed with a running slave io thread; run STOP SLVE TO_THREAD FCR CHANNE '' Lfirst.
执行stop slave;命令。

# 执行完上面命令之后执行此命令
start slave;

🌼查看是否连接成功

show slave status;

在这里插入图片描述
内容太乱,我们将其复制出来查看。
在这里插入图片描述
在这里插入图片描述
🔗连接成功

测试

在master数据库中执行增删改操作,看slave数据库中是否具有相同的变化。

MySQL读写分离

介绍

面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

使用Sharding-JDBC实现读写分离

导入maven坐标

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>

在配置文件中配置读写分离规则

spring:
  application:
    name: demo
  shardingsphere:
    datasource:
      names:
        master,slave
      # 主数据源
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://10.0.0.100:3306/rw?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
      # 从数据源
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://10.0.0.101:3306/rw?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin #轮询
      # 最终的数据源名称
      name: dataSource
      # 主库数据源名称
      master-data-source-name: master
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #开启SQL显示,默认false
#  main:
#    allow-bean-definition-overriding: true # 允许bean定义覆盖

在配置文件中允许bean定义覆盖配置项

在这里插入图片描述
我们发现启动报错了,是由于连个类都想创建一个dataSource对象
在这里插入图片描述
在这里插入图片描述
查看源码,确实是这样。

解决方法,将上面配置文件中的最后两行注释打开即可
在这里插入图片描述
启动项目
在这里插入图片描述
发现创建了两个数据源对象。

测试

  1. 查询测试
    在这里插入图片描述
  2. 增加操作
    在这里插入图片描述
  3. 删除操作
    在这里插入图片描述
  4. 修改操作
    在这里插入图片描述
    主库执行增删改操作,从库执行查询操作。
    在这里插入图片描述
    主库从库数据相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值