MySQL主从一致原理
MySQL主从同步过程
一般MySQL的备库会设置成read-only,以避免发生数据不一致等情况,注意这个read-only对于超级用户无效(binlog可以正常执行),事务日志同步的过程如下:
- 在备库B上通过
change master
命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。 - 在备库B上执行
start slave
命令,这时候备库会启动两个线程,分别为io_thread和sql_thread。其中io_thread负责与主库建立连接。 - 主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B。
- 备库B拿到binlog后,写到本地文件,称为中转日志(relay log)。
- sql_thread读取中转日志,解析出日志里的命令,并执行。
binlog日志格式
一共有三种格式
Statement:
这种格式直接记录操作语句,如果使用limit时,可能会发生在主库和从库上选择不同索引而造成的查询结果不一致的问题
Row:
记录具体操作的rowID,不会出现主从不一致的问题。对于插入会记录具体插入内容和插入的行,对于删除也会记录全部删除内容,所以可以用于恢复数据,但是占用空间较大。
Mixed:
这种格式是上面两种进行混合,由MySQL去判断是不是会发生主从不一致,进而选择合适的binlog格式
在生产中,大部分会使用双master,这时要小心binlog的循环复制问题,可以通过日志中记录的server id来解决。
参考文献
MySQL实战45讲