命令记不住

登陆

主从 GTID 复制

主从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: 120

2.假设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/mysql 

3.启动数据库

/etc/init.d/mysqld start

4.构建主从

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:1

5.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就行。

推荐阅读