MySQL的主从复制中主要有三个线程:
master
(
binlog dump thread
)、
slave
(
I/O thread
、
SQL thread
) ,Master⼀条线程和Slave中的两条线程。
MySQL主从同步的过程:
-
主节点 binlog,主从复制的基础是
主库记录数据库的所有变更记录到 binlog
。binlog 是数据库服务器启动的那⼀刻起,保存所有修改数据库结构或内容的⼀个⽂件。
-
主节点 log dump 线程,当 binlog 有变动时,log dump 线程读取其内容并发送给从节点。
-
从节点 I/O线程接收 binlog 内容,并将其写⼊到 relay log ⽂件中。
-
从节点的SQL 线程读取 relay log ⽂件内容对数据更新进⾏重放,最终保证主从数据库的
⼀致性。
注:主从节点使⽤
binglog
⽂件 +
position
偏移量来定位主从同步的位置,从节点会保存其已接收到的偏移量,如果从节点发⽣宕机重启,则会⾃动从 position 的位置发起同步。
由于mysql默认的复制⽅式是异步的,主库把⽇志发送给从库后不关⼼从库是否已经处理,这样会产⽣⼀个问题就是假设主库挂了,从库处理失败了,这时候从库升为主库后,⽇志就丢失了。由此产⽣两个概念。
全同步复制:
主库写⼊
binlog
后
强制同步⽇志到从库
,所有的从库都执⾏完成后才返回给客户端,但是很显然这个⽅式的话性能会受到严重影响。
半同步复制:
和全同步不同的是,半同步复制的逻辑是这样,
从库写⼊⽇志
成功后返回ACK确认给主库,主库收到⾄少⼀个从库的确认就认为写操作完成。