MySQL主從一致原理
MySQL主從同步過程
一般MySQL的備庫會設置成read-only,以避免發生數據不一致等情況,注意這個read-only對於超級用戶無效(binlog可以正常執行),事務日誌同步的過程如下:
- 在備庫B上通過
change master
命令,設置主庫A的IP、端口、用戶名、密碼,以及要從哪個位置開始請求binlog,這個位置包含文件名和日誌偏移量。 - 在備庫B上執行
start slave
命令,這時候備庫會啓動兩個線程,分別爲io_thread和sql_thread。其中io_thread負責與主庫建立連接。 - 主庫A校驗完用戶名、密碼後,開始按照備庫B傳過來的位置,從本地讀取binlog,發給B。
- 備庫B拿到binlog後,寫到本地文件,稱爲中轉日誌(relay log)。
- sql_thread讀取中轉日誌,解析出日誌裏的命令,並執行。
binlog日誌格式
一共有三種格式
Statement:
這種格式直接記錄操作語句,如果使用limit時,可能會發生在主庫和從庫上選擇不同索引而造成的查詢結果不一致的問題
Row:
記錄具體操作的rowID,不會出現主從不一致的問題。對於插入會記錄具體插入內容和插入的行,對於刪除也會記錄全部刪除內容,所以可以用於恢復數據,但是佔用空間較大。
Mixed:
這種格式是上面兩種進行混合,由MySQL去判斷是不是會發生主從不一致,進而選擇合適的binlog格式
在生產中,大部分會使用雙master,這時要小心binlog的循環複製問題,可以通過日誌中記錄的server id來解決。
參考文獻
MySQL實戰45講