首先,主库将变更写入binlog日志,然后从库连接到主库之后,从库有一个IO线程,将主库的binlog日志拷贝到自己本地,写入一个relay中继日志中。接着从库中有一个SQL线程会从中继日志读取binlog,然后执行binlog日志中的内容,也就是在自己本地再次执行一遍SQL,这样就可以保证自己跟主库的数据是一样的。
延时
这里有一个非常重要的一点,就是从库同步主库数据的过程是串行化的,也就是说主库上并行的操作(不同数据库所以可以并行??),在从库上会串行执行,在高并发场景下,从库的数据一定会比主库慢一些,是有延时的。针对时延怎么办? 可以开启并行复制,指的是从库开启多个线程,并行读取relay log中不同库的日志,然后并行执行不同库的日志,这是库级别的并行。但是有时候单库中来不及更新,所以一般代码中可以适当休眠几十毫秒,再来访问。
主机宕机导致数据丢失
如果主机突然宕机,然后恰好数据还没同步到从库,那么有些数据可能还在从库上是没有的,有些数据可能就丢失了 可以开启半同步复制,就是主库写入binlog日志之后,就会强制将数据同步到从库,从库将日志写入自己本地的relay log之后,接着会返回一个ack给主库,主库接收到至少一个从库的ack之后才会认为写操作完成了。
