前言
🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~
之前我们说过,大聪明新加入了一个智慧运输平台建设的项目组,在项目组中学习到了许多之前没有接触过的东西。这不,大聪明又发现平台的建设过程中使用了两套 MySQL 数据库,也就是我们常说的主从库,这时候大聪明有了一个新的疑问:“这个主库和从库是怎么保证数据一致的呢🤔?”。这个新的问题又激起了大聪明的求知欲,接下来我们一起看看大聪明的求知历程✍
MySQL 主从库
其实在搭建一些小的应用软件时,使用一套数据库就够了,那我们先来一起看一下为什么会用到主从库👇
使用主从库的主要原因有两点:
1、在复杂的业务系统中,如果有一句 sql 语句需要锁表,那么就会导致我们暂时不能使用这张表的读服务,这也就有可能影响到正常运行中的业务。如果此时我们使用主从库,让主库负责写,从库负责读,这样即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2、架构的扩展,业务量越来越大,单机无法满足高频率的I/O访问,此时做多库的存储,可以降低单个磁盘I/O访问的频率,从而提升效率。
既然我们使用到了主从库,那么我们就需要保证主从库的数据是一致的,这样无论系统读取哪一套 MySQL 的数据都可以保证结果是正确的,此时我们就需要用到主从复制了。
MySQL 主从复制
主从复制的概念很简单,他指的是数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点,说白了就是 CTRL+C、CTRL+V 。
MySQL主从复制是一个异步的复制过程,底层是基于 MySQL 数据库自带的二进制日志功能(也就是 Binlog)。就是一台或多台 MySQL 数据库从另一台 MySQL 数据库进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致(主从复制是 MySQL 数据库自带功能,我们无需借助第三方工具)。
接下来我们一起看看主从复制的原理👇
① master 服务器将数据的改变记录二进制 binlog 日志,当 master 上的数据发生改变时,则将其改变写入二进制日志中。
② slave 服务器会在一定时间间隔内对 master 服务器的二进制日志进行探测,判断其是否发生改变,如果发生改变,则开始一个 I/O Thread 请求 master 二进制文件内容。同时传送过来的信息,会记录到 http://master.info 中。
③ 同时主节点为每个 I/O 线程启动一个 dump 线程,用于向其发送二进制文件,并保存至从节点本地的中继日志(即Relaylog)中,接下来从节点启动 SQL 线程从中继日志中读取二进制日志并在本地重放,并且把应用过的内容记录到 http://relay-log.info 中,使得其数据和主节点的保持一致,最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒。
MySQL 主从同步时,可以选择的 Binlog 模式有3种,分别是 statement、row、mixed。
- statement: 会将对数据库操作的 sql 语句写入到 Binlog 中
- row: 会将每一条数据的变化写入到 Binlog 中
- mixed: statement 与 row 的混合。MySQL 决定什么时候写 statement 格式的,什么时候写 row 格式的 Binlog。
根据目前的实际情况来说,建议将 Binlog 模式设置为 ROW。因为现在随着固态硬盘的普及,磁盘 I/O 的性能得到大幅提升,在SSD加持下, I/O 成为瓶颈的可能性比较小,并且 ROW 模式的 Binlog 记录了完整的变更信息,在恢复数据上面将会很容易。即使我不消息误删了一行记录,我也可以通过 Binlog 捞回原来的所有字段信息,然后转变成 insert 进行插入;如果执行的是 update 语句,由于 ROW 模式的 Binlog 会完整记录修改前和修改后的整行数据,所以也可以很容易的进行恢复。语句如下👇
– 是将 mysql-bin.000001 文件中 position 在1000到1200字节之间的内容解析出来,放到 MySQL 中执行
mysqlbinlog /var/log/mysql/mysql-bin.000001 --start-position=1000 --stop-position=1200 | mysql -h127.0.0.1 -P3306 -u$ user -p$ pwd;
MySQL 主从配置步骤
🍓 主机配置 修改配置文件: vi /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=ROW
🍓 从机配置 修改配置文件: vi /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
🍓 重启主、从 MySQL 服务,并关闭防火墙
service mysqld restart
systemctl status firewalld.service
🍓 在主机上建立帐户并授权 slave
#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON . TO ‘slave’@‘%’ IDENTIFIED BY ‘slave’;
#查询master的状态,输出的内容在配置从机时会用到
show master status;
🍓 在从机上配置需要复制的主机
#复制主机的命令
CHANGE MASTER TO MASTER_HOST=‘主机的IP地址’,
MASTER_USER=‘slave’,
MASTER_PASSWORD=‘slave’,
MASTER_LOG_FILE=‘mysql-bin.xxxx’,MASTER_LOG_POS=xxx;
#启动从服务器复制功能
start slave;
#查看从服务器状态(如果输出的 Slave_IO_Running、Slave_SQL_Running两个参数值都为YES,则说明我们配置成功了)
show slave status;
小结
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西