
主从GTID复制
1.GTID引入
1.Classic Replication存在的弊端
Failover(故障转移)问题
- 1、监控问题? 主机、mysql实例
- 2、处理里的问题,需要人为
- 3、数据补偿---->GTID
1.故障场景
:DB01主宕机后,要选择一个新的主库(New Master),原则更加接近主库数据状态的从库
1.选择方法:在每个从库重运行:show slave status\G Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 1202.假设s1从库被选为新主库,需要进行数据补偿。
2.数据补偿的两种场:
1.如果能通过ssh连接上主库,
- (1)立即保存缺失部分的二进制日志
- (2)s2做同样的操作即可
2.如果不能ssh到主库
- (1)计算s2和s1之间的relay-log的差异日志(在传统的复制环境中,可能需要比较复杂的对比过程)
所以我们可以考虑使用GTID方式构建主从,主库发生的所有事务都会打上一个唯一的标标签,而且是全局
唯一的。基于GTID全局唯一的特性,很容易判断s1和s2 relay-log数据差异。- (2)S2 获取差异部分的relay-log日志,恢复到当前库,两个从库之间的数据就一致了。
9、s2重新指向(change master to 到s1)s1
2.GTID介绍
GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号。它的官方定义如下:
GTID = source_id :transaction_id 7E11FA47-31CA-19E1-9E56-C43AA21293967:29什么是sever_uuid,和Server-id 区别
核心特性: 全局唯一,具备幂等性
专门备份恢复时需要加的以下参数:
mysqlbinlog --skip-gtids --include-gtids=1-10 --exclude-gtids=6 mysqldump --set-purged-gtid=off如果mysqldump备份是用来构建主从的话
mysqldump 不要加 --set-purged-gtid=off
3.GTID核心参数
1.重要参数:
gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1 gtid-mode=on --启用gtid类型,否则就是普通的复制架构 enforce-gtid-consistency=true --强制GTID的一致性 log-slave-updates=1 --slave更新是否记入日志
4.GTID复制配置过程
1.清理环境
\rm -rf /application/mysql/data/* \rm -rf /data/mysql/*2.4.2 准备配置文件
my.cnf加入以下配置信息
[mysqld] basedir=/app/mysql datadir=/data/mysql socket=/tmp/mysql.sock server_id=51 port=3306 log_error=/data/mysql/mysql.err secure-file-priv=/tmp autocommit=0 log_bin=/data/binlog/mysql-bin binlog_format=row gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1 slow_query_log=1 slow_query_log_file=/data/mysql/slow.log long_query_time=0.1 log_queries_not_using_indexes [mysql] prompt=db01 [\\d]> slave1(db02): [mysqld] basedir=/app/mysql datadir=/data/mysql socket=/tmp/mysql.sock server_id=52 port=3306 log_error=/data/mysql/mysql.err secure-file-priv=/tmp autocommit=0 log_bin=/data/binlog/mysql-bin binlog_format=row gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1 slow_query_log=1 slow_query_log_file=/data/mysql/slow.log long_query_time=0.1 log_queries_not_using_indexes [mysql] prompt=db02 [\\d]> slave2(db03): [mysqld] basedir=/app/mysql datadir=/data/mysql socket=/tmp/mysql.sock server_id=53 port=3306 log_error=/data/mysql/mysql.err secure-file-priv=/tmp autocommit=0 log_bin=/data/binlog/mysql-bin binlog_format=row gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1 slow_query_log=1 slow_query_log_file=/data/mysql/slow.log long_query_time=0.1 log_queries_not_using_indexes [mysql] prompt=db03 [\\d]>2.初始化数据
mysqld --initialize-insecure --user=mysql --basedir=/app/mysql --datadir=/data/mysql3.启动数据库
/etc/init.d/mysqld start4.构建主从
master:51 slave:52,53主:master-51:
grant replication slave on . to repl@'10.0.0.%' identified by '123';
从:slave-52\53:db02 [(none)]>CHANGE MASTER TO -> MASTER_HOST='10.10.40.51', -> MASTER_USER='repl', -> MASTER_PASSWORD='123', -> MASTER_AUTO_POSITION=1; start slave;5.GTID从库误写入操作处理
5.1查看监控信息:
db02 [(none)]>show slave status \G; Last_SQL_Error: Error 'Can't create database 'oldboy'; database exists' on query. Default database: 'oldboy'. Query: 'create database oldboy' Retrieved_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-3 Executed_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-2, 7ca4a2b7-4aae-11e9-859d-000c298720f6:15.2注入空事物的方法:
stop slave; set gtid_next='71bfa52e-4aae-11e9-ab8c-000c293b577e:3'; begin;commit; set gtid_next='AUTOMATIC';这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID。
5.3最好的解决方案:重新构建主从环境
6.GTID 复制和普通复制的区别
6.1 普通复制
CHANGE MASTER TO MASTER_HOST='10.10.40.51', MASTER_USER='repl', MASTER_PASSWORD='123', MASTER_PORT=3307, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=444, MASTER_CONNECT_RETRY=10;6.2 GTID 复制
change master to master_host='10.0.0.51', master_user='repl', master_password='123' , MASTER_AUTO_POSITION=1; start slave;
- (0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
- (1)额外功能参数(3个)
- (2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;
- (3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
- (4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式:
SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。