MySQL復制有兩種方法:
-
傳統方式:
基於主庫的bin-log將日志事件
和事件位置復制到從庫,從庫再加以 應用來達到主從同步的目的。 -
Gtid方式:global transaction identifiers是
基於事務來復制數據
,因此也就不依賴日志文件位置,同時又能更好的保證主從庫數據一致性。
GTID的工作原理:
master更新數據時,會在事務前產生GTID,一同記錄到binlog日志中。
slave端的i/o 線程將變更的binlog,寫入到本地的relay log中。
sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有記錄。
如果有記錄,說明該GTID的事務已經執行,slave會忽略。
如果沒有記錄,slave就會從relay log中執行該GTID的事務,並記錄到binlog。
在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。
1、環境介紹:
一主兩從
master: 192.168.1.128
slave-01:192.168.1.130
slave-02:192.168.1.131
- master 配置文件:/etc/my.cnf
[mysqld] user=mysql basedir=/usr/local/mysql/ datadir=/usr/local/mysql/data/ port=3306 socket=/tmp/mysql.sock log-error=/var/log/mysql/error.log #GTID: server_id=130 #服務器id gtid_mode=on #開啟gtid模式 enforce_gtid_consistency=on #強制gtid一致性 log-slave-updates=1 #binlog log_bin=/data/binlog/mysql-bin binlog_format=row #binlog格式 #relay log skip_slave_start=1 max_connect_errors=1000 default_authentication_plugin = 'mysql_native_password' #slow log slow_query_log=1 slow_query_log_file=/usr/local/mysql/data/node02-slow.log long_query_time=0.1 log_queries_not_using_indexes=1
- slave-01配置文件 /etc/my.cnf
[mysqld] user=mysql basedir=/usr/local/mysql/ datadir=/usr/local/mysql/data/ port=3306 socket=/tmp/mysql.sock log-error=/var/log/mysql/error.log #GTID: server_id=130 gtid_mode=on enforce_gtid_consistency=on log-slave-updates=1 #binlog log_bin=/data/binlog/mysql-bin binlog_format=row #relay log skip_slave_start=1 max_connect_errors=1000 default_authentication_plugin = 'mysql_native_password' #slow log slow_query_log=1 slow_query_log_file=/usr/local/mysql/data/node02-slow.log long_query_time=0.1 log_queries_not_using_indexes=1
- slave-02配置文件 /etc/my.cnf
[mysqld] basedir=/usr/local/mysql/ datadir=/usr/local/mysql/data/ port = 3306 socket = /tmp/mysql.sock log-error=/var/log/mysql/error.log #GTID: server_id=131 gtid_mode=on enforce_gtid_consistency=on log-slave-updates=1 #binlog log_bin=/data/binlog/mysql-bin binlog_format=row #relay log skip_slave_start=1 max_connect_errors=1000 default_authentication_plugin = 'mysql_native_password' #slow log slow_query_log=1 slow_query_log_file=/usr/local/mysql/data/master-slow.log long_query_time=0.1 log_queries_not_using_indexes=1
2、搭建GTID主從復制
- master 創建主從復制用戶
create user 'repl'@'%' identified by 'abc123'; grant replication slave,replication client on *.* to 'repl'@'%'; flush privileges;
- slave節點測試repl用戶遠程連接
mysql -urepl -pabc123 -h192.168.1.128
- slave節點執行,兩個slave節點都要執行
change master to master_host='192.168.1.128', master_user='repl', master_password='abc123', master_port=3306,master_auto_position = 1;
start slave; -
查看slave主從復制狀態
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.128 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000008 Read_Master_Log_Pos: 196 Relay_Log_File: node-02-relay-bin.000007 Relay_Log_Pos: 411 Relay_Master_Log_File: mysql-bin.000008 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: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 196 Relay_Log_Space: 877 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: Replicate_Ignore_Server_Ids: Master_Server_Id: 128 Master_UUID: a3c9f756-ddce-11ea-ba7e-000c293a54d5 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: a3c9f756-ddce-11ea-ba7e-000c293a54d5:2-14 Executed_Gtid_Set: a3c9f756-ddce-11ea-ba7e-000c293a54d5:1-14 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set (0.01 sec)
至此,Gtid主從復制完成!