GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: KAiTO 文章來源:GreatSQL社區原創 什麼是中繼日誌(relay log) 中繼日誌(relay log)只在主從伺服器架構的從伺服器 ...
- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
- 作者: KAiTO
- 文章來源:GreatSQL社區原創
什麼是中繼日誌(relay log)
中繼日誌(relay log)
只在主從伺服器架構的從伺服器上存在。從伺服器(slave)
為了與主伺服器(Master)
保持一致,要從主伺服器讀取二進位日誌的內容,並且把讀取到的信息寫入本地的日誌文件中,這個從伺服器本地的日誌文件就叫中繼日誌。然後,從伺服器讀取中繼日誌,並根據中繼日誌的內容對從伺服器的數據進行更新,完成主從伺服器的數據同步。
搭建好主從伺服器之後,中繼日誌預設會保存在從伺服器的數據目錄下。
文件名的格式是:從伺服器名 - relay-bin.序號
。中繼日誌還有一個索引文件:從伺服器名 - relay-bin.index
,用來定位當前正在使用的中繼日誌。
(主從複製原理圖)
從伺服器I/O線程將主伺服器的二進位日誌(binlog)讀取過來記錄到從伺服器本地文件,然後從伺服器SQL線程會讀取中繼日誌的內容並應用到從伺服器,從而使從伺服器和主伺服器的數據保持一致。
中繼日誌的作用
中繼日誌用於主從伺服器架構中,從伺服器用來存放主伺服器二進位日誌內容的一個中間文件。從伺服器通過讀取中繼日誌的內容,來同步主伺服器上的操作。
中繼日誌是連接mastert(主伺服器)和slave(從伺服器)的信息,它是複製的核心,I/O線程將來自master的binlog存儲到中繼日誌中,中繼日誌充當緩衝,這樣master不必等待slave執行完成就可以發送下一個binlog。
查看中繼日誌
中繼日誌文件的格式與二進位日誌文件相同,並且可以 使用 mysqlbinlog 進行讀取
SET TIMESTAMP= 1615352328 /*!*/;
BEGIN
/*!*/;
# at 900
#211413 11:33:46 server id 1 end_log_pos 832 CRC32 0xcc16d651 Table_map:
`kaito`.`test` mapped to number 91
# at 950
#211413 11:33:46 server id 1 end_log_pos 872 CRC32 0x07e4047c Delete_rows: table id
91 flags: STMT_END_F -- server id 1 是主伺服器,意思是主伺服器刪了一行數據
BINLOG '
CD95YBMBAAAAMgAAAEADAAAAAFsAAAAAAAEABGRlbW8ABHRlc3QAAQMAAQEBAFHWFsw=
CD95YCABAAAAKAAAAGgDAAAAAFsAAAAAAAEAAgAB/wABAAAAfATkBw==
'/*!*/;
# at 1000
這一段的意思是,主伺服器(“server id 1”)對錶 kaito.test 進行了 2 步操作:
- 定位到表 kaito.test 編號是 91 的記錄,日誌位置是 832
- 刪除編號是 91 的記錄,日誌位置是 872
相關參數解析
通過語句:show variables like '%relay%'
查看先骨幹的relay的所有相關參數如下:
mysql> show variables like '%relay%';
+---------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------+---------------------------------------+
| max_relay_log_size | 0 |
| relay_log | kaito-relay-bin |
| relay_log_basename | /var/lib/mysql/kaito-relay-bin |
| relay_log_index | /var/lib/mysql/kaito-relay-bin.index |
| relay_log_info_file | relay-log.info |
| relay_log_info_repository | TABLE |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| sync_relay_log | 10000 |
| sync_relay_log_info | 10000 |
+---------------------------+---------------------------------------+
11 rows in set (0.00 sec)
-
max_relay_log_size:
標記relay log 允許的最大值,如果該值為0,則預設值為max_binlog_size(1G);如果不為0,則max_relay_log_size則為最大的relay_log文件大小; -
relay_log:
定義relay_log的位置和名稱,如果值為空,則預設位置在數據文件的目錄(datadir),文件名預設為host_name-relay-bin.nnnnnn -
relay_log_index:
同relay_log,定義relay_log的位置和名稱;一般和relay-log在同一目錄 -
relay_log_info_file:
設置relay-log.info的位置和名稱(relay-log.info記錄MASTER的binary_log的恢複位置和relay_log的位置) -
relay_log_purge:
是否自動清空不再需要中繼日誌時。預設值為1(啟用)。 -
relay_log_recovery:
當slave從庫宕機後,假如relay-log損壞了,導致一部分中繼日誌沒有處理,則自動放棄所有未執行的relay-log,並且重新從master上獲取日誌,這樣就保證了relay-log的完整性。預設情況下該功能是關閉的,將relay_log_recovery
的值設置為 1時,可在slave從庫上開啟該功能,建議開啟。 -
relay_log_space_limit:
防止中繼日誌寫滿磁碟,這裡設置中繼日誌最大限額。 -
- 註意!但此設置存在主庫崩潰,從庫中繼日誌不全的情況,不到萬不得已,不推薦使用!
-
sync_relay_log:
這個參數和sync_binlog
是一樣的,當設置為1時,slave的I/O線程每次接收到master發送過來的binlog日誌都要寫入系統緩衝區,然後刷入relay log中繼日誌里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁碟的大量I/O
當設置為0時,並不是馬上就刷入中繼日誌里,而是由操作系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁碟I/O操作。這個值預設是0,可動態修改,建議採用預設值。 -
sync_relay_log_info:
這個參數和sync_relay_log
參數一樣,當設置為1時,slave的I/O線程每次接收到master發送過來的binlog日誌都要寫入系統緩衝區,然後刷入relay-log.info里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁碟的大量I/O。當設置為0時,並不是馬上就刷入relay-log.info里,而是由操作系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁碟I/O操作。這個值預設是0,可動態修改,建議採用預設值。
以上只是簡單的介紹了每個參數的作用,這些參數具體的設置還是需要根據每個用戶的實際系統情況進行設置的;
參考文章
- 《MySQL是怎樣運行的--從根兒上理解MySQL》—小孩子4919(https://juejin.cn/book/6844733769996304392)
Enjoy GreatSQL