主从同步的过程如下图所示,核心就是,当从库连接上主库之后,主库为为这个从库创建一个dump线程,用于传输binlog。从库有一个IO线程来接收binlog并写入它的中转日志relay log,同时有一个SQL线程读取relay log进行执行。主从同步保证的是数据的最终一致性。主从同步的方式包括:
主从同步什么时候pull,什么时候push?答案是都有。当slave连上master,会告知master它目前的binlog fileName和同步位点pos, master收到后,会找到该文件并把剩下的binlog发给slave,这其实就是pull。当连接进行时,master侧有新的binlog产生时,主线程会广播dump thread有新binlog产生,然后再发给slave,也就是push。
主备延迟的定义:同一个事务,在主库执行完成到从库执行完成的这个时间差。根据主从同步的过程,我们可以把过程切割成3个时间点:
t1其实就是事务完成的时间(算主备延迟的起始时间点);t2-t1主要就是网络开销,正常情况下是很小的。所以主备延迟主要是来自于t3-t2即从库执行relay log的时间/消费中转日志的时间。
导致t3-t2时间较大的原因,有以下几点:
那么在主从同步的过程会不会出现主备数据不一致的问题呢?其实是有可能的。在日志模块,我们提到,binlog_format其实根本上有两种,一种是statement(SQL语句本身),一种是row(影响修改的行信息和事件)。
例如日志模块提到的这个栗子