CentOS7中MySQL主從同步實驗記錄–異步&半同步模式
1.環境介紹
確保倆虛擬機centos7時間是同步的;
一臺虛擬機是另一臺拷貝過來後、修改的固定IP;
主服務器IP:192.168.255.133
從服務器IP:192.168.255.134
2.主從同步——異步模式(默認方式)
-
背景及原理介紹:Mysql 主從複製
-
主服務器須啓用二進制日誌記錄並配置唯一的服務器ID,需要重啓服務端
vim /etc/my.cnf [mysqld] server-id=1 log-bin=mysql-bin service mysqld restart
注意:
- 省略server-id(或將其顯式設置爲默認值0),則主服務器拒絕來自從服務器的任何連接
- 主服務器創建用於複製數據的用戶
grant replication slave on *.* to 'back'@'192.168.255.134' identified by 'asdf';
show master status;
# 這裏看到File和Position需要在從庫連接時使用
exit
說明:
從服務器需使用MySQL主服務器上的用戶名和密碼連接到主站
例如,使用用戶back可以從主機(192.168.255.134)連接到master上進行復制操作(grant replication):
創建用戶back,密碼asdf(需要遵循mysql的密碼驗證插件級別要求)
- 主服務器數據庫有數據——須同步數據
主服務器用mysqldump 將待同步的庫test被分成sql,傳輸到從服務器/root/目錄
mysqldump -uroot -p test > /root/test.sql
ls /root/test.sql
scp /root/test.sql 192.168.255.134:/root # 密碼asdf
從庫使用sql同步數據庫test的數據
use test; # 從庫進mysql的庫test
source /root/test.sql # 用sql同步數據
- 從服務器數據庫配置
vim /etc/my.cnf
[mysqld]
server-id=2
log_bin=mysql-bin
replicate_do_table=test.user # 需要同步的表,test庫其他表不同步
binlog-ignore-db=mysql # 這個是忽略的不需要同步的庫,可以不設置
- 從服務器配置連接到主服務器的相關信息
配置master.info(CHANGE MASTER to…相當於配置密碼文件和Master的相關信息)
change master to master_host='192.168.255.133',master_user='back',master_password='asdf',master_port=3306,MASTER_LOG_FILE='mysql-bin.000014',MASTER_LOG_POS=748;
# 文件名字和log位置是主庫show master status看到的
start slave; # 開啓複製功能d
show slave status \G;
倆線程都保證運行中,這時候主從庫的test數據庫的user表就可以保持同步,測試下
6. 異步模式測試
主從test.user表:
修改主庫test.user表,從庫也會變化:
刷新從庫表:
7. 錯誤的情況
從庫先寫一條,主庫寫一條,這時候就不同步了:
錯誤原因裏面寫的很清楚:倆條記錄 PRIMARY key一樣,這時候Slave_SQL_Running: No,從庫的SQL線程就會關閉,需要人工介入處理了。
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.255.133
Master_User: back
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 3670
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 2723
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table: test.user
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Could not execute Write_rows event on table test.user; Duplicate entry '8' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 3100
Skip_Counter: 0
Exec_Master_Log_Pos: 2854
Relay_Log_Space: 3750
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1062
Last_SQL_Error: Could not execute Write_rows event on table test.user; Duplicate entry '8' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000006, end_log_pos 3100
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 4b5e1b3a-1af8-11ea-ac00-000c29b986f2
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 191210 14:22:39
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
3.主從同步——半同步模式
主從的配置在之前的基礎上添加開啓半同步插件的配置即可
- 主庫:
進入mysql設置以下兩句,當然重啓數據庫會消失,所以推薦下面修改配置文件的方法,記得重啓數據庫。
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
SET GLOBAL rpl_semi_sync_master_enabled = 1;
推薦這種,系要重啓mysqld服務:
vim /etc/my.cnf
[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
service mysqld restart
查看半同步插件是否有 rpl_semi_sync_master這一行即可
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
......
| validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
46 rows in set (0.00 sec)
查看主庫半同步是否運行,ON狀態即可
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.01 sec)
- 從庫:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
或推薦,系要重啓mysqld服務:
vim /etc/my.cnf
[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
service mysqld restart
查看是半同步模式否在運行
show status like ‘Rpl_semi_sync_slave_status’;
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.01 sec)
然後主庫檢查master狀態,從庫連接即可
主庫查看更新的二進制文件狀態:
從庫根據最新的二進制文件建立連接,開啓IO和SQL線程:
tail -100f /var/log/mysql.log
看下日誌
5.常見錯誤
- 如果發現從庫IO 線程:connecting,也就是未連接成功
去檢查三個問題,1.網絡及3306端口開啓 2.密碼輸入了沒 3.pos檢查下 - 如果從庫連接時候有uuid相同問題,說明你從服務器是主服務器拷貝過來的,記得幹掉這個auto.cnf,重啓從庫即可。
- 如果從庫操作錯誤,從庫IO線程:no關掉,我們檢查後,無需重新建立連接,重啓IO線程即可:
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;