MySQL高可用方案MHA在线切换的步骤及原理

时间:2022-09-21 21:48:02

在日常工作中,会碰到如下的场景,如mysql数据库升级,主服务器硬件升级等,这个时候就需要将写操作切换到另外一台服务器上,那么如何进行在线切换呢?同时,要求切换过程短,对业务的影响比较小。

MHA就提供了这样一种优雅的方式,只会堵塞业务0.5~2s的时间,在这段时间内,业务无法读取和写入。

集群信息

角色                             IP地址                 ServerID      类型

Master                         192.168.244.10   1                 写入

Candicate master          192.168.244.20   2                 读

Slave                           192.168.244.30   3                 读

Monitor host                 192.168.244.40                      监控集群组

MHA具体的搭建步骤和原理,可参考另外一篇博客:

MySQL高可用方案MHA的部署和原理

在线切换的步骤

1. 关闭MHA监控

# masterha_stop --conf=/etc/masterha/app1.cnf

2. 在线切换

# /usr/local/bin/masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.244.20 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

其中,

--orig_master_is_new_slave是将原master切换为新主的slave,默认情况下,是不添加的。

--running_updates_limit默认为1s,即如果主从延迟时间(Seconds_Behind_Master),或master show processlist中dml操作大于1s,则不会执行切换。

在线切换的输出

