天天看点

带你了解 Binlog 实现 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 将进入睡眠状态,等待下一次被唤醒。

带你了解 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 -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;

继续阅读