文章目录
MySQL主从复制
介绍
MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据车(slave,即从库)从另一台MySQL数据库〈master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
原理
🌼主库执行增删改操作发生改变时,会将所有的更新记录保存到二进制文件中(Binary log)。
🌼从库复制时,会创建两个线程,I/O线程和SQL线程。
- I/O线程会读取
Binarylog
文件内容,并写入中继日志(Relay log)。 - 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对象
查看源码,确实是这样。
解决方法,将上面配置文件中的最后两行注释打开即可
启动项目
发现创建了两个数据源对象。
测试
- 查询测试
- 增加操作
- 删除操作
- 修改操作
主库执行增删改操作,从库执行查询操作。
主库从库数据相同