Tue Apr  ::  - [info] MHA::MasterRotate version 0.56.
Tue Apr :: - [info] Starting online master switch..
Tue Apr :: - [info]
Tue Apr :: - [info] * Phase : Configuration Check Phase..
Tue Apr :: - [info]
Tue Apr :: - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Apr :: - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Tue Apr :: - [info] Reading server configuration from /etc/masterha/app1.cnf..
Tue Apr :: - [info] GTID failover mode =
Tue Apr :: - [info] Current Alive Master: 192.168.244.10(192.168.244.10:)
Tue Apr :: - [info] Alive Slaves:
Tue Apr :: - [info] 192.168.244.20(192.168.244.20:) Version=5.6.-log (oldest major version between slaves) log
-bin:enabledTue Apr :: - [info] Replicating from 192.168.244.10(192.168.244.10:)
Tue Apr :: - [info] Primary candidate for the new Master (candidate_master is set)
Tue Apr :: - [info] 192.168.244.30(192.168.244.30:) Version=5.6.-log (oldest major version between slaves) log
-bin:enabledTue Apr :: - [info] Replicating from 192.168.244.10(192.168.244.10:) It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.244.10(192.168
.244.10:)? (YES/no): yes
Tue Apr :: - [info] Executing FLUSH NO_WRITE_TO_BINLOG TABLES. This may take long time..
Tue Apr :: - [info] ok.
Tue Apr :: - [info] Checking MHA is not monitoring or doing failover..
Tue Apr :: - [info] Checking replication health on 192.168.244.20..
Tue Apr :: - [info] ok.
Tue Apr :: - [info] Checking replication health on 192.168.244.30..
Tue Apr :: - [info] ok.
Tue Apr :: - [info] 192.168.244.20 can be new master.
Tue Apr :: - [info]
From:
192.168.244.10(192.168.244.10:) (current master)
+--192.168.244.20(192.168.244.20:)
+--192.168.244.30(192.168.244.30:) To:
192.168.244.20(192.168.244.20:) (new master)
+--192.168.244.30(192.168.244.30:)
+--192.168.244.10(192.168.244.10:) Starting master switch from 192.168.244.10(192.168.244.10:) to 192.168.244.20(192.168.244.20:)? (yes/NO): yes
Tue Apr :: - [info] Checking whether 192.168.244.20(192.168.244.20:) is ok for the new master..
Tue Apr :: - [info] ok.
Tue Apr :: - [info] 192.168.244.10(192.168.244.10:): SHOW SLAVE STATUS returned empty result. To check replication
filtering rules, temporarily executing CHANGE MASTER to a dummy host.Tue Apr :: - [info] 192.168.244.10(192.168.244.10:): Resetting slave pointing to the dummy host.
Tue Apr :: - [info] ** Phase : Configuration Check Phase completed.
Tue Apr :: - [info]
Tue Apr :: - [info] * Phase : Rejecting updates Phase..
Tue Apr :: - [info]
Tue Apr :: - [info] Executing master ip online change script to disable write on the current master:
Tue Apr :: - [info] /usr/local/bin/master_ip_online_change --command=stop --orig_master_host=192.168.244.10 --orig_ma
ster_ip=192.168.244.10 --orig_master_port= --orig_master_user='monitor' --orig_master_password='monitor123' --new_master_host=192.168.244.20 --new_master_ip=192.168.244.20 --new_master_port= --new_master_user='monitor' --new_master_password='monitor123' --orig_master_ssh_user=root --new_master_ssh_user=root --orig_master_is_new_slaveTue Apr :: Set read_only on the new master.. ok.
Tue Apr :: Set read_only= on the orig master.. ok.
Tue Apr :: Killing all application threads..
Tue Apr :: done.
Disabling the VIP an old master: 192.168.244.10
SIOCSIFFLAGS: Cannot assign requested address
Tue Apr :: - [info] ok.
Tue Apr :: - [info] Locking all tables on the orig master to reject updates from everybody (including root):
Tue Apr :: - [info] Executing FLUSH TABLES WITH READ LOCK..
Tue Apr :: - [info] ok.
Tue Apr :: - [info] Orig master binlog:pos is mysql-bin.:.
Tue Apr :: - [info] Waiting to execute all relay logs on 192.168.244.20(192.168.244.20:)..
Tue Apr :: - [info] master_pos_wait(mysql-bin.:) completed on 192.168.244.20(192.168.244.20:). Executed
events.Tue Apr :: - [info] done.
Tue Apr :: - [info] Getting new master's binlog name and position..
Tue Apr :: - [info] mysql-bin.:
Tue Apr :: - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_
HOST='192.168.244.20', MASTER_PORT=, MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=, MASTER_USER='repl', MASTER_PASSWORD='xxx';Tue Apr :: - [info] Executing master ip online change script to allow write on the new master:
Tue Apr :: - [info] /usr/local/bin/master_ip_online_change --command=start --orig_master_host=192.168.244.10 --orig_m
aster_ip=192.168.244.10 --orig_master_port= --orig_master_user='monitor' --orig_master_password='monitor123' --new_master_host=192.168.244.20 --new_master_ip=192.168.244.20 --new_master_port= --new_master_user='monitor' --new_master_password='monitor123' --orig_master_ssh_user=root --new_master_ssh_user=root --orig_master_is_new_slaveTue Apr :: Set read_only= on the new master.
Enabling the VIP 192.168.244.188 on the new master: 192.168.244.20
Tue Apr :: - [info] ok.
Tue Apr :: - [info]
Tue Apr :: - [info] * Switching slaves in parallel..
Tue Apr :: - [info]
Tue Apr :: - [info] -- Slave switch on host 192.168.244.30(192.168.244.30:) started, pid:
Tue Apr :: - [info]
Tue Apr :: - [info] Log messages from 192.168.244.30 ...
Tue Apr :: - [info]
Tue Apr :: - [info] Waiting to execute all relay logs on 192.168.244.30(192.168.244.30:)..
Tue Apr :: - [info] master_pos_wait(mysql-bin.:) completed on 192.168.244.30(192.168.244.30:). Executed
events.Tue Apr :: - [info] done.
Tue Apr :: - [info] Resetting slave 192.168.244.30(192.168.244.30:) and starting replication from the new master
92.168.244.20(192.168.244.20:)..Tue Apr :: - [info] Executed CHANGE MASTER.
Tue Apr :: - [info] Slave started.
Tue Apr :: - [info] End of log messages from 192.168.244.30 ...
Tue Apr :: - [info]
Tue Apr :: - [info] -- Slave switch on host 192.168.244.30(192.168.244.30:) succeeded.
Tue Apr :: - [info] Unlocking all tables on the orig master:
Tue Apr :: - [info] Executing UNLOCK TABLES..
Tue Apr :: - [info] ok.
Tue Apr :: - [info] Starting orig master as a new slave..
Tue Apr :: - [info] Resetting slave 192.168.244.10(192.168.244.10:) and starting replication from the new master
92.168.244.20(192.168.244.20:)..Tue Apr :: - [info] Executed CHANGE MASTER.
Tue Apr :: - [info] Slave started.
Tue Apr :: - [info] All new slave servers switched successfully.
Tue Apr :: - [info]
Tue Apr :: - [info] * Phase : New master cleanup phase..
Tue Apr :: - [info]
Tue Apr :: - [info] 192.168.244.20: Resetting slave info succeeded.
Tue Apr :: - [info] Switching master to 192.168.244.20(192.168.244.20:) completed successfully.

MHA在线切换的原理

1. 检查当前的配置信息及主从服务器的信息

