前言
大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用“分组架构”(读写分离架构)。
将数据库分为主机和从机,在主机进行写的操作,通过主从复制将数据同步到从机上,MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
1.环境准备
两台虚拟机,分别安装Mysql并启动服务成功:
主库Master 192.168.0.205
从库Slave 192.168.0.206
2.数据库进行主库的配置
2.1 修改主机中的配置文件
在主机中运行(192.168.0.205)
vi /etc/my.cnf
添加配置
log-bin=mysql-bin #[必须]启用二进制日志
server-id=100 #[必须]服务器唯一ID
2.2 进行重启数据库并登录
service mysql restart
mysql -u root -p
2.3 配置主库Master
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
注:上面SQL的作用是创建一个用户xiaoming,密码为Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
其中的(xiaoming)和(Root@123456)可以自定义;
注意:自定义时一定要做好记录,在从库中需要用到
2.4 查看Master的状态
show master status;
注:上面SQL的作用是查看Master的状态,执行完此SQL后不要再执行任何操作
3.数据库进行从库的配置
3.1 修改从机中的配置文件
在从机中运行(192.168.0.206)
vi /etc/my.cnf
添加配置
[mysqld]
server-id=101 #[必须]服务器唯一ID
3.2 进行重启数据库并登录
service mysql restart
mysql -u root -p
3.3 配置从库
change master to master_host='192.168.0.205',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000007',master_log_pos=154;
如果出现如图中的错误,是应为之前设置过。需要关闭后重新运行
注意:没有出现错误,不要运行stop slave;
stop slave;
重新运行配置连接代码
启动
start slave;
3.4 在从库中检查状态
show slave status;
图中的文件很乱,我们可以复制到VScode中进行查看。
如上图,出现两个yes证明设置成功
4. 进行检测
注意:两个虚拟机连接的MySQL都是使用root账户
在主库中创建数据库
刷新从库中的数据库
会自动出现a123数据库说明检测没有问题
4. 使用SpringBoot实现读写分离
4.1 导入maven坐标
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
4.2 在配置文件中配置读写分离规则
spring:
#数据源配置
shardingsphere:
datasource:
names:
master,slave
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.205:3306/reggie?characterEncoding=utf-8
username: root
password: 123456
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.206:3306/reggie?characterEncoding=utf-8
username: root
password: 123456
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
4.3 在配置文件中配置允许bean定义覆盖配置项
spring:
main:
allow-bean-definition-overriding: true
4.4 功能测试
4.4.1 控制台
出现如图中的两个库说明启动没用问题
4.4.2 读数据测试
如图可以看出读数据为sleve数据库
4.4.3 写数据测试
如图可以看出修改数据为master数据库