Mysql主从同步原理
一句话概括就是:slaver读取master的binlog并顺序执行
- MySQL的主从复制是一个异步复制过程。在master与slave之间实现整个主从复制的过程是由三个线程参与完成的。其中两个线程(SQL thread and IO thread)在slave端,另一个线程(IO dump thread)在master端。
- 要实现master的主从复制,首先必须打开master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是slave从master端获取binlog日志,然后再在slave上以相同的执行顺序获取binlog日记记录中的各种sql操作。
知识点
- 3个线程:主库IO,从库IO,SQL线程
- 从库作用
- relay-log作用
- 异步复制
- binlog作用
主从同步详细过程
- master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中。
- slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,若发生改变,则开始一个I/O thread请求master二进制事件。
- 同时master为每个I/O thread启动一个 I/O dump thread,用于向其发送二进制事件,并保存至slave本地的relay-log(中继日志)文件中,slave将启动SQL thread从relay-log中读取二进制日志,并解析成SQL语句逐一执行,使数据和master的保持一致,最后I/O thread 和SQL thread将进入睡眠状态,等待下一次被唤醒。
知识点小结
- 主从复制是异步逻辑的SQL语句级的复制
- 复制时,主库只有一个线程,从库有两个线程
- 实现主从复制的必要条件是主库要开启记录binlog功能
- 作为复制所有MySQL节点的server_id都不能相同
- binlog文件只记录对数据有更改的SQL语句(来自主库内容的变更),不记录任何查询(select,show)语句
今日问答
本地事务断电的这种情况,是怎么保证数据一致性的?
我们可以使用SQL server来举例,在使用SQL server数据库是由两个文件组成的:数据库文件和日志文件。通常情况下,日志文件都要比数据库文件大很多。数据库进行任何写入操作的时候都是要先写日志的,因此我们在执行事务的时候数据库首先会记录下这个事务的redo操作日志,然后才开始真正操作数据库,在操作之前会将日志文件写入磁盘,那么当突然断电的时候,即使操作没有完成,在重新启动数据库的时候,数据库会根据当前数据的情况进行undo回滚或者是redo回滚,来保证数据的一致性。