標籤: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主從複製的實現細節