MySQL主备

2019-04-01  本文已影响0人  剑客kb

MySQL主备数据流转流程

主备流转图

备库B和主库A维持了一个长连接
1、在备库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。
2、在备库 B 上执行 start slave 命令,这时候备库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。
3、主库 A 校验完用户名、密码后,开始按照备库 B 传过来的位置,从本地读取 binlog,发给 B。
4、备库 B 拿到 binlog 后,写到本地文件,称为中转日志(relay log)。
5、sql_thread 读取中转日志,解析出日志里的命令,并执行。

binlog的三种格式

statement

当 binlog_format=statement 时,binlog 里面记录的就是 SQL 语句的原文。但是对于下列语句全是不安全了,可能会导致主备不一致,因为如果选择的索引不一样,删除的行也不一样

mysql> delete from t /*comment*/  where a>=4 and t_modified<='2018-11-10' limit 1;

row

当 binlog_format 使用 row 格式的时候,binlog 里面记录了真实删除行的主键 id,这样 binlog 传到备库去的时候,就肯定会删除 id=4 的行,不会有主备删除不同行的问题

mixed statement和row混合

当然我要说的是,现在越来越多的场景要求把 MySQL 的 binlog 格式设置成 row。因为恢复数据会比较方便,能清晰地恢复对应id的数据,而statement则不好做。

循环复制问题

双 Master 结构循环同步binlog问题:

日志在备库上的执行,就是图中备库上 sql_thread 更新数据 (DATA) 的逻辑。如果是用单线程的话,就会容易导致备库应用日志不够快,造成主备延迟。

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。

多线程复制模型

官方 MySQL5.6 版本,支持了并行复制,只是支持的粒度是按库并行。理解了上面介绍的按表分发策略和按行分发策略,你就理解了,用于决定分发策略的 hash 表里,key 就是数据库名。

参考:https://time.geekbang.org/column/article/76446

上一篇 下一篇

猜你喜欢

热点阅读