@MySQL複製(replication)原理
1)主服務器(master)把數據更改記錄到二進制日誌(binlog)中。
2)從服務器(slave)把主服務器的二進制日誌複製到自己的中繼日誌(relay log)中。
3)從服務器重做中繼日誌中的日誌,把更改應用到自己的數據庫上,以達到數據的最終一致性。
注意:複製不是完全實時地進行同步,而是異步實時。
@從服務器有2個線程
I/O線程,負責讀取主服務器的二進制日誌,並將其保存爲中繼日誌;
SQL線程,複製執行中繼日誌。
@SHOW FULL PROCESSLIST
(1)查看從服務器狀態,可以看到類似如下內容:
mysql>SHOW FULL PROCESSLIST\G;
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 6501
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 0
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 206
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
3 rows in set (0.00 sec)
說明:ID爲1的線程是I/O線程,目前的狀態是等待主服務器發送二進制日誌。ID爲2的線程是SQL線程,負責讀取中繼日誌並執行。目前的狀態是已讀取所有的中繼日誌,等待中繼日誌被I/O線程更新。
(2)查看主服務器狀態,可以看到類似如下內容:
mysql>SHOW FULL PROCESSLIST\G;
……
*************************** 65. row ***************************
Id: 26541
User: rep
Host: 192.168.190.98:39549
db: NULL
Command: Binlog Dump
Time: 6857
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
……
說明:可以看到一個線程負責發送二進制日誌。
@SHOW SLAVE STATUS和SHOW MASTER STATUS
(1)SHOW SLAVE STATUS命令可以觀察當前複製的運行狀態:
mysql>SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.190.10
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 555176471
Relay_Log_File: gamedb-relay-bin.000048
Relay_Log_Pos: 224355889
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%,DBA.%
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 555176471
Relay_Log_Space: 224356045
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
一些主要參數說明如下,
Slave_IO_State: Waiting for master to send event | 顯示當前IO線程的狀態,如等待主服務器發送二進制日誌 |
Master_Log_File: mysql-bin.000007 | 顯示當前同步的主服務器的二進制日誌 |
Read_Master_Log_Pos: 555176471 | 顯示當前同步的主服務器的二進制日誌的偏移量位置,單位是字節。如當前已同步mysql-bin.000007這個日誌文件的529MB (555176471M)內容 |
Relay_Master_Log_File: mysql-bin.000007 | 當前中繼日誌同步的二進制日誌 |
Relay_Log_File: gamedb-relay-bin.000048 | 顯示當前寫入的中繼日誌 |
Relay_Log_Pos: 224355889 | 顯示當前執行到中繼日誌的偏移位置 |
Slave_IO_Running: Yes | 從服務器中IO線程的運行狀態,YES表示運行正常 |
Slave_SQL_Running: Yes | 從服務器中SQL線程的運行狀態,YES表示運行正常 |
Exec_Master_Log_Pos: 555176471 | 表示同步到主服務器的二進制日誌偏移量的位置。(Read_Master_Log_Pos-Exec_Master_Log_Pos)可以表示當前SQL線程運行的延時,單位是字節。該例主從服務器完全同步 |
(2)SHOW MASTER STATUS命令可以用來查看主服務器中二進制日誌的狀態:
mysql>SHOW MASTER STATUS\G;
*************************** 1. row ***************************
File: mysql-bin.000007
Position: 606181078
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)
當前二進制日誌記錄了偏移量606181078的位置,該值減去這一時間點時從服務器上的Read_Master_Log_Pos,就可以得知I/O線程的延時。
參考資料:《MySQL技術內幕:InnoDB存儲引擎(第2版)》 姜承堯,章節8.7 複製