MySQL MHA切换过程分析

启动 

MHA的启动脚本为masterha_manager(安装后,默认路径--/usr/local/bin/masterha_manager)。启动的过程中会主动检查各节点的SSH连接和主从复制的状态是否正常。运行期间,manager会调用masterha_master_monitor脚本(masterha_master_monitor进一步调用XXX/mha4mysql-manager-0.5?/lib/MHA/MasterMonitor.pm 和 HealthCheck.pm 等脚本),探测各节点的运行情况。探测间隔由manager配置文件中的ping_interval参数决定,探测三次主节点无反应,就判定为宕机。

 故障选主

---读取配置文件中是否有候选主库的参数--candidate_master=1;如果有该参数,并且check_repl_delay=0,则将该节点提升为新的主库。

--如果没有指定候选主节点,则自动判断所有从库的日志量,将最接近主数据库的从库提升为新的主库。

---按照配置文件中,节点的先后顺序选主。

数据补偿

---判断主库SSH的连通性,如果能连通,则通过“save_binary_logs”脚本将缺失的binlog发送给从库,并恢复;

---如果主库无法连通,则通过“apply_diff_relay_logs”脚本计算从库的relay log的差异,并恢复到其他从库;

角色切换

新选出的主库,解除从库身份,剩余从库与新的主库建立主从关系。

VIP偏移

虚拟IP的绑定。

 

思考

如果在FailOver的过程中,主库恢复了怎么办?

要分情况了,可能会FailOver继续也可能要FailOver终止。下面是FailOver终止的Log。

Sat Jan 20 09:27:40 2018 - [info] Checking master reachability via MySQL(double check)...Sat Jan 20 09:27:40 2018 - [error][/usr/local/share/perl5/MHA/MasterFailover.pm, ln218] The master 172.171.172.171(172.171.172.171:3307) is reachable via MySQL (error=1:Connection Succeeded) ! Stop failover.
Sat Jan 20 09:27:40 2018 - [error][/usr/local/share/perl5/MHA/ManagerUtil.pm, ln177] Got ERROR: at /usr/local/bin/masterha_manager line 65.

注:Log中的3307是数据库的DB端口,别奇怪. 

如果是在 Checking master reachability via MySQL(double check) 的过程中(或者check前),发现恢复了,则退出切换过程。并且MHA的进程也会被退出(KIll),masterha_manager 需要重新手动启动。

Checking master reachability via MySQL(double check) ---MasterFailover.pm

源码如下:

# quick check that the dead server is really dead
# not double check when ping_type is insert,
# because check_connection_fast_util can rerurn true if insert-check detects I/O failure.
 if ( $servers_config[0]->{ping_type} ne $MHA::ManagerConst::PING_TYPE_INSERT )
 {
 $log->info("Checking master reachability via MySQL(double check)...");
 if (
 my $rc = MHA::DBHelper::check_connection_fast_util(
 $dead_master->{hostname}, $dead_master->{port},
 $dead_master->{user}, $dead_master->{password}
 )
 )
 {
 $log->error(
 sprintf(
 "The master %s is reachable via MySQL (error=%s) ! Stop failover.",
 $dead_master->get_hostinfo(), $rc
 )
 );
 croak;
 }
 $log->info(" ok.");
 }

 

作者:东山絮柳仔原文地址:https://www.cnblogs.com/xuliuzai/p/17978546

%s 个评论

要回复文章请先登录注册