Mysql主從復制的實現細節
MySQL復制功能使用三個線程實現,一個在主服務器上,另一個在從服務器上:
Binlog(二進制日誌)轉儲線程。主站創建一個線程,在從站連接時將二進制日誌內容發送給從站。該線程可以在主服務器上的SHOW PROCESSLIST輸出中標識為Binlog轉儲線程。
二進制日誌轉儲線程在主服務器的二進制日誌上獲取一個鎖,用於讀取要發送給從服務器的每個事件。一旦事件被讀取,即使在事件被發送到從設備之前,鎖也被釋放。
從屬I / O線程。當從服務器上發出START SLAVE語句時,從服務器創建一個I / O線程,該線程連接到主服務器並要求它發送記錄在其二進制日誌中的更新。
從I / O線程讀取主服務器的Binlog轉儲線程發送的更新(請參閱上一項),並將它們復制到包含從服務器中繼日誌的本地文件中。
此線程的狀態在SHOW SLAVE STATUS的輸出中顯示為Slave_IO_running,或在SHOW STATUS的輸出中顯示為Slave_running。
從屬SQL線程。從站創建一個SQL線程來讀取由從站I / O線程寫入的中繼日誌並執行其中包含的事件。
在前面的描述中,每個主/從連接有三個線程。擁有多個從站的主站為每個當前連接的從站創建一個二進制日誌轉儲線程,並且每個從站都有自己的I / O和SQL線程。
從機使用兩個線程將讀取更新與主機分離,並將其執行為獨立任務。因此,如果語句執行速度較慢,則閱讀語句的任務不會減慢。例如,如果從服務器沒有運行一段時間,它的I / O線程可以在從服務器啟動時快速地從主服務器獲取所有二進制日誌內容,即使SQL線程遠遠落後。如果從站在SQL線程執行完所有提取的語句之前停止,那麽I / O線程至少會提取所有內容,以便將語句的安全副本本地存儲在從站的中繼日誌中,以備下次執行奴隸開始。
SHOW PROCESSLIST語句提供了一些信息,告訴你在主服務器和從服務器上發生的復制事件
以下示例說明了SHOW PROCESSLIST的輸出中三個線程是如何顯示的。
在主服務器上,SHOW PROCESSLIST的輸出如下所示:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2 #Binlog轉儲復制線程ID
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to #狀態信息表明所有未完成的更新已發送到從站,並且主站正在等待更多更新發生
be updated
Info: NULL
這裏,線程2是一個Binlog轉儲復制線程,它為連接的從服務器提供服務。 狀態信息表明所有未完成的更新已發送到從站,並且主站正在等待更多更新發生。 如果在主服務器上看不到Binlog Dump線程,則表示復制未運行; 也就是說,目前沒有奴隸連接。
#——————————————————————————————————————————————————————————————————————————————————————————————————————
在從屬服務器上,SHOW PROCESSLIST的輸出如下所示:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10 #線程10是與主服務器通信的I/O線程
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11 #線程11是處理存儲在中繼日誌中的更新的SQL線程
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
狀態信息指示線程10是與主服務器通信的I / O線程,線程11是處理存儲在中繼日誌中的更新的SQL線程。 當SHOW PROCESSLIST運行時,兩個線程都處於空閑狀態,等待進一步更新。
Mysql主從復制的實現細節