MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)相关的知识,希望对你有一定的参考价值。
mysql主从复制之基于GTIDs的AB复制架构(在线热备)
基于GTIDs的AB复制架构(M-S)
GTIDs概述
什么是GTIDs以及有什么特点?
-
GTIDs(Global transaction identifiers)全局事务标识符,是mysql 5.6新加入的一项技术
-
当使用GTIDs时,每一个事务都可以被识别并且跟踪
-
添加新的slave或者当发生故障需要将master身份或者角色迁移到slave上时,都无需考虑是哪一个二进制日志以及哪个position值,极大简化了相关操作
-
GTIDs是完全基于事务的,因此不支持MYISAM存储引擎
-
GTID由source_id和transaction_id组成:
1)source_id来自于server_uuid,可以在auto.cnf中看到
2)transation_id是一个序列数字,自动生成.
使用GTIDs的限制条件有哪些?
-
不支持非事务引擎(MyISAM),因为可能会导致多个gtid分配给同一个事务
-
create table … select 语句不支持(主库语法报错)
-
create/drop temporary table 语句不支持
-
必须使用enforce-gtid-consistency参数
-
sql-slave-skip-counter不支持(传统的跳过错误方式)
-
GTID复制环境中必须要求统一开启和GTID或者关闭GTID
-
在mysql 5.6.7之前,使用mysql_upgrade命令会出现问题
基于GTIDs的主从复制
在生产环境中,大多数情况下使用的MySQL5.6基本上都是从5.5或者更低的版本升级而来,这就意味着之前的mysql replication方案是基于传统的方式部署,并且已经在运行,因此,接下来我们就利用已有的环境升级至基于GITDs的Replication
〇 思路
- 修改配置文件支持GTIDs (主+从)
- 重启数据库 (主+从)
- 为了保证数据一致性,master和slave设置为只读模式 (主+从)
- 从服务器上重新配置同步 (从)
第一步:修改配置文件支持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;
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
方法二:重新同步data目录,重新change master to…
以上是关于MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)的主要内容,如果未能解决你的问题,请参考以下文章