MySQL MHA--故障切换模式(GTID模式和非GTID模式)

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 1 if ( $self->{gtid_failover_mode} == 1 );
  return 0;
}

sub force_disable_log_bin_if_auto_pos_disabled($) {
  my $self = shift;
  my $log  = $self->{logger};
  if ( $self->{gtid_failover_mode} == 2 ) {
    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} = 1;
    }
  }
}

$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 0 if ( $#servers < 0 );
  foreach (@servers) {
    return 0 unless ( $_->{has_gtid} );
  }
  foreach (@slaves) {
    return 0 unless ( $_->{Executed_Gtid_Set} );
  }
  foreach (@slaves) {
    return 1
      if ( defined( $_->{Auto_Position} )
      && $_->{Auto_Position} == 1 );
    return 1 if ( $_->{use_gtid_auto_pos} );
  }
  return 2;
}

其中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} = 1;
    return 1;
  }
  return 0;
}

计算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{$_} = 1; }

$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} = 1 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”获取差异日志,但不会从“原主库”获取差异日志。

原文地址:https://www.cnblogs.com/gaogao67/p/11143604.html

时间: 2024-10-14 21:28:30

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

正则基础之——贪婪与非贪婪模式

转载自:http://blog.csdn.net/lxcnn/article/details/4756030 1        概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NFA引擎所支持. 属于贪婪模式的量词,也叫做匹配优先量词,包括: “{m,n}”.“{m,}”.“?”.“*”和“+”. 在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”

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

有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server (客户端 / 服务端)的网络聊天和传输文件的程序 ( 详见: 源代码参考 ) ,在调试这些程序的过程中,追踪深入至 CSocket 类核心源码 Sockcore.cpp , 对于CSocket 类的运行机制可谓是一览无遗,并且对于阻塞和非阻塞方式下的 socket 程序的编写也是稍有体会. 阅读本

oracle非归档模式与归档模式的备份

不一致性备份:因为备份操作不可能瞬时完成,而数据文件时刻都在写,SCN时刻都在变,备份完第n个数据文件时, 第n+1个数据文件的SCN有可能已经与之前的都不同了. 不一致性的备份在恢复后必须借助归档日志文件和联机重做日志,将数据库修复到一致性的状态才能打开.因此,创 建不一致性备份除了备份数据库启动时必须的数据文件和控制文件之外,还需要备份归档日志文件. 一致性备份:备份的数据文件和控制文件拥有相同的SCN,即一致性备份.只有数据库以shutdown immediate方式关闭 .并且数据库未被

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

Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外,还可以对单个文件添加标签来指定是否采用ARC模式. 添加标签的方法: 打开:你的target -> Build Phases -> Compile Sources. 双击对应的 *.m 文件 在弹出窗口中输入上面提到的标签-fobjc-arc / -fno-objc-arc (1)如果你的项目使用

keepalived 非抢占模式

keepalived 非抢占模式 抢占模式为当keepalived的某台机器挂了之后VIP漂移到了备节点,当主节点恢复后主动将VIP再次抢回,keepalived默认工作在抢占模式下,而非抢占模式则是当主节挂了再次起来后不再抢回VIP.此处需要注意非抢占模式的keepalived其工作机制必须都为BACKUP,并且开启nopreempt选项. 实现keepalived 非抢占模式 准备主机2台 server host ip keepalived s1 172.20.27.10 keepalive

CENTOS6.6 下mysql MHA架构搭建

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是自己搭建的一篇mysql MHA文章 前面的安装步骤基本不变,后面的比如keepalived的配置文件有几种方法 其实想完成keepalived+lvs+atlas(mycat)+mha+mysql主从复制 这样的架构,只是MYCAT单独文章了 每个节点都关闭防火墙,SELINUX. 1.安装epel yum源 wget http://mirrors.

非阻塞模式(ioctlsocket)

1 //Server.cpp 2 #include <stdio.h> 3 #include <winsock2.h> //winsock.h (2种套接字版本) 4 #pragma comment(lib,"ws2_32.lib") //wsock32.lib 5 6 #define MAXSIZE 100 // 7 8 int main() 9 { 10 // 11 int retVal; 12 13 char buf[MAXSIZE]; 14 15 //初

oracle archivelog模式与非archivelog模式转换

最近集成环境出现归档日志写满后,数据库无法登录情况,询问DBA后查明情况,私下根据DBA的查找方案,拿开发环境做了一下数据库模式的切换,以便做同步监控分析问题,这里给出了数据路 首先使用dba登录,链接到数据库之后使用 sqlplus / as sysdba; archive log list 查看当前数据库归档模式,确实为归档或非归档模式之后.使用 shutdwon immediate 将数据库关闭,然后使用 startup mount 命令将数据开启处于mount状态使用 1 alter d

黄聪:如何用代码设置控制自己网站的网页在360浏览器打开时强制优先使用极速模式,而非兼容模式

最近用360浏览器访问自己的网站,发现都是被优先选用兼容模式打开,这使得网站很难看.为了让360浏览器打开网站的时候优先试用极速模式,找了一下官方论坛,发现了解决方案. 在head标签中添加一行代码: <html> <head> <meta name="renderer" content="webkit|ie-comp|ie-stand"> </head> <body> </body> <