mysql主從同步過程:
mysql的主從復制主要有三個線程:master:二進制日志轉儲線程(binlog dump thread)、slave:I/O線程(I/O thread)和SQL線程(SQL thread).master一條線程和slave中的兩條線程。
- 主節點binlog,主從復制的基礎是主庫將數據庫的所有變更記錄到binlog,實際上主從同步的原理就是基於binlog進行數據同步的。
- 主節點二進制日志轉儲線程(log dump),當binlog有變動時,log dump線程讀取其內容並發送給從節點
- 從節點I/O線程,接受binlog內容(這里是數據更新的部分),並將其拷貝到本地形成中繼日志(Relay log)
- 從節點SQL線程讀取relay log 文件內容對數據更新進行重放,最終保證主從數據庫一致性。
注:主節點使用binlog文件 + position偏移量來定義主從同步的位置,從節點會保存其已接受到的偏移量,如果從節點發生宕機重啟,則會自動從position的位置發起同步
由於mysql默認的復制方式是異步的,主庫把日志發送給從庫后不關心從庫是否已經處理,這樣會產生一個問題就是假設主庫掛了,從庫處理失敗,這時候從庫升級為主庫后,日志就丟失了。
全同步復制:主庫寫入binlog后強制同步日志到從庫,所有的從庫執行完成之后長才返回給客戶端,但是這樣性能就會收到嚴重影響。
半同步復制:和全同步復制不同的是,半同步復制是從庫寫入日志成功返回ACK確認給主庫,主庫收到至少一個從庫的確認就認為寫操作完成。