包括读取MHA的配置文件/etc/masterha/app1.cnf及检查当前slave的健康状态

2. 阻止对当前master的更新

主要通过如下步骤:

1> 等待1.5s($time_until_kill_threads*100ms),等待当前连接断开。

2> 执行 read_only=1,阻止新的DML操作

3> 等待0.5s,等待当前DML操作完成。

4> kill掉所有连接。

5> FLUSH NO_WRITE_TO_BINLOG TABLES

6> FLUSH TABLES WITH READ LOCK

3. 等待新master执行完所有的relay log

Waiting to execute all relay logs on 192.168.244.20(192.168.244.20:)..

4. 将新master的read_only设置为off,并添加VIP

5. slave切换到新master上。

1> 等待slave(192.168.244.30)应用完原主从复制产生的relay log,然后执行change master操作切换到新master上。

2> 释放原master上加的锁。

3> 因masterha_master_switch命令行中带有--orig_master_is_new_slave参数,故原master也切换为新master的从。

6. 清理新master的相关信息。

主要是执行了reset slave all操作,清除之前的复制信息。

MHA在线切换需满足的条件

MHA在执行在线切换之前,会判断当前的主从复制信息,只有满足了以下条件,才能执行切换动作:

1. 所有SLAVE的IO线程和SQL线程都在运行。

2. 所有slave的Seconds_Behind_Master小于或等于running_updates_limit的值,该参数如果没有显示指定的话,则默认为1s

3. 在master上,通过show processlist输出,没有一个DML操作的时间大于running_updates_limit的值。

在线切换时,打开general log,各个服务器的操作信息

注:在执行masterha_master_switch命令时,会有两次确认操作

1. It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.244.10(192.168
.244.10:3306)? (YES/no):

2. Starting master switch from 192.168.244.10(192.168.244.10:3306) to 192.168.244.20(192.168.244.20:3306)? (yes/NO):

以下输出中间都有两次空白,其中第一次空白之前的输出对应第一次确认之前,第二次之前的输出对应第二次确认之前。

原master 192.168.244.10

 ::     Connect    monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
:: Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SET wait_timeout=
Query SELECT @@global.server_id As Value
Query SELECT VERSION() AS Value
Query SELECT @@global.gtid_mode As Value
Query SHOW GLOBAL VARIABLES LIKE 'log_bin'
Query SHOW MASTER STATUS
Query SELECT @@global.datadir AS Value
Query SELECT @@global.slave_parallel_workers AS Value
Query SHOW SLAVE STATUS
Query SELECT @@global.read_only As Value
Query SELECT @@global.relay_log_purge As Value :: Query FLUSH NO_WRITE_TO_BINLOG TABLES
Query SELECT GET_LOCK('MHA_Master_High_Availability_Monitor', '') AS Value
Query SHOW PROCESSLIST :: Query SHOW SLAVE STATUS
Query CHANGE MASTER TO MASTER_HOST='dummy_host'
:: Query SHOW SLAVE STATUS
Query RESET SLAVE /*!50516 ALL */
Query SELECT RELEASE_LOCK('MHA_Master_High_Availability_Monitor') As Value
Quit
Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SET sql_log_bin=
Query SHOW PROCESSLIST
Query SELECT @@global.read_only As Value
Query SET GLOBAL read_only=
Query SELECT @@global.read_only As Value
Query SHOW PROCESSLIST
Query SET sql_log_bin=
Quit
Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SET wait_timeout=
Query FLUSH TABLES WITH READ LOCK
Query SHOW MASTER STATUS
:: Query UNLOCK TABLES
Query CHANGE MASTER TO MASTER_HOST = '192.168.244.20' MASTER_USER = 'repl' MASTER_PASSWORD = <secret> MASTE
R_PORT = MASTER_LOG_FILE = 'mysql-bin.000010' MASTER_LOG_POS = Query SET GLOBAL relay_log_purge=
Query START SLAVE
Connect Out repl@192.168.244.20:
Query SHOW SLAVE STATUS
Query SELECT RELEASE_LOCK('MHA_Master_High_Availability_Failover') As Value
Quit

新master 192.168.244.20

 ::     Connect    monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
:: Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SET wait_timeout=
Query SELECT @@global.server_id As Value
Query SELECT VERSION() AS Value
Query SELECT @@global.gtid_mode As Value
Query SHOW GLOBAL VARIABLES LIKE 'log_bin'
Query SHOW MASTER STATUS
Query SELECT @@global.datadir AS Value
Query SELECT @@global.slave_parallel_workers AS Value
Query SHOW SLAVE STATUS
Query SELECT @@global.read_only As Value
Query SELECT @@global.relay_log_purge As Value
Query SELECT @@global.relay_log_info_repository AS Value
Query SELECT @@global.datadir AS Value
Query SELECT @@global.relay_log_info_file AS Value
Query SHOW SLAVE STATUS
Query SELECT Repl_slave_priv AS Value FROM mysql.user WHERE user = 'repl' :: Query SELECT GET_LOCK('MHA_Master_High_Availability_Failover', '') AS Value
Query SHOW SLAVE STATUS
Query SHOW SLAVE STATUS :: Query SHOW PROCESSLIST
Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SELECT @@global.read_only As Value
Query SELECT @@global.read_only As Value
Quit
Query SHOW SLAVE STATUS
Query SELECT MASTER_POS_WAIT('mysql-bin.000017','',) AS Result
Query STOP SLAVE SQL_THREAD
Query SHOW SLAVE STATUS
Query SHOW MASTER STATUS
Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SET sql_log_bin=
Query SELECT @@global.read_only As Value
Query SET GLOBAL read_only=
Query SET sql_log_bin=
Quit
Query SELECT @@global.read_only As Value
Connect repl@node3 on
Query SELECT UNIX_TIMESTAMP()
Query SHOW VARIABLES LIKE 'SERVER_ID'
Query SET @master_heartbeat_period=
Query SET @master_binlog_checksum= @@global.binlog_checksum
Query SELECT @master_binlog_checksum
Query SELECT @@GLOBAL.GTID_MODE
Query SHOW VARIABLES LIKE 'SERVER_UUID'
Query SET @slave_uuid= '8a1093c8-1d00-11e7-954f-000c299a5715'
Binlog Dump Log: 'mysql-bin.000010' Pos:
:: Connect repl@node1 on
Query SELECT UNIX_TIMESTAMP()
Query SHOW VARIABLES LIKE 'SERVER_ID'
Query SET @master_heartbeat_period=
Query SET @master_binlog_checksum= @@global.binlog_checksum
Query SELECT @master_binlog_checksum
Query SELECT @@GLOBAL.GTID_MODE
Query SHOW VARIABLES LIKE 'SERVER_UUID'
Query STOP SLAVE
Query SET @slave_uuid= '2a6365e0-1d05-11e7-956d-000c29c64704'
Binlog Dump Log: 'mysql-bin.000010' Pos:
Query SHOW SLAVE STATUS
Query RESET SLAVE /*!50516 ALL */
Query SHOW SLAVE STATUS
Query SELECT RELEASE_LOCK('MHA_Master_High_Availability_Failover') As Value
Quit

slave 192.168.244.30

 ::     Connect    monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
:: Connect monitor@node4 on
Query set autocommit=
Query SELECT CONNECTION_ID() AS Value
Query SET wait_timeout=
Query SELECT @@global.server_id As Value
Query SELECT VERSION() AS Value
Query SELECT @@global.gtid_mode As Value
Query SHOW GLOBAL VARIABLES LIKE 'log_bin'
Query SHOW MASTER STATUS
Query SELECT @@global.datadir AS Value
Query SELECT @@global.slave_parallel_workers AS Value
Query SHOW SLAVE STATUS
Query SELECT @@global.read_only As Value
Query SELECT @@global.relay_log_purge As Value
Query SELECT @@global.relay_log_info_repository AS Value
Query SELECT @@global.datadir AS Value
Query SELECT @@global.relay_log_info_file AS Value
Query SHOW SLAVE STATUS
Query SELECT Repl_slave_priv AS Value FROM mysql.user WHERE user = 'repl' :: Query SELECT GET_LOCK('MHA_Master_High_Availability_Failover', '') AS Value
Query SHOW SLAVE STATUS
Query SHOW SLAVE STATUS :: Query SHOW SLAVE STATUS
:: Query SHOW SLAVE STATUS
Query SELECT MASTER_POS_WAIT('mysql-bin.000017','',) AS Result
Query STOP SLAVE SQL_THREAD
Query SHOW SLAVE STATUS
Query STOP SLAVE
Query STOP SLAVE
Query SHOW SLAVE STATUS
Query RESET SLAVE
Query CHANGE MASTER TO MASTER_HOST = '192.168.244.20' MASTER_USER = 'repl' MASTER_PASSWORD = <secret> MASTE
R_PORT = MASTER_LOG_FILE = 'mysql-bin.000010' MASTER_LOG_POS = Query SET GLOBAL relay_log_purge=
Query START SLAVE
Connect Out repl@192.168.244.20:
Query SHOW SLAVE STATUS
:: Query SELECT RELEASE_LOCK('MHA_Master_High_Availability_Failover') As Value
Quit

