hangkk2008

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考:https://www.jianshu.com/p/e3861cb0aa62

MariaDB GTID组成

MariaDB的全局事物ID由下列三部分组成,例如 GTID:0-64236-299476

”域识别符“-”服务器标识符“(server_id)-”事物识别符“

域识别符是MariaDB 10.0新引入的概念,可以将其理解为每个复制集群分配到唯一ID。域识别符主要是为了在引入多源复制后,把各事务在全局范围内区分开来。

服务器标识符就是复制中使用的server_id系统变量。

最后的事物识别符是依次增1的8字节常数值。

MariaDB的GTID是以事务为单位进行分配的。当使用不支持事务的存储引擎时,GTID会以SQL语句为单位进行分配。

下面将详细说明一下GTID复制相关内容。

一、搭建GTID复制从库
1、mydumper逻辑备份(或者mysqldump逻辑备份)
2、xtrabackup备份
都有 GTID:0-64236-299476 就是后面从库导入备份数据后,从这个GTID开始进行复制的位置。
 
从库设置

a. set global gtid_slave_pos='0-64236-299476';

b. show variables like 'gtid%';确认gtid_slave_pos位置有效。

c. change master to master_host='10.24.64.236',master_user='rep',master_password='xxx',master_use_gtid=slave_pos;

d.start slave; show slave status\G 确认复制搭建成功。

 show slave status\G


二、GTID复制与传统复制之间的切换
1、GTID复制切换到传统复制

stop slave;

change master to master_use_gtid=no;

start slave;

shwo slave status\G 

Using_Gtid: No 可以确认已经由GTID复制切换到传统复制。

show slave status\G

我们再在236主库任意插入一条数据,可以发现239从库的GTID也跟着在增长。并且和236主库的gtid_current_pos保持一致。

 

 2、传统复制切换到GTID复制

stop slave;

change master to master_host='IP',master_port=3306,master_user='rep',master_password='xxx',master_use_gtid=slave_pos;

或者

change master to master_host='IP',master_port=3306,master_user='rep',master_password='xxx',master_use_gtid=current_pos;

start slave;

show slave status\G

确认复制已经切换成功。

可以开启 gtid_strict_mode 防止从库做了更新,主库确不知道.如果从库更新,同步就会报错.目前是关闭状态
set global gtid_strict_mode=on;

 

三、主从GTID复制结构中Master切换

A(M)-->B(S) 切换为 A(S)<--B(M) 结构

主从GTID复制结构中Master切换非常简单。

1、先确认从库B已经完全追上主库A

Master_Log_File: mysql-bin.000056 = Relay_Master_Log_File: mysql-bin.000056 && Read_Master_Log_Pos: 10390 = Exec_Master_Log_Pos: 10390 

2、A 上执行

change master to master_host='B',master_port=,master_user='rep',master_password='xxx',master_use_gtid=current_pos;start slave;

这里把 master_use_gtid 配置成 current_pos。

因为该主库没有做过其他数据库的从库,所以slave_pos为空,需要用current_pos。二者区别可以看后面的定义。


四、在使用GTID的从服务器中跳过事务

场景:

在从库某表中删掉某条记录,然后在主库上执行同样的删除动作。

这时主库会报错如下:

Last_SQL_Error: Could not execute Delete_rows_v1 event on table test.tt; Can't find record in 'tt', Error_code: 1032;

handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000056, end_log_pos 10508

从库找不到需要删除的记录,这时可以手动跳过这个错误。

方法1:

stop slave; set global gtid_slave_pos='0-64236-299482';start slave; 

show slave status\G 确认主从复制恢复正常。

方法2:

stop slave;set global sql_slave_skip_counter=1;start slave;

show slave status\G 确认主从复制恢复正常。

五、GTID使用限制 slave 应禁止写入

1、slave的本地写入,需要注意,因为跟master不是同一个GTID范围,写入binlog的值,复制到后续从库,容易失败,需要使用

set sql_log_bin=0,来禁止binlog的写入。

生产环境所有从库已经设置为read_only(普通用户只有select权限,有all/super权限的都不在这个范围内)。如果因为特殊情况需要在从库写入数据,则先临时关闭binlog写入。

2、切换主库前,必须保证主库数据已经全部复制到将要作为新主库的从库。


六、常见复制错误处理
七、GTID有关的三个全局变量

select @@global.gtid_slave_pos, @@global.gtid_binlog_pos,@@global.gtid_current_pos;

gtid_slave_pos:

This variable is the GTID of the last event group replicated on a slave server, for each replication domain.

gtid_binlog_pos:

This variable is the GTID of the last event group written to the binary log, for each replication domain.

gtid_current_pos:

This variable is the GTID of the last change to the database for each replication domain. Such changes can either be master events (ie. local changes made by user or application), or replicated events originating from another master server.


总结

MariaDB10.0.2之后的GTID复制搭建与管理非常方便,整体比MySQL官方版本好用很多。主要有以下优势:

1、MariaDB GTID可以有间断,支持 set global sql_slave_skip_counter=1 跳过错误的语法。

MySQL的GTID是连续的,不支持直接跳过错误的语法,只能采取插入空事务来跳过相应的GTID.

2、MariaDB 复制结构中可以同时混杂传统复制从库和GTID复制从库。但是MySQL不行,必须所有数据库都开启GTID复制。

3、MariaDB GTID和传统复制间的切换是非常方便的无需其他配置。而MySQL就繁琐很多,无法做到平滑过渡,需要修改主库配置并重启。

MariaDB官方文档也推荐使用GTID复制。后续会琢磨一下GTID复制下的高可用工具,目标使MariaDB GTID复制在主库失败的情况下能自动切换,同时不丢失数据



posted on 2020-09-24 14:03  鱼儿也疯狂  阅读(759)  评论(0)    收藏  举报