MySQL主从复制之基于GTIDs的AB复制架构(在线热备)

  • 基于GTIDs的AB复制架构(M-S)
  • GTIDs概述
  • 基于GTIDs的主从复制
  • 第一步:修改配置文件支持GTIDs
  • 第二步:主从配置只读模式
  • 第三步:SLAVE重新配置change master to
  • 第四步:关闭主从服务器的只读模式
  • SLAVE从服务器不小心写入数据解决方案
  • 方法一:跳过事务
  • 方法二:重新同步data目录,重新change master to...


基于GTIDs的AB复制架构(M-S)

GTIDs概述

什么是GTIDs以及有什么特点?

  1. GTIDs(Global transaction identifiers)全局事务标识符,是mysql 5.6新加入的一项技术
  2. 当使用GTIDs时,每一个事务都可以被识别并且跟踪
  3. 添加新的slave或者当发生故障需要将master身份或者角色迁移到slave上时,都无需考虑是哪一个二进制日志以及哪个position值,极大简化了相关操作
  4. GTIDs是完全基于事务的,因此不支持MYISAM存储引擎
  5. GTID由source_id和transaction_id组成
    1)source_id来自于server_uuid,可以在auto.cnf中看到
    2)transation_id是一个序列数字,自动生成.

使用GTIDs的限制条件有哪些?

  1. 不支持非事务引擎(MyISAM),因为可能会导致多个gtid分配给同一个事务
  2. create table … select 语句不支持(主库语法报错)
  3. create/drop temporary table 语句不支持
  4. 必须使用enforce-gtid-consistency参数
  5. sql-slave-skip-counter不支持(传统的跳过错误方式)
  6. GTID复制环境中必须要求统一开启和GTID或者关闭GTID
  7. 在mysql 5.6.7之前,使用mysql_upgrade命令会出现问题

基于GTIDs的主从复制

在生产环境中,大多数情况下使用的MySQL5.6基本上都是从5.5或者更低的版本升级而来,这就意味着之前的mysql replication方案是基于传统的方式部署,并且已经在运行,因此,接下来我们就利用已有的环境升级至基于GITDs的Replication

〇 思路

  1. 修改配置文件支持GTIDs (主+从)
  2. 重启数据库 (主+从)
  3. 为了保证数据一致性,master和slave设置为只读模式 (主+从)
  4. 从服务器上重新配置同步 (从)

第一步:修改配置文件支持GTIDs

MySQL数据库在线热备(主从复制之AB复制)

修改配置前服务器需要关闭MySQL服务,前面操作基本和AB复制的操作一样,只是配置文件不一样,还有就是复制到slave 服务器的日志文件需要删除

说明:

  • 开启GITDs需要在master和slave上都配置gtid-mode,log-bin,log-slave-updates,enforce-gtid-consistency(该参数在5.6.9之前是–disable-gtid-unsafe-statement)
  • 其次,slave还需要增加skip-slave-start参数,目的是启动的时候,先不要把slave起来,需要做一些配置
  • 基于GTIDs复制,slave 服务器必须开启二进制日志!

修改master的配置文件:

  • 增加三行配置
# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
port=3306
log-error=/usr/local/mysql/data/master.err
log-bin=/usr/local/mysql/data/binlog
server-id=10
character_set_server=utf8mb4

gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency

修改slave的配置文件:

  • 增加四行配置
# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
port=3306
log-error=/usr/local/mysql/data/slave.err
relay-log=/usr/local/mysql/data/relaylog
server-id=100
character_set_server=utf8mb4

log-bin=/usr/local/mysql/data/binlog
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start

增加配置说明:
	log-bin:必须要开启二进制
	skip-slave-start:当MASTER主服务器GTIDs没有启动时,跳过SLAVE服务器的启动(即master启动slave才启动)

注意:
当你把master主服务器的数据目录同步到slave从服务器后需要删除数据目录下的日志文件,避免他的日志文件对我们产生影响

master 服务器操作:	
	# service mysql stop
	# rm -f /usr/local/mysql/data/auto.cnf
	# rsync -av /usr/local/mysql/data root@10.1.1.100:/usr/local/mysql/

slave 服务器操作:删除日志文件
	# rm -rf /usr/local/mysql/data/binlog.*

