一、前言
某个应用场景中,在操作数据库这部分,往往是数据库的读取往往大于数据库的写入,当读取数据达到数据库的瓶颈时,性能下滑,影响数据的写入,导致整个应用的不可用。为了解决这个问题,这时,引入了 读写分离的数据库架构,多个从库分摊了读数据的压力。
二、什么是读写分离
读写分离其实就是将数据库分为主从库,主库负责写入数据,从库负责读取数据,主库与从库通过 mysql 的 Slave机制进行主从复制。主数据库只有一个,从数据库有多个,这是一种常见的数据库架构。
三、读写分离的结构图
上图,客户端访问服务器,服务器通过 数据库中间件 或者其他的逻辑,使得[写入、修改、删除] 操作 主库 , 而查询读取从库。
主库生产 binary log 的二进制日志文件,通过 slave 机制,通过连接主库,读取 binarylog 生成 中级文件,从数据同步 中级文件,写入从数据库,从而实现了 主从数据的同步。
四、前提条件
1、搭建读写分离数据库结构前,读库 slave 需要跟写库 master 的数据一致。
2、写数据必须操作主库
3、读去数据不一定是从库,因为从库同步主库的数据,会有一定的延迟,在延迟内,主从数据可能不一致,因此,在某些特殊的情况下,需要读取主库来保证数据的即使型。
读写分离降低主数据库的读压力,但是并不代表主库就不允许读数据了。在一些特殊场景允许读取主数据库的数据。
五、环境准备
为了实验,我这里准备了3台机器,一台 window , 2台 centos 7 的虚拟机。
避免一些不必要问题,推荐主从mysql 版本一致。
主机 | 角色 | 系统 | mysql版本 | |
192.168.83.1 | 主 | win11 | 5.7.26 | 注意开放3306端口 |
192.168.23.148 | 从 | centos7 | 8.0.34 |
主数据库:
从数据库:
六、配置主数据库
我们配置主数据库时,只需要生成 binary log 的二进制日志文件 和创建一个拥有访问权限的 mysql 用户 即可,其他的操作不会影响到从数据库的配置。
1、看看一下主数据库的状态
查看 主库的状态。
show master status;
输出结果:
从上图可以看出, 暂时没有主从的设置。
2、配置文件的设置
找到 win 11 下面的 mysql 配置文件 my.ini 。在 配置文件的 [mysqld] 下面增加配置,如下:
# 这里填1 ,可以任意填写,但是不允许数据库之间同
server-id=1
# 只备份的数据库
binlog-do-db=demo_slave
# binlog_ignore_db 表述忽略备份的数据库
binlog_ignore_db=mysqld
# binary log 二进制日志文件的格式,有三种(statement , row , mixed),可以根据场景选用,mysql默认采用statement,建议使用mixed
binlog_format=mixed
# 二进制文件记录
log-bin=master-bin
# 生成二进制文件的名称格式
log-bin-index=master-bin.index
把上面的配置复制到 mysql 的配置文件,然后重启 mysql 服务,在使用 show master status; 查看主库的配置情况。
主从配置还有很多配置,请自行配置百度。
重启之后,你会发现在 mysql 存放数据库的文件里面出现了 对应的 binary log 文件。
登录 MySQL, 查看状态:
如果出现上诉结果,则主库的配置部分已完成。
3、创建主从访问的用户
1、查看一下用户
2、创建复制用户 [repl]
-- 创建用户
create user repl;
3、给[repl]用户权限
# 给 repl 用户授权,并设置密码为 replpwd
# 允许 % 所有服务器访问
grant replication slave on *.* to 'repl'@'%' identified by'replpwd';
输出结果:
七、配置从数据库
1、查看从数据库的slave状态
# 查看 slave 的状态
show slave status \G;
2、查看从数据库的配置
3、配置文件的设置
在配置文件 【mysqld】 下面增加配置如下:
# 这里填2 ,可以任意填写,但是不允许数据库之间同
server-id=2
# 中继日志文件的命名格式
relay-log-index=slave-relay-bin.index
# 中继日志文件的汇总文件
relay-log=slave-relay-bin
# 只复制数据库 , 多个数据库写多条
#只复制db1和db2数据库
; replicate-do-db=db1
; replicate-do-db=db2
replicate-do-db=demo_slave
# 忽略复制数据库 , 多个数据库写多条
replicate-ignore-db=mysql
配置完成后,重启 mysql 服务,然后查看
配置完成后, mysql 的数据 目录下 自动生产了 4个数据文件。
4、链接主数据库
-- 连接数据库
CHANGE MASTER TO
MASTER_HOST='192.168.83.1',
MASTER_USER='repl',
MASTER_PASSWORD='replpwd',
MASTER_PORT=3306,
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=154;
-- MASTER_HOST 主数据库的IP
-- MASTER_USER 主数据库的用户
-- MASTER_PASSWORD 主数据库的用户密码
-- MASTER_PORT 主数据库的端口,必须查看主数据库服务器是否有开放端口
-- MASTER_LOG_FILE 主数据库的 binarylog 二进制日志文件
-- MASTER_LOG_POS 主数据库的 binarylog 二进制日志 的偏移量(主数据库是多少则填多少)
启动 slave
start slave
如果报错:
ERROR 1872 (HY000): Replica failed to initialize applier metadata structure from the repository
因为从数据库可能以前配置过,生成过 中继日志文件,导致 从数据库 slave 中还记录着旧数据,这时可以使用 命令
reset slave
重新设置即可。
查看状态:
查看数据库:
5、检查从数据库是否运作正常
在主数据库创建 demo_master 数据库,看看 从数据库是否同步过来。
有上图可知,没有同步上来。