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主从复制完成!