GTID和非GTID故障切换模式选择

MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始支持基于GTID的复制,在切换时可以采用GTID模式和非GTID模式两种模式进行切换,如何在发生故障切换时如何判断采用哪种切换方式呢?

在MHA/MasterFailover.pm的do_master_failover方法中定义了"主库宕机"情况下的故障切换流程,其中第一步就是检查配置文件和确定故障切换模式

相关代码:

    my ( $servers_config_ref, $binlog_server_ref ) = init_config();
$log->info("Starting master failover.");
$log->info();
$log->info("* Phase 1: Configuration Check Phase..\n");
$log->info();
MHA::ServerManager::init_binlog_server( $binlog_server_ref, $log );
$dead_master = check_settings($servers_config_ref);
if ( $_server_manager->is_gtid_auto_pos_enabled() ) {
$log->info("Starting GTID based failover.");
}
else {
$_server_manager->force_disable_log_bin_if_auto_pos_disabled();
$log->info("Starting Non-GTID based failover.");
}
$log->info();

在MHA\ServerManager.pm中判断是否采用GTID模式切换的方法:

sub is_gtid_auto_pos_enabled($) {
my $self = shift;
return if ( $self->{gtid_failover_mode} == );
return ;
} sub force_disable_log_bin_if_auto_pos_disabled($) {
my $self = shift;
my $log = $self->{logger};
if ( $self->{gtid_failover_mode} == ) {
my @slaves = $self->get_alive_slaves();
$log->info("Forcing disable_log_bin since GTID auto pos is disabled");
foreach my $slave (@slaves) {
$slave->{disable_log_bin} = ;
}
}
} $self->{gtid_failover_mode} = $self->get_gtid_status();

在MHA/ServerManager.pm判断群集是否使用GTID复制:

