赞
踩
GTID出现之前,在一主多从的复制拓扑中,如果主库宕机,需要从多个从库选择之一作为新主库,这个过程比较复杂。没有一种直接了当的方法找到其它从库对应的新主库二进制日志坐标。通常的做法是先要寻找每个从库复制原主库的最后语句,然后找到新主库中包含该语句的二进制日志文件,其中该语句后的第一个事件位置即为连接新主库的二进制坐标。主要难点在于不存在一个唯一标识指出“复制原主库的最后语句”,于是后来的MySQL中就出现了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用冒号分隔的一对坐标表示,例如:8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23
前一部分是主库的server_uuid,后面一部分是主库上按提交事务的顺序确定的序列号,提交的事务序号从1开始。上面显式的GTID表示:具有8eed0f5b-6f9b-11e9-94a9-005056a57a4e的服务器上提交的第23个事务具有此GTID。
[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>
[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>
[root@master ~]# service mysqld restart
Shutting down MySQL............ SUCCESS!
Starting MySQL. SUCCESS!
[root@slave ~]# service mysqld restart
Shutting down MySQL............ SUCCESS!
Starting MySQL. SUCCESS!
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.%–从服务器所在的网段
root@(none) 03:17 mysql>reset master;
#首先暂停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)
主服务器
从服务器
从服务器上查看show slave status;
主服务器上,建库建表插入数据
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;
主服务器上查看二进制日志
发现了uuid+GTID的格式
主服务查看master状态
从服务器查看slave状态
对比连个gtid值是否一致,若为一致,就成功了!
到此,GTID半同步主从复制就成功搭建完成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。