参考

《深入浅出MySQL》

MySQL高可用方案MHA在线切换的步骤及原理的更多相关文章

  1. mysql高可用方案MHA介绍

    mysql高可用方案MHA介绍 概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA, ...

  2. MySQL高可用方案MHA的部署和原理

    MHA(Master High Availability)是一套相对成熟的MySQL高可用方案,能做到在0~30s内自动完成数据库的故障切换操作,在master服务器不宕机的情况下,基本能保证数据的一 ...

  3. MySQL高可用方案--MHA部署及故障转移

    架构设计及必要配置 主机环境 IP                 主机名             担任角色 192.168.192.128  node_master    MySQL-Master| ...

  4. MySQL高可用方案MHA自动Failover与手动Failover的实践及原理

    集群信息 角色                             IP地址                 ServerID      类型 Master                     ...

  5. MHA在线切换的步骤及原理

    在日常工作中,会碰到如下的场景,如mysql数据库升级,主服务器硬件升级等,这个时候就需要将写操作切换到另外一台服务器上,那么如何进行在线切换呢?同时,要求切换过程短,对业务的影响比较小. MHA就提 ...

  6. mysql 高可用方案MHA介绍

    概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10—30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新 ...

  7. MySQL高可用方案--MHA原理

    简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是日 ...

  8. MySQL高可用方案 MHA之一MHA安装

    MHA0.58安装 MHA(Master High Availability)由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点).管理节点mha4mysql-manager ...

  9. MySQL高可用方案 MHA之三 master&lowbar;ip&lowbar;online&lowbar;change

    主从架构master: 10.150.20.90 ed3jrdba90slave: 10.150.20.97 ed3jrdba97 10.150.20.132 ed3jrdba132manager: ...

随机推荐

  1. VMWARE虚拟机CentOS6&period;4系统使用主机无线网卡上网的三种方法介绍

    转自:http://www.jb51.net/network/98820.html 如何真正的实现VMWARE虚拟机CentOS6.4系统使用主机无线网卡上网   环境:WIN7旗舰版,台式机,U盘无 ...

  2. ✡ leetcode 159&period; Longest Substring with At Most Two Distinct Characters 求两个字母组成的最大子串长度 --------- java

    Given a string, find the length of the longest substring T that contains at most 2 distinct characte ...

  3. ApacheBench(ab)使用详解

    ab命令原理  Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力.  ab命令对发出负载的计算机要求很低,既不会占 ...

  4. &lbrack;转载&rsqb;tcp可靠性的好文

    TCP是通过什么方式来提供可靠传输的 2012-11-23 14:18 665人阅读 评论(0) 收藏 举报 TCP是通过什么方式来提供可靠传输的 (合理截断数据包,超时重发,校验,失序重新排序,能够 ...

  5. 最常用的CSS技巧收集笔记

    1.重置浏览器的字体大小  重置浏览器的默认值 ,然后重设浏览器的字体大小你可以使用雅虎的用户界面重置的CSS方案 ,如果你不想下载9MB的文件,代码如下: body,div,dl,dt,dd,ul, ...

  6. Pelican搭建静态博客

    前言 一直以来都希望拥有属于自己的个人博客,随性发点信息,写点技术感想,记录自己的生活,重要的是不受广告的影响.不被河蟹.不会担心有一天被莫名其妙地消失. 之前看过一篇文章:"像黑客一样写博 ...

  7. js中计算两个日期之差

    js中计算两个日期之差            var aBgnDate, aEndDate;            var oBgnDate, oEndDate;            var nYl ...

  8. 《R语言入门与实践》第一章&colon;R基础

    前言 本章介绍了 R 语言的基础知识 界面: 使用命令 “ R “进行命令行的实时编译 对象 定义: 用于储存数据的,设定一个名称 格式: a <- 1:6 命名规则: 规则1:不能以数字开头规 ...

  9. 高负载均衡学习haproxy之安装与配置

    https://www.cnblogs.com/ilanni/p/4750081.html

  10. Java8新特性--流&lpar;Stream&rpar;

    1.简介      Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们一起来学习引入的一个新特性- ...