likes
comments
collection
share

大聪明教你学Java | 带你了解 Binlog 实现 MySQL 主从同步的原理及实现方式

作者站长头像
站长
· 阅读数 14

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言💌~

之前我们说过,大聪明新加入了一个智慧运输平台建设的项目组,在项目组中学习到了许多之前没有接触过的东西。这不,大聪明又发现平台的建设过程中使用了两套 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 二进制文件内容。同时传送过来的信息,会记录到 master.info 中。 ③ 同时主节点为每个 I/O 线程启动一个 dump 线程,用于向其发送二进制文件,并保存至从节点本地的中继日志(即Relaylog)中,接下来从节点启动 SQL 线程从中继日志中读取二进制日志并在本地重放,并且把应用过的内容记录到 relay-log.info 中,使得其数据和主节点的保持一致,最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒。

大聪明教你学Java | 带你了解 Binlog 实现 MySQL 主从同步的原理及实现方式

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 -uuser−p user -puserp 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 restartsystemctl 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;

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

爱你所爱 行你所行 听从你心 无问东西