原理: MySQL主從複製涉及到三個線程,一個運行在主節點(log dump thread),其餘兩個(I/O thread, SQL thread)運行在從節點,如下圖所示: l 主節點 binary log dump 線程 當從節點連接主節點時,主節點會創建一個log dump 線程,用於發送b ...
原理:
MySQL主從複製涉及到三個線程,一個運行在主節點(log dump thread),其餘兩個(I/O thread, SQL thread)運行在從節點,如下圖所示:
l 主節點 binary log dump 線程
當從節點連接主節點時,主節點會創建一個log dump 線程,用於發送bin-log的內容。在讀取bin-log中的操作時,此線程會對主節點上的bin-log加鎖,當讀取完成,甚至在發動給從節點之前,鎖會被釋放。
l 從節點I/O線程
當從節點上執行`start slave`命令之後,從節點會創建一個I/O線程用來連接主節點,請求主庫中更新的bin-log。I/O線程接收到主節點binlog dump 進程發來的更新之後,保存在本地relay-log中。
l 從節點SQL線程
SQL線程負責讀取relay log中的內容,解析成具體的操作並執行,最終保證主從數據的一致性。
對於每一個主從連接,都需要三個進程來完成。當主節點有多個從節點時,主節點會為每一個當前連接的從節點建一個binary log dump 進程,而每個從節點都有自己的I/O進程,SQL進程。從節點用兩個線程將從主庫拉取更新和執行分成獨立的任務,這樣在執行同步數據任務的時候,不會降低讀操作的性能。比如,如果從節點沒有運行,此時I/O進程可以很快從主節點獲取更新,儘管SQL進程還沒有執行。如果在SQL進程執行之前從節點服務停止,至少I/O進程已經從主節點拉取到了最新的變更並且保存在本地relay日誌中,當服務再次起來之後,就可以完成數據的同步。
開始之前先交代下開發環境:
window10 家庭版系統
docker 執行 mysql:5.6
映射到本地的 3307和3306兩個埠,其中 3307是master 資料庫伺服器、3306是slave 資料庫伺服器
資料庫主伺服器操作:
1.1創建用戶並授權
// 創建用戶 create user "slave_admin"@"%" identified by "123456"; // 用戶授權 grant replication slave on *.* to "slave_admin"@"192.168.99.100";
// 刷新許可權
flush privileges;
1.2修改配置文件(/etc/mysql/mysql.conf.d)
[mysqld] log-bin=mysql-bin server-id=3307
1.3重啟資料庫查看主資料庫的當前狀態
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+
從資料庫伺服器操作:
2.1修改配置文件(/etc/mysql/mysql.conf.d)並重啟mysql
server-id=3306
2.2設置從伺服器的信息並啟動
mysql> change master to -> master_host = "192.168.99.100:3307", -> master_port = 3307, -> master_user = "slave_admin", -> master_password = "123456", -> master_log_file = "mysql-bin.000001", -> master_log_pos = 120; Query OK, 0 rows affected, 2 warnings (0.06 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec)
2.3查看是否配置成功
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Connecting to master Master_Host: 192.168.99.100:3307 Master_User: slave_admin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 120 Relay_Log_File: mysqld-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes //主要查看這兩個指標狀態 Slave_SQL_Running: Yes //主要查看這兩個指標狀態
到這裡主從配置就配置完了!
可能遇到的問題:
在2.3那一步的時候不一定就能夠正好 “Slave_IO_Running” 和 “Slave_SQL_Running” 的值都是 YES 這個時候可以這麼檢查下
第一種 當 “Slave_IO_Running” 的值為 Connecting 時是因為slave資料庫伺服器去訪問 master資料庫伺服器的 bin-log 時失敗導致的,這時候應該檢查 2.2中設置的參數是不是正確,如果參數無誤的話就要檢測下在 slave伺服器連接 master資料庫是否能夠成功;
第二種 當 “Slave_SQL_Running” 的值為 No 時可以執行如下命令
mysql> stop slave ; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave ;
或者重新執行2.2這一步!其他的問題我配置的過程中就沒有碰到啦~~~
——部分參考網路文件,如有侵權請聯繫