master 和 slave 重启服务:

# service mysql start

第二步:主从配置只读模式

在MASTER主服务器中创建一个账号,专门用于实现数据同步:

MySQL5.7及以下版本:
	# mysql> grant replication slave on *.* to 'slave'@'10.1.1.%' identified by '123';
	# mysql> flush privileges;


MySQL新版本中建议:
	# mysql> create user 'slave'@'10.1.1.%' identified by '123';
	# mysql> grant replication slave on *.* to 'slave'@'10.1.1.%';
	# mysql> flush privileges;


选项说明:
	replication slave:常用于建立复制时所需要用到的用户权限

开启主从配置只读模式

  • 与AB复制时master 锁表不一样,它只针对innodb引擎
  • 且针对的账号是非root管理员账号,管理员还是可以进行修改的
master 和 slave 都要配置:
	# mysql > set @@global.read_only=ON;

第三步:SLAVE重新配置change master to

  • 与传统AB复制相比,不需要指定为二进制的名称和位置
  • 只需要换成master_auto_position=1参数就行
如果前面配置了传统的AB复制需要先关闭重置一下slave:
	# mysql> stop slave;
	# mysql> reset slave;


如果是新设置的, 在SLAVE从服务器中,使用change master to指定主服务器,并实现数据同步:
	# mysql> change master to 
		master_host='10.1.1.10',
		master_user='slave',
		master_password='123',
		master_port=3306,
		master_auto_position=1;

	或
	# mysql> change master to master_host='10.1.1.10',master_user='slave',master_password='123',master_port=3306,master_auto_position=1;

	注意:
		1.确保有复制用户
		2.主要区别于传统复制的参数是:master_auto_position=1


开启基于GTIDs AB复制的slave:
	# mysql> start slave;
	#mysql> show slave status\G

第四步:关闭主从服务器的只读模式

  • master 和 slave 服务器关闭只读模式(master 先关闭)
# mysql> set @@global.read_only=OFF;
  • 测试
master服务器插入:
# mysql > create database aaa;
# mysql > use aaa;
# mysql > create table bbb (id int not null auto_increment,name varchar(30),primary key(id));
# mysql > insert into aaa values (null,'a'),(null,'b');


slave服务器查看:
# mysql> select*from aaa.bbb;

mysql frm idb 用途_配置文件

SLAVE从服务器不小心写入数据解决方案

slave插入数据造成冲突:

先往slave 插入数据:
	# mysql > use aaa;
	# mysql > insert into bbb values (null,'c');

master 插入数据:
	# mysql > use aaa;
	# mysql > insert into bbb values (null,'d');
  • slave 复制失败
方法一:跳过事务

第一步:slave 上查看最新的relay log 中继日志文件查找冲突引起的GTIDs 编号

slave 服务器操作:
	查看最新的relay log:
		# ll data/
		[root@slave mysql]# ll data/
			total 123120
			...
			-rw-r-----. 1 mysql mysql      200 Jun 17 19:56 relaylog.000001
			-rw-r-----. 1 mysql mysql     2020 Jun 17 20:56 relaylog.000002		=>	这就是最新的中继日志
			-rw-r-----. 1 mysql mysql       76 Jun 17 19:56 relaylog.index
			...


	查看relay log内容找到冲突编号:
		# mysqlbinlog data/relaylog.000002 | less
  • relaylog.000002 中继日志中引起冲突的标号

第二步:找到冲突编号进入MySQL ,关闭slave

slave 操作:
	#  mysql > stop slave

第四步:指定编号跳过冲突事务

  • 就是刚才找到的写入冲突编号
slave 操作:
	# mysql > SET @@SESSION.GTID_NEXT= '9e04777e-cf44-11eb-b8eb-000c29bbeafc:11'/*!*/;

第五步:创建一个新的事务,并指定从哪个位置开始编号

slave 操作:
	创建一个新的事务:
		# mysql > begin;
		# mysql > commit;

	指定从哪个位置开始编号:
		# mysql > SET @@SESSION.GTID_NEXT= 'AUTOMATIC';

第五步:开启slave

slave 操作:
	# mysql > start slave;
	# mysql > show slave status\G

mysql frm idb 用途_服务器_02

方法二:重新同步data目录,重新change master to…