GTID的主从复制
背景
GTID出现之前,在一主多从的复制拓扑中,如果主库宕机,需要从多个从库选择之一作为新主库,这个过程比较复杂。没有一种直接了当的方法找到其它从库对应的新主库二进制日志坐标。通常的做法是先要寻找每个从库复制原主库的最后语句,然后找到新主库中包含该语句的二进制日志文件,其中该语句后的第一个事件位置即为连接新主库的二进制坐标。主要难点在于不存在一个唯一标识指出“复制原主库的最后语句”,于是后来的MySQL中就出现了GTID的概念。
什么是GTID的主从复制?
全局事务标识符GTID的全称为Global Transaction Identifier,是在整个复制环境中对一个事务的唯一标识。它是MySQL 5.6加入的一个强大特性,目的在于能够实现主从自动定位和切换,而不像以前需要指定文件和位置。使用GTID复制时,主库上提交事务时创建事务对应的GTID,从库在应用中继日志时用GTID识别和跟踪每个事务。在启动新从库或因故障转移到新主库时可以使用GTID来标识复制的位置,极大地简化了这些任务。由于GTID的复制完全基于事务,因此只要在主库上提交的所有事务也在从库上提交,两者之间的一致性就得到保证。GTID支持基于语句或基于行的复制格式,但为了获得最佳效果,MySQL建议使用基于行的格式。GTID始终保留在主库和从库上,这意味着可以通过检查其二进制日志来确定应用于任何从库的任何事务的来源。而且,一旦在给定库上提交了具有给定GTID的事务,则该库将忽略具有相同GTID的任何后续事务。因此,在主库上提交的事务只会在从库上应用一次,这也有助于保证一致性。
新的主从切换时,新的从服务器知道哪些事务已经做了,哪些没有做
每产生一个事务,就给事务编一个号
优点:替代传统的binlog+pos复制;使用master_auto_position=1自动匹配GTID断点进行复制
GTID格式
GTID与主库上提交的每个事务相关联。此标识符不仅对发起事务的库是唯一的,而且在给定复制拓扑中的所有库中都是唯一的。GTID用冒号分隔的一对坐标表示,例如:8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23 前一部分是主库的server_uuid,后面一部分是主库上按提交事务的顺序确定的序列号,提交的事务序号从1开始。上面显式的GTID表示:具有8eed0f5b-6f9b-11e9-94a9-005056a57a4e的服务器上提交的第23个事务具有此GTID。
工作原理
- master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
- slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
- sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
- 如果有记录,说明该GTID的事务已经执行,slave会忽略。
- 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
- 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描
搭建基于GTID的半同步主从复制
1.修改master的配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8mb4
#skip-grant-tables
#error log
log-error = chen.err
#general log
general_log
#slow query log
slow_query_log = 1
long_query_time = 0.001
#二进制日志 log bin
log_bin
server_id = 1
#日志超过3天自动过期
expire_logs_days = 15
#设置半同步超时时间
rpl_semi_sync_master_timeout=1000
#开启半同步主从复制,需要提前安装半同步插件
rpl_semi_sync_master_enabled=1
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
[mysql]
auto-rehash
prompt=\u@\d \R:\m mysql>
2.修改slave的配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
log_bin
server_id = 2
#开启从服务器半同步主从复制,需要提前安装半同步插件
rpl_semi_sync_slave_enabled=1
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
#开启从服务器将relay log内容也写入自己的二进制日志
log_slave_updates=ON
[mysql]
auto-rehash
prompt=\u@\d \R:\m mysql>
3.主和从服务器刷新mysqld服务
[root@master ~]# service mysqld restart
Shutting down MySQL............ SUCCESS!
Starting MySQL. SUCCESS!
[root@slave ~]# service mysqld restart
Shutting down MySQL............ SUCCESS!
Starting MySQL. SUCCESS!
4.master服务器新建授权用户,给slave来复制二进制日志
root@(none) 03:27 mysql>grant replication slave on *.* to 'chenlb'@'192.168.31.%' identified by 'Sanchuang1234#';
Query OK, 0 rows affected, 1 warning (0.02 sec)
192.168.31.%--从服务器所在的网段
5.主服务器刷新二进制日志
root@(none) 03:17 mysql>reset master;
6.从服务器修改master info信息,配置同步
#首先暂停slave
root@(none) 02:11 mysql>stop slave;
Query OK, 0 rows affected (0.01 sec)
root@(none) 02:11 mysql> change master to master_host='192.168.31.153', master_user='chenlb',master_password='Sanchuang1234#',master_port=3306,master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
7.查看是否开启半同步和GTID功能
半同步功能
主服务器
从服务器
GTID功能
从服务器上查看show slave status;
8.效果测试
数据同步测试
主服务器上,建库建表插入数据
root@tanxue 02:19 mysql>create database tanx;
Query OK, 1 row affected (1.01 sec)
root@tanxue 03:05 mysql>use tanx;
Database changed
root@tanx 03:05 mysql>create table t1(id int);
Query OK, 0 rows affected (0.01 sec)
root@tanx 03:05 mysql>insert into t1 values(1),(2)
-> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
root@tanx 03:05 mysql>show master status;
+-------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+------------------------------------------+
| master-bin.000003 | 1326 | | | f9a34f51-dc9e-11ed-ab5b-000c29751c59:1-6 |
+-------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
从服务器上查看,是否有库有表有数据
root@tanxue 03:06 mysql>show databases;
root@tanxue 03:06 mysql>use tanx;
root@tanx 03:06 mysql>show tables;
root@tanx 03:06 mysql>select * from t1;
查看二进制日志格式是否有gtid字段
主服务器上查看二进制日志
发现了uuid+GTID的格式
对比GTID值
主服务查看master状态
从服务器查看slave状态
对比连个gtid值是否一致,若为一致,就成功了!
到此,GTID半同步主从复制就成功搭建完成!
标签:主从复制,slave,log,MySQL,master,mysql,root,GTID From: https://blog.51cto.com/u_16070827/6239423