sub get_gtid_status($) {
my $self = shift;
my @servers = $self->get_alive_servers();
my @slaves = $self->get_alive_slaves();
return if ( $#servers < 0 );
foreach (@servers) {
return unless ( $_->{has_gtid} );
}
foreach (@slaves) {
return unless ( $_->{Executed_Gtid_Set} );
}
foreach (@slaves) {
return
if ( defined( $_->{Auto_Position} )
&& $_->{Auto_Position} == );
return if ( $_->{use_gtid_auto_pos} );
}
return ;
}

其中has_gtid的计算为:

use constant Has_Gtid_SQL             => "SELECT \@\@global.gtid_mode As Value";
sub has_gtid($) {
my $self = shift;
my $value = $self->get_variable(Has_Gtid_SQL);
if ( defined($value) && $value eq "ON" ) {
$self->{has_gtid} = ;
return ;
}
return ;
}

计算use_gtid_auto_pos的代码:

## MHA/Config.pm
my @PARAM_ARRAY =
qw/ hostname ip port ssh_host ssh_ip ssh_port ssh_connection_timeout ssh_options node_label candidate_master \
no_master ignore_fail skip_init_ssh_check skip_reset_slave user password repl_user repl_password disable_log_bin \
master_pid_file handle_raw_binlog ssh_user remote_workdir master_binlog_dir log_level manager_workdir manager_log \
check_repl_delay check_repl_filter latest_priority multi_tier_slave ping_interval ping_type secondary_check_script \
master_ip_failover_script master_ip_online_change_script shutdown_script report_script init_conf_load_script \
client_bindir client_libdir use_gtid_auto_pos/;
my %PARAM;
for (@PARAM_ARRAY) { $PARAM{$_} = ; } $value{use_gtid_auto_pos} = $param_arg->{use_gtid_auto_pos};
if ( !defined( $value{use_gtid_auto_pos} ) ) {
$value{use_gtid_auto_pos} = $default->{use_gtid_auto_pos};
$value{use_gtid_auto_pos} = if ( !defined( $value{use_gtid_auto_pos} ) );
}

如果配置文件中未指明参数use_gtid_auto_pos,则默认use_gtid_auto_pos=1。

计算Executed_Gtid_Set是查看show master status和show slave status两个命令输出结果中的Executed_Gtid_Set列信息。

计算Auto_Position是查看show slave status命令输出结果中MASTER_AUTO_POSITION列的值。

使用非GTID模式进行切换的场景有:

1、如果群集中任意节点未开启GTID(gtid_mode=0)或Executed_Gtid_Set集合为空。

2、群集中所有节点都未使用GTID复制模式(MASTER_AUTO_POSITION=0),且配置文件中设置use_gtid_auto_pos=0。

使用GTID模式进行切换的场景有:

1、如果群集中任意节点使用GTID复制,SHOW SLAVE STATUS输入结果中MASTER_AUTO_POSITION=1。

2、如果所有节点都开启GTID,且未配置参数use_gtid_auto_pos或配置参数use_gtid_auto_pos=1。

差异日志补偿

1、原主库日志补偿

在GTID故障切换模式下,无论原主库操作系统级别是否正常,都不会尝试从原主库上获取差异BINLOG。

如上图所示,在GTID故障切换模式下,不会进行Phase 3.2阶段,即不会尝试从原Master服务器中获取最新BINLOG。

在非GTID故障切换模式下,如果原主库操作系统级别正常,会尝试对比原主库BINLOG和最新从库的RELAY LOG,如果存在差异,会备份主库差异BINLOG并应用到从库上。

如上图所示,在非GTID故障切换模式下,会先进行Phase 3.1阶段,从拥有最新BINLOG的从库上获取差异日志,再进行Phase 3.2阶段,尝试从原Master服务器上获取最新BINLOG。

2、Binlog Server日志补偿

在GTID故障切换模式下,会对比候选主库的RELAY LOG和Binlog Server的BINLOG,如果Binlog Server含有最新日志,会根据Binlog Server进行日志补偿。

在非GTID模式下,无论Binlog Server是否最新日志,都不会根据Binlog Server进行日志补偿。

3、最新从库日志补偿

无论是GTID故障切换模式还是非GTID故障切换模式,都会挑选出“最新从库”,并对比“最新从库”RELAY LOG和“新主库” RELAY LOG,如果存在差异,则保存“最新从库”的日志并应用到“新主库上”。

在GTID故障切换模式下,可以给masterha_master_switch传入–wait_until_gtid_in_sync=1参数使其不等其它Slave完成数据同步,以加快切换速度。

GTID故障切换模式注意事项

如果群集因为某种原因导致主从节点上的Executed_Gtid_Set不同,如:

1、对从库进行直接授权,导致从库比主库拥有更多BINLOG,但该Binlog因各种原因被Purged掉

2、群集做过版本升级,从未使用GTID的版本升级到GTID版本,从库上曾一段时间内作为主库提供服务,但该时间段日志被Purged掉

有上诉类似问题时,将从库提升为主库并使用master_auto_position=1来配置复制,复制会因为新主库无法提供足够BINLOG事件而失败。

处理办法:

1、通过RESET MASTER和SET GLOBAL gtid_purged=''使得所有节点拥有相同的GTID 集合

2、将所有复制修改为基于POS点搭建的复制。

GTID和非GTID故障切换模式对比

1、无论时GTID故障切换模式还是非GTID故障切换模式,都会从“最新从库”获取差异日志。

2、非GTID故障切换模式下,会尝试从“原主库”获取差异日志,但不会从“BINLOG Server”获取差异日志。

3、GTID故障切换模式下,会从“BINLOG Server”获取差异日志,但不会从“原主库”获取差异日志。

MySQL MHA--故障切换模式(GTID模式和非GTID模式)的更多相关文章

  1. -_-#【userAgent】极速模式与非极速模式存在差异

    UC浏览器 Android 极速模式 UC浏览器 Android 非极速模式

  2. ORACLE归档模式和非归档模式的利与弊

    转: 在Oracle数据库中,主要有两种日志操作模式,分别为非归档模式与归档模式.默认情况下,数据库采用的是非归档模式.作为一个合格的数据库管理员,应当深入了解这两种日志操作模式的特点,并且在数据库建 ...

  3. XCode工程中ARC模式与非ARC模式共用(转)

    Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外, ...

  4. 深入 CSocket 编程之阻塞和非阻塞模式

    有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...

  5. 【bug】【userAgent】极速模式与非极速模式存在差异

    UC浏览器 Android 极速模式 UC浏览器 Android 非极速模式

  6. python 正则表达式与JSON-正则表达式匹配数字、非数字、字符、非字符、贪婪模式、非贪婪模式、匹配次数指定等

    1.正则表达式:目的是为了爬虫,是爬虫利器. 正则表达式是用来做字符串匹配的,比如检测是不是电话.是不是email.是不是ip地址之类的 2.JSON:外部数据交流的主流格式. 3.正则表达式的使用 ...

  7. 面试侃集合 | SynchronousQueue非公平模式篇

    面试官:好了,你也休息了十分钟了,咱们接着往下聊聊SynchronousQueue的非公平模式吧. Hydra:好的,有了前面公平模式的基础,非公平模式理解起来就非常简单了.公平模式下,Synchro ...

  8. CENTOS6.6 下mysql MHA架构搭建

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是自己搭建的一篇mysql MHA文章 前面的安装步骤基 ...

  9. 基于Docker Compose构建的MySQL MHA集群

    Docker MySQL MHA 基于Docker 1.13.1之上构建的MySQL MHA Docker Compose Project 可快速启动GTID模式下的MasterHA集群, 主用于My ...

随机推荐

  1. docker stack删除network失败

    现象描述 删除stack的时候没太多提示,但再启动相同的stack会报错,提示网络创建失败:随后使用network ls命令可以看到之前的network还在: 使用docker network rm还 ...

  2. Hadoop的三种调度器FIFO、Capacity Scheduler、Fair Scheduler(转载)

    目前Hadoop有三种比较流行的资源调度器:FIFO .Capacity Scheduler.Fair Scheduler.目前Hadoop2.7默认使用的是Capacity Scheduler容量调 ...

  3. JavaScript 反射和属性赋值!

    function Antzone(){ this.webName="蚂蚁部落"; this.age=6; } Antzone.prototype={ address:"青 ...

  4. 树莓派小用手册(安装系统,配置图形界面,连接WiFi,调用摄像头,安装ffmpeg)

    安装树莓派系统(重装) 准备工作: 安装需要干净的TF卡(最好 8G 以上),如果是重装的话,需要先将其清理后再使用.清理步骤下面会给出,清理需要工具 DiskGenius,下载链接:http://w ...

  5. bladex开发自己的服务不推送服务器的方法

    一:问题 使用代码生成器 生成的代码,运行后,需要推送至服务器才可以进行调试,每次推送,启动服务至少半个小时以上,相当浪费时间,如何可以让开发的服务不推送至服务器能调试呢? 二:尝试解决 直接开发机运 ...

  6. 转:webpack代码压缩优化

    压缩代码 18 天前30前端开发 压缩 JavaScript 修改 JavaScript 压缩处理器 其他压缩 JavaScript 的方法 加快 JavaScript 执行速度 作用域提升 预执行 ...

  7. 批量删除sql语句

    SET @I = 148;SELECT CONCAT("DELETE FROM supplier_change_log WHERE old_supplier_id=4194 AND id&g ...

  8. activiti学习3:流程引擎对象和流程引擎配置对象

    目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...

  9. asp.net core使用水晶报表问题

    背景     最近项目上遇到一个需求,要后台通过定时任务把水晶报表生成pdf文件,然后邮件发送给相关人. 技术实现思路     选用ASP.NET Core框架(基于2.2版本),通过IHostedS ...

  10. JavaEE 期末总结

    struts2部分 一.struts2框架的集成: 1.web.xml配置struts2过滤器:前端控制器.核心控制器 如果有多个过滤器,需要将该过滤器放置到最后一个 2.struts.xml配置:主 ...