MySQL高可用架构MHA原理分析

分类:编程技术 时间:2024-02-20 15:46 浏览:0 评论:0
0
本文主要介绍MySQL高可用架构中MHA的原理分析。有一定的参考价值。有兴趣的朋友可以参考一下。希望您读完这篇文章后能有所收获。让小编带你来了解一下吧。一度。

MHA角色部署

MHA服务有两个角色,MHA Manager(管理节点)和MHA Node (数据节点):

MHA Manager:通常部署在独立机器上或者直接部署在其中一台从机上(不推荐后者),管理多个主/从集群,每个主/从集群是称为应用程序;它有两个功能:

(1)Master自动切换和故障转移命令执行

(2)其他辅助脚本执行:手动切换master;主/从状态检测

MHA节点:运行在每台MySQL服务器上(主/从/管理器)。通过监控脚本并具有解析和清理日志的功能来加速故障转移。其功能为:

(1)复制主节点的binlog数据

(2)比较从节点的relay log文件

(3 )无需停止从节点的SQL线程定期删除中继日志

目前MHA主要支持一主多从架构。 要构建MHA,一个复制集群至少要有三台数据库服务器,一主二从,即一台作为主,一台作为备主,一台作为作为从数据库,因为至少需要三台服务器。出于机器成本的考虑,淘宝也在这个基础上进行了修改。目前淘宝TMHA支持一主一从。

对于我们自己使用来说,其实可以使用1主1从,但是master主机宕机后,无法切换,无法完成binlog。 master的mysqld进程崩溃后,切换仍然可以成功,binlog 可以完成。

官方介绍:https://code.google.com/p/mysql-master-ha/

下图展示了如何通过管理多组主从复制内政部经理。 MHA的工作原理可以概括如下:

(1)从崩溃的master中保存二进制日志事件(binlog events);

(2) 识别包含最新更新的从站;

(3)将差异中继日志应用到其他slave上;

(4)应用从master保存的二进制日志事件;

(5)将一个奴隶提升为新的主人;

(6)让其他slave连接到新的master上进行复制;

MHA组件

(1)、Manager工具:

–masterha_check_ssh:检查MHA的SSH配置。

– masterha_check_repl:检查MySQL复制。

– masterha_manager:启动MHA。

--masterha_check_status:检查当前运行的MHAing 状态。

– masterha_master_monitor:监控master是否宕机。

– masterha_master_switch:控制故障转移(自动或手动)。

– masterha_conf_host:添加或删除配置的服务器信息。

(2)、Node工具(这些工具通常由MHAManager脚本触发,不需要手动操作)。

– save_binary_logs:保存并复制master的二进制日志。

– apply_diff_relay_logs:识别差异中继日志事件并将其应用到其他从站。

–filter_mysqlbinlog:删除不必要的ROLLBACK事件(MHA不再使用这个工具)。

– purge_relay_logs:清除中继日志(不会阻塞SQL线程)。

(3)、自定义扩展:

-secondary_check_script:通过多个网络路由检测master的可用性;

- master_ip_failover_script:更新applicationn使用的masterip; (需修改)

-shutdown_script:强制关闭master节点;

-report_script:发送报告;

-init_conf_load_script:加载初始配置参数;

-master_ip_online_change:更新主节点ip地址; (需修改)

MHA环境准备

操作系统:CentOS 6.8

MySQL:5.7.18

MHA软件包:MHA 0.57

字符IP地址主机名 Server_id ""
Master 10.180.2.163 MHA -M1 13306 "Write"
S1 10.180.2.164 MHA-S1 23306 “读”(其实监控可以部署在一起,一组MHA可以有多个监控节点)
S2   10.180.2.165 MHA-S2 33306 “读”,“监控复制组”(监控一般不能部署到master节点,防止Master宕机无法切换)

安装MHA节点包

(1)安装所需的perl模块(DBD:mysql)所有节点上的MHA节点,并下载MHA软件包

12yum install perl-DBD-MySQL - y(可能需要epel源)https://mega.nz/#F!G4oRjARB!SWzFS59bUv9VrKwdAeIGVw (MHA0.57)

(2)在所有节点(包括Manager节点)上安装mha节点:

tar xf mha4mysql-node-0.57.tar.gzcd mha4mysql-node-0.57perl Makefile.PLmake && make install

安装完成后,会生成以下文件:


[root@MHA-S1 bin]# lltotal 48-r-xr-xr-x 1根根16381 8月7日14:06 apply_diff_relay_logs-r-xr-xr-x 1根根4807 8月7日14:06 filter_mysqlbinloglrwxrwxrwx 1 root root 8月8日26日17:10 mysql -> /usr/local/mysql/bin/mysqllrwxrwxrwx 1 root root 8月8日32日17:09 mysqlbinlog -> /usr/local/mysql/bin/mysqlbinlog -r-xr- xr-x 1 root root 8261 Aug 7 14:06 purge_relay_logs-rwxr-xr-x 1 root root 314 Aug 8 16:21 purge_relay.sh-r-xr-xr-x 1 root root 7525 Aug 7 14:06 save_binary_logs [ root@MHA-S1 bin]# pwd /usr/local/bin

添加系统环境变量:

echo "export PATH=\$PATH:/usr /local/bin" >> /etc/profile source ~/.bash_profile
安装MHA Manager包
tar xf mha4mysql-node-0.57.tar.gzcd mha4mysql-node-0.57perl Makefile.PLmake && make install

安装完成后会生成如下脚本文件/usr/local/bin目录下


[root@MHA-S2 bin]# pwd /usr/local/bin[ root@MHA-S2 bin ]# lltotal 140-r-xr-xr-x 1根根16381 8月7日14:07 apply_diff_relay_logs-r-xr-xr-x 1根根4807 8月7日14:07 filter_mysqlbinlog-rwxr-xr -x 1根根166 8月9日17:18 manager.sh-r-xr-xr-x 1根根1995年8月7日17:28 masterha_check_repl-r-xr-xr-x 1根根1779年8月7日17:28 masterha_check_ssh -r-xr-xr -x 1 root root 1865年8月7日17:28 masterha_check_status-r-xr-xr-x 1 root root 3201年8月7日17:28 masterha_conf_host-r-xr-xr-x 1 root root 2517年8月7日17:28 masterha_manager-r -xr-xr-x 1根根2165年8月7日17:28 masterha_master_monitor-r-xr-xr-x 1根根2373年8月7日17:28 masterha_master_switch-r-xr-xr-x 1根根5171年8月7日17: 28 masterha_secondary_check-r-xr-xr-x 1 根 root 1739 8月7日17:28 masterha_stop-rwxr-xr-x 1根根2169年8月9日10:49 master_ip_failover-rwxr-xr-x 1根根3648 8月7日17:30 master_ip_failover.old-rwxr-xr-x 1根root 10369 Aug 12 21:33 master_ip_online_change-rwxr-xr-x 1 root root 9870 Aug 7 17:30 master_ip_online_change.oldlrwxrwxrwx 1 root root 26 Aug 817:10 mysql -> /usr/local/mysql/bin/mysqllrwxrwxrwx 1 root root 8月32日17:09 mysqlbinlog -> /usr/local/mysql/bin/mysqlbinlog-rw------ 1 root root 0 Aug 12 20:04 nohup.out-rwxr-xr-x 1 root root 11867 Aug 7 17:30 power_manager-r-xr-xr-x 1 root root 8261 Aug 7 14:07 purge_relay_logs-rwxr-xr-x 1 root root 314 Aug 8 16:20 purge_relay.sh-r-xr-xr-x 1 root root 7525 Aug 7 14:07 save_binary_logs-rwxr-xr-x 1 root root 1360 Aug 7 17:30 send_report
< p>

将相关脚本复制到 / usr/local/bin目录(软件包解压后会有,但不是必须的,因为这些脚本不完整,需要自己修改。T他的软件是留给我们自己开发的。如果启用了下面任意一个脚本对应的参数,并且不修改这里对应的脚本,就会抛出错误,我被骗得很惨了)


< p>[root@MHA-S2 scripts]# ll
total 32
-rwxr-xr -x 1 root root 3443 Jan 8 2012 master_ip_failover #自动切换时VIP管理的脚本不是必须的。如果我们使用keepalived,我们可以自己编写脚本来完成VIP的管理,比如监控mysql。如果mysql异常,我们停止keepalived就好了,这样vip就会自动漂移
-rwxr-xr-x 1 root root 9186 Jan 8 2012 master_ip_online_change #在线切换时的VIP管理不需要,也可以写一个自己简单的shell
-rwxr-xr-x 1 root root 11867 Jan 8 2012 power_manager                   #发生故障后关闭主机的脚本,不是必须的
-rwxr-xr-x 1 root root 1360 Jan 8 2012 发送报告#故障转移后发送警报脚本不是必须的,可以自己写一个简单的shell。
[root@MHA-S2 script]# cp * /usr/local/bin/


配置SSH登录无需密码认证< /strong>

ssh-keygenssh-copy-id root@xxx(XXX请包含您自己,否则稍后的 check-ssh 步骤将需要证书))

搭建主从复制环境

之前双主复制环境搭建文档详解

确保两个Slave搭建成功。

Slave_IO_Running: YesSlave_SQL_Running: Yes
两台从服务器设置为read_only(从库提供对外读服务,但配置文件不写,因为从库会提升为master随时)
root@localhost:mysql3306.sock [(none)]>set global read_only=1

创建监控用户(在master上执行)

<前>克将*.*上的所有权限授予'123456'标识的root@'%';
flush权限;

至此,复制完成,MHA配置完毕稍后

MHA环境配置

(1)创建MHA工作目录

mkdir -p /etc/mha

修改app1.cnf配置文件,修改后的文件内容如下:

[root@MHA-S2 ~]# /etc/mha/= /var/log/masterha/app1/=/var/log/masterha/=/data/mysql//=/usr/local/bin/=/usr/local/bin/= ==/====/usr/local/bin/=/usr/local/bin/masterha_secondary_check -s MHA-S1 -s MHA-===MHA-==//设置为候选master。如果设置了该参数,主从切换将会从 Kuti 升级到主库,即使主库不是集群中最新的事件slavecheck_repl_delay=//默认情况下,如果一个slave 落后于master 100M 中继日志,MHA不会选择slave作为新的master,因为对于这个slave Recovery需要很长时间。通过设置check_repl_delay=0,MHA触发开关在选择新的master时将忽略复制延迟。这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选master在切换过程中,一定是新的master
=MHA-S1 port=
 =MHA-=

(2)设置中继日志清除方式(在每个从节点上):

?

1'设置全局relay_log_purge=0'

注意:

在切换过程中, MHA在从库恢复过程中依赖于relay log的相关信息,所以这里将relay log的自动清除设置为OFF,使用手动清除relay log。默认情况下,从服务器上的中继日志会在SQL线程执行完成后自动删除。但在MHA环境下,这些中继日志在恢复其他从服务器时可能会用到,所以自动删除需要禁用中继日志功能。定期清除中继日志需要考虑复制延迟。在ext3文件系统下,删除大文件需要一定的时间,这会导致严重的复制延迟。为了避免复制延迟,需要临时为中继日志创建硬链接,因为在Linux系统中通过硬链接删除大文件会非常快。 (mysql数据库中,删除大表时,通常会建立硬链接。)

MHA节点包含pure_relay_logs命令工具,可以为中继日志创建硬链接。执行SET GLOBAL Relay_log_purge=1,等待几秒让SQL线程切换到新的中继日志,然后执行SET GLOBAL Relay_log_purge=0。

pure_relay_logs脚本参数如下:

--user mysql 用户名--password mysql 密码--port 端口号--workdir 指定create re的硬链接位置放置日志是/var/tm默认为 p。由于在系统的不同分区创建硬链接文件会失败,因此需要执行硬链接详细信息。位置,成功执行脚本后,硬链接中继日志文件被删除 --disable_relay_log_purge 默认情况下,如果relay_log_purge=1,脚本不会清除任何内容并自动退出。通过设置该参数,当relay_log_purge=1时,会将relay_log_purge设置为0。清理完中继日志后,最后将该参数设置为OFF。 

(3)设置定期清理中继脚本(例如每天一次,所有服务器)

[ root@MHA-S2 bin]# purge_relay.!/bin/====== [ ! - $log_dir ---user=$user --password=$ --disable_relay_log_purge --port=$port --workdir=$ work_dir >> $log_dir/purge_relay_logs.log >&

添加到crontab[root@MHA-S2 bin]# crontab -l0 4 * * * /bin/bash /root/purge_relay_log.sh
< p>你可以手动执行以下命令看是否会报错

检查SSH配置

< /p>

[root@MHA-S2 bin]# masterha_check_ssh --conf=/etc/mha/app1.cnf Mon Aug 14 18: 07:02 2017 - [警告] 全局配置文件 /etc/masterha_default.cnf未找到。 Skipping.Mon Aug 14 18:07:02 2017 - [info] 从 /etc/mha/app1.cnf 读取应用程序默认配置.. Mon Aug 14 18:07:02 2017 - [info] 从 /etc/ 读取服务器配置mha/app1.cnf..Mon Aug 14 18:07:02 2017 - [info] 开始 SSH 连接测试..Mon Aug 14 18 :07:03 2017 - [debug] Mon Aug 14 18:07:02 2017 - [ debug] 通过 SSH 从 root@MHA-M1(10.180.2.163:22) 连接到 root@MHA-S1(10.180.2.164:22)..Mon Aug 14 18:07:02 2017 - [debug] ok.Mon Aug 14 18:07:02 2017 - [调试] 通过 SSH 从 root@MHA-M1(10.180.2.163:22) 连接到 root@ MHA-S2(10.180.2.165:22)..Mon Aug 14 18:07:03 2017 - [调试] ok.8 月 14 日星期一 18:07:03 2017 - [调试] 8 月 14 日星期一18:07:03 2017 -[调试] 通过 SSH 从 root@MHA-S1(10.180.2.164:22) 连接到 root@MHA-M1(10.180.2.163:22)..Mon Aug 14 18:07:03 2017 - [调试] ok.Mon Aug 14 18:07:03 2017 - [调试] 通过 SSH 从 root@MHA-S1(10.180.2.164:22) 连接到 root@MHA-S2(10.180.2.165:22).. Mon Aug 14 18:07: 03 2017 - [debug] ok.Mon Aug 14 18:07:04 2017 - [debug] Mon Aug 14 18:07:03 2017 - [debug] 通过 SSH 从 root@MHA-S2 连接(10.180.2.165:22) 至 root@MHA-M1(10.180.2.163:22)..Mon Aug 14 18:07:03 2017 - [调试] ok.Mon Aug 14 18:07:04 2017 - [调试]通过 SSH 从 root@MHA -S2(10.180.2.165:22) 连接到 root@MHA-S1(10.180.2.164:22)..Mon Aug 14 18:07:04 2017 - [debug] ok.Mon Aug 14 18: 07:04 2017 - [info]所有SSH连接测试均成功通过。

检查整个复制环境状态

发现错误, p>

8 月 8 日星期二 17:46 :31 2017 - [信息] 检查 master_ip_failover_script 状态:2017 年 8 月 8 日星期二 17:46:31 - [info] /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=MHA-M1 --orig_master_ip=10.180.2.163 -- orig_master_port=3306 在 /usr/local/bin/master_ip_failover 第 93 行使用“strict subs”时不允许使用裸字“FIXME_xxx”。由于编译错误,/usr/local/bin/master_ip_failover 的执行中止。8 月 8 日星期二 17:46 :31 2017 - [错误][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln229] 无法获取 master_ip_failover_script 状态,返回代码为 255:0。2017 年 8 月 8 日星期二 17:46:31 - [错误] [/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] 检查配置时发生错误。在 /usr /local/bin/masterha_check_repl line 48Tue Aug 8 17:46:31 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] 监控服务器上发生错误。Tue Aug 8 17:46 :31 2017 - [info] 得到退出代码 1(不是 master 死了)。

事实证明有两个我Failover的方式:一是虚拟IP地址,二是全局配置文件。 MHA并不限制使用哪种方法,而是允许用户选择。虚拟IP地址方式会涉及到其他软件,比如keepalive软件,需要修改master_ip_failover脚本。这里先屏蔽app1.cnf中的选项master_ip_failover_script= /usr/local/bin/master_ip_failover才可以通过。

#master_ip_failover_script= /usr/local/bin/master_ip_failover                                                               MySQL 复制运行状况正常。

检查 MHA 管理器的状态

<预>[root@MHA-S2 mha]# masterha_check_status --conf=/etc /mha/app1.cnf app1 已停止(2:NOT_RUNNING)。

手动启动

[root @MHA-S2 mha]# nohup masterha_manager --conf=/etc/mha /app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &[ 1] 16774[root@MHA-S2 mha]# ps -ef|grep masterharoot 16774 15297 4 17:52 pts/3 00:00:00 perl /usr/local/bin/masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover[root@MHA-S2 mha ] # masterha_check_status --conf=/etc/mha/app1.cnfapp1 (pid:16774) is running(0:PING_OK), master:MHA-M1

--remove_dead_master_conf 这个参数表示当一个master -slave切换发生时,旧主库的IP地址会发生变化,从配置文件中删除。 (如果旧master发生异常切换后修复,想要添加新的MHA,一定要记得app1.cnf备份server1的信息)

--manger_log 日志存储位置

--ignore_last_failover 默认情况下,如果MHA检测到连续宕机且两次宕机间隔小于8小时,则不会进行Failover。这样做的原因是为了避免乒乓效应。 该参数表示忽略上次MHA触发生成的文件开关。默认情况下,发生MHA切换后,会在log目录下生成app1.failover.complete文件,也就是我上面设置的/data。 Next 如果再次切换时发现目录中存在该文件,则不允许触发切换,除非在第一次切换后删除该文件。为了方便起见,将其设置为 --ignore_last_failover。

检查启动日志

[root@MHA-S2 app1 ]# vi manager.log 2017 年 8 月 8 日星期二 17:52:37 - [警告] 未找到全局配置文件 /etc/masterha_default.cnf。 Skipping.Tue Aug 8 17:52:37 2017 - [info] 从 /etc/mha/app1 读取应用程序默认配置。 cnf..Tue Aug 8 17:52:37 2017 - [info] 从 /etc/mha/app1.cnf..Tue Aug 8 17:52:37 2017 - [info] 读取服务器配置 MHA::MasterMonitor 版本 0.57。 2017 年 8 月 8 日星期二 17:52:38 - [info] GTID 故障转移模式 = 1 2017 年 8 月 8 日星期二 17:52:38 - [info] 死服务器:8 月 8 日星期二 17:52:38 2017 - [info] 活动服务器:2017 年 8 月 8 日星期二 17:52:38 - [info] MHA-M1(10.180.2.163:3306)2017 年 8 月 8 日星期二 17:52:38 - [info] MHA -S1(10.180.2.164:3306)2017年8月8日星期二17:52:38 - [信息] MHA-S2(10.180.2.165:3306)2017年8月8日星期二17:52:38 - [信息]活着的奴隶:8月星期二8 17:52:38 2017 - [信息] MHA-S1(10.180.2.164:3306) Version=5.7.18-log (从站之间最旧的主要版本) log- bin:enabledTue Aug 8 17:52:38 2017 - [ info] GTID ONTue Aug 8 17:52:38 2017 - [info] 从 MHA-M1(10.180.2.163:3306)Replicating from MHA-M1(10.180.2.163:3306)Tue Aug 8 17:52:38 2017 - [info] 新 Master 的主要候选人 (candidate_master 是set)Tue Aug8 17:52:38 2017 - [info] MHA-S2(10.180.2.165:3306) Version=5.7.18-log (slaves 之间最旧的主要版本) log-bin:enabledTue Aug 8 17:52:38 2017 - [信息] GTID ONTue Aug 8 17:52:38 2017 - [info] 从 MHA-M1(10.180.2.163:3306)Tue Aug 8 17:52:38 2017 复制 - [info] 当前 Alive Master: MHA- M1(10.180 .2.163:3306)Tue Aug 8 17:52:38 2017 - [info] 检查从站配置..Tue Aug 817:52:38 2017 - [info] 检查复制过滤设置..Tue Aug 8 17:52:38 2017 - [info] binlog_do_db= , binlog_ignore_db=Tue Aug 8 17:52:38 2017 - [info] 复制过滤检查ok.Tue Aug 8 17:52:38 2017 - [info] 支持 GTID(带自动 pos)。跳过所有 SSH 和 Node 包检查。Tue Aug 8 17:52:38 2017 - [info] 检查当前主服务器上的 SSH 公钥身份验证设置。.Tue Aug 8 17:52:38 2017 - [info] HealthCheck:SSH 到 MHA -M1 可达。2017 年 8 月 8 日星期二 17:52:38 - [info]MHA-M1(10.180.2.163:3306) (当前主控) +--MHA-S1(10.180.2.164:3306) +--MHA- S2(10.180.2.165:3306)2017 年 8 月 8 日星期二 17:52:38 - [警告] master_ip_failover_script 未定义。2017 年 8 月 8 日星期二 17:52:38 - [警告] shutdown_script 未定义。8 月 8 日星期二 17:52 :38 2017 - [info] 设置主 ping 间隔 1 秒。Tue Aug 8 17:52:38 2017 - [info] 设置辅助检查脚本: /usr /local/bin/masterha_secondary_check -s MHA-S1 -s MHA-S2Tue 2017 年 8 月 8 日 17:52:38 - [信息] 开始 pingMHA-M1 上的健康检查(10.180.2.163:3306)..Tue Aug 8 17: 52:38 2017 - [info] Ping(SELECT) 成功,等待 MySQL 不响应..

配置VIP

VIP配置可以通过两种方式完成, 一个通过keepalived管理虚拟IP的浮动;另一种是通过脚本启动虚拟IP的方式(即不需要keepalived或者heartbeat之类的软件)。

这里仅演示如何使用脚本管理VIP,修改master_ip_failover脚本,使用脚本管理VIP

[root@MHA-M1 ~] # /sbin/ifconfig eth2:1 10.180.2.168/19

脚本:

[root @MHA-S2 bin]# cat master_ip_failover#!/usr/bin/env perluse strict;使用警告 FATAL => 'all' ;use Getopt::Long;my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $ orig_master_port、$new_master_host、$new_master_ip、$new_master_port);我的$vip = '10.180.2. 168/19';我的 $key = '1';我的 $ssh_start_vip = "/sbin/ifconfig eth2:$key $vip";我的 $ssh_stop_vip = "/sbin/ifconfig eth2:$key down";GetOptions( 'command =s'=> \$command,         'ssh_user=s'                                                                                                                                                                                  , 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip , 'new_master_port=i' => \$new_master_port,); exit &main();sub main { print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if ( $command eq "stop"|| $command eq "stopssh" ) { 我的 $exit_code = 1; eval { print "在旧 master 上禁用 VIP:$orig_master_host \n"; &stop_vip(); $退出代码 = 0; }; if ($@) { warn "出现错误: $@\n";退出$exit_code; } 退出 $exit_code; } elsif ( $command eq "start" ) { 我的 $exit_code = 10; eval { print "在新主机上启用 VIP - $vip - $new_master_host \n"; &start_vip(); $exit_code = 0 |} 退出 $exit_code;} Elsif($Command EQ "STATUS") {Print "检查脚本的状态.. OK\N";退出0;}否则{&用法();退出 1;} } sub start_vip () { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;}sub stop_vip() { return 0 except ($ssh_user); } `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;}sub 用法 { print "用法:master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port= port --new_master_host=host --new_master_ip=ip --new_master_port=port\n ";}

取消注释 master_ip_online_failover刚刚在app1.cnf文件中制作并测试:

再次检查MHA check[root@MHA-S2 bin]# masterha_check_repl --conf=/etc/mha/app1.cnf Wed Aug 9 10 :49:42 2017 - [警告] 未找到全局配置文件 /etc/masterha_default.cnf。 Skipping.Wed Aug 9 10:49:42 2017 - [info] 阅读应用程序默认值lt 配置来自 /etc/mha/app1.cnf。 .Wed Aug 9 10:49:42 2017 - [info] 从 /etc/mha/app1.cnf 读取服务器配置..Wed Aug 9 10:49:42 2017 - [info] MHA::MasterMonitor 版本 0.57.Wed Aug 9 10:49:43 2017 - [info] GTID 故障转移模式 = 1Wed Aug 9 10:49:43 2017 - [info] Dead Servers:Wed Aug 9 10:49:43 2017 - [info] Alive Servers:Wed Aug 9 10 :49:43 2017 - [信息] MHA-M1(10.180 .2.163: 3306) 8 月 9 日星期三 10:49:43 2017-[信息] MHA-S1 (10.180.2.164:3306) 8 月 9 日星期三 10:49:43 2017-[信息] MHA-S2 (10.180.2.165:3306) 2017 年 8 月 9 日星期三 10:49:43 - [信息] 活着的奴隶: 2017 年 8 月 9 日星期三 10:49:43 - [信息] MHA-S1(10.180. 2.164:3306) Version=5.7.18-log (从站之间最旧的主要版本) log-bin:enabledWed Aug 9 10:49:43 2017 - [info] GTID ONWed Aug 9 10:49:43 2017 - [ info] 复制来自 MHA-M1(10.180.2.163:3306)Wed Aug 9 10:49:43 2017 - [info] 新 Master 的主要候选人 (candidate_master is set)Wed Aug 9 10:49:43 2017 - [ info ] MHA- S2(10.180.2.165:3306) Version=5.7.18-log(最旧的主要 v从站之间的版本) log-bin:enabledWed Aug 9 10:49:43 2017 - [info] GTID ONWed Aug 9 10:49: 43 2017 - [info] 从 MHA-M1(10.180.2.163:3306)Wed Aug 9 复制10:49:43 2017 - [info] 当前活着的主机:MHA-M1(10.180.2.163:3306)Wed Aug 9 10:49:43 2017 -[Info] 检查从配置..Wed Aug 9 10:49:43 2017-[Info] 检查复制过滤设置..Wed Aug 9:49:43 2017-[Info] binlog_do_db =, B.Inlog_ignore_db = WED AUG 9 10 10 :49:43 2017 - [info] 复制过滤检查 ok.Wed 2017 年 8 月 9 日 10:49:43 - [info] 支持 GTID(带自动 pos)。跳过所有 SSH 和节点包检查。Wed Aug 9 10: 49:43 2017 - [info] 检查当前主服务器上的 SSH 公钥身份验证设置。Wed Aug 9 10:49:43 2017 - [info] HealthCheck:SSH 到 MHA -M1 可达。2017 年 8 月 9 日星期三 10:49:43 - [info] MHA-M1 (10.180.2.163:3306) (当前主控) +--MHA-S1(10.180.2.164:3306) +--MHA- S2(10.180.2.165:3306)2017 年 8 月 9 日星期三 10:49:43 - [info] 检查 MHA-S 上的复制运行状况1..Wed Aug 9 10:49:43 2017 - [info] ok.Wed Aug 9 10:49:43 2017 - [info] 检查 MHA-S2 上的复制运行状况..Wed Aug 9 10 :49:43 2017 - [info] ok.Wed 2017 年 8 月 9 日 10:49:43 - [info] 检查 master_ip_failover_script 状态:ok 2017 年 8 月 9 日 10:49:43 - [info] /usr/local/bin/master_ip_failover --command=status -- ssh_user=root --orig_master_host=MHA-M1 --orig_master_ip=10.180.2.163 --orig_master_port= 3306

脚本测试====/sbin/ifconfig eth2:1 down==/sbin/ifconfig eth2:1 10.180.2.168/19===

检查脚本的状态.. OK
2017 年 8 月 9 日星期三 10:49:43 - [info] OK。
2017 年 8 月 9 日星期三 10:49:43 - [警告] shutdown_script 未定义。
2017 年 8 月 9 日星期三 10:49:43 - [信息] 退出代码 0(不是主控已死)。

< p>MySQL Replication Health is OK。

以上就是MHA安装和配置的整个过程。下面进行一个简单的测试。

(1)故障转移测试

手动killmaster上mysqld进程并查看切换状态

[root@MHA-S2 tmp]# more manager.log Wed 2017 年 8 月 9 日 17:47:11 - [警告] MySQL select ping 出现错误:2006(MySQL 服务器已消失)2017 年 8 月 9 日星期三 17:47:11 - [info] 执行辅助网络检查脚本:/usr/local /bin/masterha_secondary_check -s MHA-S1 -s MHA-S2 --user=root --master_host=MHA-M1 --master_ip=10.180.2.163 --master_port=3306 --master_user=root --master_password=123456 -- ping_type=SELECTWed Aug 9 17:47:11 2017 - [info] 执行 SSH 检查脚本:exit 0Wed Aug 9 17:47:11 2017 - [info] HealthCheck:可以通过 SSH 访问 MHA-M1。监控服务器MHA-S1 可达,但从MHA-S1 无法到达Master。好的。监控服务器 MHA-S2 可以访问,但从 MHA-S2 无法访问主服务器。 OK.Wed Aug 9 17:47:11 2017 - [info] 无法从所有其他监控服务器访问 Master。故障转移应该开始。2017 年 8 月 9 日星期三 17:47:12 - [警告] M 上出现错误ySQL 连接:2013(在“读取初始通信数据包”时丢失与 MySQL 服务器的连接,系统错误:111)2017 年 8 月 9 日星期三 17:47:12 - [警告] 连接失败 2 次。 2017 年 8 月 9 日星期三 17:47:13 - [警告] MySQL 连接出错:2013(在“读取初始通信数据包”时与 MySQL 服务器失去连接,系统错误:111)2017 年 8 月 9 日星期三 17:47:13 - [警告] 连接失败 3 次..Wed Aug 9 17:47:14 2017 - [警告] MySQL 连接出错:2013(在“读取初始通信数据包”时丢失与 MySQL 服务器的连接,系统错误:111 )Wed Aug 9 17:47:14 2017 - [警告] 连接失败 4 次..Wed Aug 9 17:47:14 2017 - [warning] Master 无法通过健康检查器访问!Wed Aug 9 17:47 :14 2017 - [警告] Master MHA-M1(10.180.2.163:3306) 无法访问!2017 年 8 月 9 日星期三 17:47:14 - [警告] SSH 可以访问。2017 年 8 月 9 日星期三 17:47:14 - [ info] 连接到主服务器失败。读取配置文件 /etc/masterha_default.cnf 和 /etc/mha/app1再次.cnf,并尝试连接到所有服务器以检查服务器状态..Wed Aug 9 17: 47:14 2017 - [警告] 未找到全局配置文件 /etc/masterha_default.cnf。 Skipping.Wed Aug 9 17:47:14 2017 - [info] 从 /etc/mha/app1.cnf 读取应用程序默认配置.. Wed Aug 9 17:47:14 2017 - [info] 从 /etc/ 读取服务器配置mha/app1.cnf..2017 年 8 月 9 日星期三 17:47:14 - [信息] GTID 故障转移模式 = 2017 年 8 月 9 日星期三 17:47:14 1 日 - [信息] 失效服务器:2017 年 8 月 9 日星期三 17:47:14 - [信息] MHA-M1(10.180.2.163:3306)2017 年 8 月 9 日星期三 17:47:14 - [信息] 活动服务器:2017 年 8 月 9 日星期三 17:47 :14 - [信息] MHA-S1(10.180.2.164: 3306)2017年8月9日星期三17:47:14 - [信息] MHA-S2(10.180.2.165:3306)2017年8月9日星期三17:47:14 - [信息]活着的奴隶:2017年8月9日星期三17:47:14 - [信息] MHA-S1(10.180.2.164:3306) Version=5.7.18-log (从属设备之间最旧的主要版本) log-bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17 :47:14 2017 - [信息] 从 MHA-M1(10.180.2.163:3306)Wed Au 复制g 9 17:47:14 2017 - [info] 新Master的主要候选人(candidate_master已设置)Wed Aug 9 17:47:14 2017 - [info] MHA- S2(10.180.2.165:3306) Version=5.7。 18-log(从站之间最旧的主要版本) log-bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 从 MHA-M1 复制(10.180.2.163 :3306)Wed Aug 9 17:47:14 2017 - [info] 检查从配置..Wed Aug 9 17:47:14 2017 - [info] 检查复制过滤设置..Wed Aug 9 17:47:14 2017 - [info] 复制过滤检查正常。Wed Aug 9 17:47:14 2017 - [info] Master 已关闭!Wed Aug 9 17:47:14 2017 - [info] 终止监控脚本。Wed Aug 9 17:47:47:14 2017 - [info] 退出代码 20 (Master dead)。Wed Aug 9 17:47:14 2017 - [info] MHA::MasterFailover 版本 0.57.Wed Aug 9 17:47:14 2017 - [info] 启动 master 故障转移.Wed Aug 9 17:47:14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] * 第 1 阶段:配置检查阶段..Wed Aug 9 17:47:14 2017 - [info] info ] 8 月 9 日星期三 17 日:47:14 2017 - [info] GTID 故障转移模式 = 1Wed Aug 9 17:47:14 2017 - [info] Dead Servers:Wed Aug 9 17:47:14 2017 - [info] MHA-M1(10.180.2.163:3306 )2017 年 8 月 9 日星期三 17:47:14 - [info] 通过 MySQL 检查主服务器的可达性(双重检查)...2017 年 8 月 9 日星期三 17:47:14 - [info] ok.2017 年 8 月 9 日星期三 17:47:14 - [info] 活动服务器:2017 年 8 月 9 日星期三 17:47:14 - [info] MHA-S1(10.180.2.164:3306) 2017 年 8 月 9 日星期三 17:47:14 - [info] MHA-S2(10.180.2.165 :3306)2017 年 8 月 9 日星期三 17:47:14 - [信息] 活着的奴隶:2017 年 8 月 9 日星期三 17:47:14 - [信息] MHA-S1(10.180.2.164:3306) 版本=5.7.18-log (从站之间最旧的主要版本) log-bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 从 M M1 (10.180.2.163:3306) Wed Aug 复制9 17:47:14 2017-[Info] 新大师的主要候选人(Candidate_master 已设置) Wed Aug 9 17:47:14 2017- [ Info] MHA -S2(10.180.2.165:3306) Version=5.7.18 -log(从站之间最旧的主要版本) log-bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug9 17:47:14 2017 - [info] 从 MHA-M1(10.180.2.163:3306) 复制 2017 年 8 月 9 日星期三 17:47:14 - [info] 启动基于 GTID 的故障转移。2017 年 8 月 9 日星期三 17:47:14 - [info] 2017 年 8 月 9 日星期三 17:47:14 - [info] ** 第 1 阶段:配置检查阶段已完成。 2017 年 8 月 9 日星期三 17:47:14 - [info] 2017 年 8 月 9 日星期三 17:47:14 - [info] * 第 2 阶段:死主关闭阶段..2017 年 8 月 9 日星期三 17:47:14 - [info] 2017 年 8 月 9 日星期三 17:47:14 - [info] 强制关闭,以便应用程序永远不会连接到当前主服务器..2017 年 8 月 9 日星期三 17:47:14 - [info] 执行主 IP 停用脚本:2017 年 8 月 9 日星期三 17:47:14 - [info] /usr/local/bin/master_ip_failover --orig_master_host=MHA-M1 - -orig_master_ip=10.180.2.163 --orig_master_port=3306 --command=stopssh --ssh_user=root 在脚本测试中====/sbin/ifconfig eth2:1 down==/sbin/ifconfig eth2:1 10.180.2.168/24 ===禁用旧主机上的VIP:MHA-M1 SIOCSIFFLAGS:无法分配请求的地址Wed Aug 9 17:47:14 2017- [Info] Done.Wed Aug 9 17:47:14 2017-[警告]未设置 Shutdown_Script。跳过明确关闭死亡 master.net 2017 年 8 月 9 日 17:47:14 - [信息] * 第 2 阶段:死亡大师关闭阶段已完成。2017 年 8 月 9 日星期三 17:47:14 - [信息] 8 月 9 日星期三 17: 47:14 2017 - [info] * 第 3 阶段:主恢复阶段..2017 年 8 月 9 日星期三 17:47:14 - [info] 2017 年 8 月 9 日星期三 17:47:14 - [info] * 第 3.1 阶段:获取最新的从站Phase..Wed Aug 9 17:47:14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] 所有从站上最新的二进制日志文件/位置是 3306-binlog.000003:194Wed Aug 9 17 :47:14 2017 - [info] 检索到的 Gtid 集:a5757eae-7981-11e7-82c7-005056b662d3:6-322 10Wed Aug 9 17: 47:14 2017 - [info] 最新从站(将中继日志文件接收到的从站)最新):2017 年 8 月 9 日星期三 17:47:14 - [信息] MHA-S1(10.180.2.164:3306) Version=5.7.18-log(从属设备之间最旧的主要版本)log-bin:enabledWed 8 月 9 日 17:47 :14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 从 MHA-M1(10.180.2.163:3306)Wed Aug 9 17:47:14 2017 复制 - [ info ] Primary c新Master的候选者(candidate_master已设置)Wed Aug 9 17:47:14 2017 - [info] MHA-S2(10.180.2.165:3306) Version=5.7.18-log(从属设备之间最旧的主要版本)log -bin :enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 复制自 MHA-M1(10.180.2.163:3306)Wed Aug 9 17:47:14 2017 - [info] 所有从站上最旧的二进制日志文件/位置是 3306-binlog.000003:194Wed Aug 9 17:47:14 2017 - [info] 检索到的 Gtid 集:a5757eae-7981-11e7-82c7-005056b662d3:6-32210Wed Aug 9 17:47: 14 2017 - [info] 最旧的奴隶:Wed Aug 9 17:47:14 2017 - [info] MHA-S1(10.180.2.164:3306) Version=5.7.18-log (之间最旧的主要版本Slaves) log-bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 从 MHA-M1(10.180.2.163:3306)Wed Aug 9 17 复制: 47:14 2017 - [info] 新 Master 的主要候选人(candidate_master 已设置) Wed Aug 9 17:47:14 2017 - [info] MHA-S2(10.180.2.165:3306) Version=5.7.18-log (之间最旧的主要版本een Slaves) log-bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 从 MHA-M1(10.180.2.163:3306)Wed Aug 9 17 复制:47:14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] * 阶段 3.3:确定新的主阶段..Wed Aug 9 17:47:14 2017 - [info] Wed Aug 9 17: 47:14 2017 - [info] 从奴隶中搜索新主人..Wed Aug 9 17:47:14 2017 - [info] 从配置文件中候选主人:Wed Aug 9 17:47:14 2017 - [info] MHA- S1(10.180.2.164:3306) Version=5.7.18-log (从站之间最旧的主要版本) log -bin:enabledWed Aug 9 17:47:14 2017 - [info] GTID ONWed Aug 9 17:47:14 2017 - [info] 复制自 MHA-M1(10.180.2.163:3306)Wed Aug 9 17:47:1 4 2017 - [info] 新 Master 的主要候选人(candidate_master 已设置)Wed Aug 9 17:47:14 2017 - [info] 非候选主站:Wed Aug 9 17:47:14 2017 - [info] 从已收到最新中继日志事件的候选主从机中搜索..Wed Aug 9 17:47:14 2017 - [info] 新桅杆呃是 MHA-S1(10.180.2.164:3306)Wed Aug 9 17:47:14 2017 - [info] 启动主故障转移。 .Wed Aug 9 17:47:14 2017 - [info] From:MHA-M1(10.180.2.163:3306) (当前主控) +--MHA-S1(10.180.2.164:3306) +--MHA-S2( 10.180.2.165:3306)至:MHA-S1(10.180.2.164:3306)(新主控)+--MHA-S2(10.180.2.165:3306)2017 年 8 月 9 日星期三 17:47:14 - [信息] 8 月星期三9 17:47:14 2017 - [info] * 阶段 3.3:新主恢复阶段..Wed Aug 9 17:47:14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] 等待所有日志待应用.. Wed Aug 9 17:47:14 2017 - [info] 完成。Wed Aug 9 17:47:14 2017 - [info] 获取新的 master 的 binlog 名称和位置..Wed Aug 9 17:47:14 2017 - [info] 3306-binlog.000003:61944788Wed Aug 9 17:47:14 2017 - [info] 所有其他从站应该从这里开始复制。语句应为:CHANGE MASTER TO MASTER_HOST =' MHA-S1 or 10.180.2.164', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';Wed Aug 9 17:47:14 2017 - [信息]主恢复成功。文件:Pos:Exec_Gtid_Set:3306-binlog.000003、61944788、1c2dc99f-7b57-11e7-a280-005056b665cb:1-2,a5757eae-7981-11e7-82c7-005056b662d3:1-3 22108 月 9 日星期三 7:47:14 2017 - [info] 执行主 IP 激活脚本:2017 年 8 月 9 日星期三 17:47:14 - [info] /usr/local/bin/master_ip_failover --command=start --ssh_user=root --orig_master_host=MHA-M1 - -orig_master_ip=10.180.2.163 - -orig_master_port=3306 --new_master_host=MHA-S1 --new_master_ip=10.180.2.164 --new_master_port=3306 --new_master_user='root' --new_master_password=xxx未知选项:new_master_user未知选项:new_master_passwordIN脚本测试====/sbin/ifconfig eth2:1 down==/sbin/ifconfig eth2:1 10.180.2.168/24===在新主机上启用 VIP - 10.180.2.168/24 - MHA -S1 Wed Aug 9 17 :47:14 2017 - [info] OK.Wed Aug 9 17:47:14 2017 - [info] 在 MHA-S1(10.180.2.164:3306)..Wed Aug 9 17:47:14 2017 设置 read_only=0 - [info] ok.Wed Aug 9 17:47:14 2017 - [info] ** 成功完成主恢复。Wed Aug 9 17:47:14 2017 - [info] * Phase 3:主恢复阶段已完成。2017 年 8 月 9 日星期三 17:47:14 - [info] 2017 年 8 月 9 日星期三 17:47:14 - [info] * 第 4 阶段:从属恢复阶段.. 8 月 9 日星期三 17:47: 14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] * 阶段 4.1:并行启动 Slaves..Wed Aug 9 17:47:14 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] -- 主机 MHA-S2 (10.180.2.165:306) 上的从属恢复已启动,PID: 18757。检查 tmp 日志 /var/log/masterha/ app1/mha-s2_3306_20170809174714。记录需要时间..wed Aug 97:47: 15 2017-[Info] WED Aug 9 17:47:15 2017 - [info] 记录来自 MHA-S2 的消息 ...Wed Aug 9 17:47:15 2017 - [info] Wed Aug 9 17:47:14 2017 - [info] 重置从属 MHA-S2(10.180.2.165:3306) 并开始从新主 MHA-S1(10.180.2.164 :3306) 进行复制..Wed Aug 9 17:47:14 2017 - [info] 执行变更主。2017 年 8 月 9 日星期三 17:47:15 - [info] 从属启动。2017 年 8 月 9 日星期三 17:47:15 - [info ] gtid_wait(1c2dc99f-7b57-11e7 -a280-005056b665cb:1-2,a5757eae-7981-11e7-82c7-005056b662d3:1-32210) 在 MHA-S2(10.180.2.165:33 06) 上完成。已执行 0 个事件。Wed Aug 9 17:47:15 2017 - [info] 来自 MHA-S2 的日志消息结束。Wed Aug 9 17:47:15 2017 - [info] -- 主机 MHA-S2 上的从属设备(10.180。 2.165:3306) 开始。2017 年 8 月 9 日星期三 17:47:15 - [信息] 所有新的从属服务器已成功恢复。2017 年 8 月 9 日星期三 17:47:15 - [信息] 2017 年 8 月 9 日星期三 17:47:15 - [ info] * 阶段 5:新主站清理阶段..2017 年 8 月 9 日星期三 17:47:15 - [info] 2017 年 8 月 9 日星期三 17:47:15 - [info] 重置新主站上的从属信息.. 8 月 9 日星期三17:47:15 2017 - [info] MHA-S1:重置从属信息成功。2017 年 8 月 9 日星期三 17:47:15 2017 - [info] 主故障转移到 MHA-S1(10.180.2.164: 3306) 成功完成。8 月星期三9 17:47:15 2017 - [info] 已从 /etc/mha/app1.cnf 中删除了 server1 条目。2017 年 8 月 9 日星期三 17:47:15 - [info] ----- 故障转移报告 ------ app1:MySQL Master 故障转移 MHA-M1(10.180 .2.163:3306) 到 MHA-S1(10.180.2.164:3306) 成功Master MHA-M1(10.180.2.163:3306) 已关闭!检查 MHA-S 上的 MHA 管理器日志2:/var/log/masterha/app1/manager。已启动自动(非交互式)故障转移。MHA-M1 上的主 IP 地址(10.180.2.163:3306)无效。选择 MHA-S1(10.180.2.164:3306) 作为新主服务器。MHA-S1(10.180. 2.164:3306): OK: 应用所有日志成功。MHA-S1(10.180.2.164:3306): OK: 激活主 IP 地址。MHA-S2(10.180.2.165:3306): OK: 从属启动,从 MHA 复制S1(10.180.2.164:3306)MHA-S1(10.180.2.164:3306):重置从属信息成功。主故障转移到 MHA-S1(10.180.2.164:3306) 成功完成。2017 年 8 月 9 日星期三 17:47:15 - [info] 发送邮件..未知选项:conf

以上是交换机的完整日志流程。我们可以看到,MHA切换主要经过以下几个步骤:

1.配置文件检查阶段,该阶段会检查整个集群的配置文件配置

2.宕机主控处理,此阶段包括虚拟IP移除l 操作,主机关机操作(这个我这里还没有实现,需要研究一下)

3.复制失效master和最新slave不同的relay log,保存到MHA Manger特定目录

4.识别具有最新更新的从站

5.应用从master保存的binlog事件

6.将从站提升为新的主站进行复制

7.让其他slave连接到新的master进行复制

注意:

1.切换后,你会发现MHA Manager监控程序自动死掉了。官网有如下解释和解决方案:

从daemontools运行MHA Manager当前MHA Manager进程不作为守护进程运行。如果故障转移成功完成或主进程被意外终止,管理器将停止工作。到作为守护进程 daemontool 运行。或者可以使用任何外部守护程序。下面是一个从daemontools运行的例子。

这里我们使用shell脚本来执行,这样监控程序就不会死掉

[root@MHA-S2 bin]# more经理.sh #! /bin/shnohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
< p>2。当你修复完死去的master后,想要重新加入现有的二节点MHA,也是可以的

老master:

root@localhost:mysql3306.sock [tt]>显示主状态\G**************************** * 1.行 ********************* ******** 文件: 3306-binlog.000004 位置: 194 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: a5757eae- 7981-11e7-82c7-005056b662d 3:1-322101 行集中(0.00 秒)

现有母版:

root @localhost:mysql3306.sock [tt]>显示主状态\G**************************** *** 1.行 ***** ********************** 文件:3306-binlog.000003 位置:61945043 Binlog_Do_DB:Binlog_Ignore_DB:Executed_Gtid_Set:1c2dc99f -7b57-11e7-a280-005056b665cb:1-3,a5757eae-7981-11e7-82c7-005056b662d3:1-322101 行集中(0.00 秒)

< /span>

因为有了GTID,我们可以直接切换到变更master,先对比一下数据:

老master:

root@localhost:mysql3306.sock [tt]>select * from t1;+----+-----+|编号 | c1 | +----+------+| 1 | a1 || 2 | a2 || 3 | a3 || 4 | a4 |+----+------+4 行(0.02 秒)

新master:

root@localhost:mysql3306.sock [tt]>select * from t1;+---- +------+|编号 | c1 |+----+- -----+| 1 | a1|| 2 | a2 || 3 | a3 || 4 | a4|| 5 | a5 |+----+------+

老master直接把master改成:

将 master 更改为 master_host='MHA-S1',master_user='repl',master_password='123456',master_port=3306 ,master_auto_position=1;

启动 Slave 查看输出:

root@localhost:mysql3306.sock [tt]>显示从属状态\G ************** ************** 1. 行 ************** **************** Slave_IO_State:等待主设备发送事件 Master_Host: MHA-S1 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: 3306-binlog.000003 Read_Master_Log_Pos: 61945043 Relay_Log_File: MHA-M1-relay-bin.000004 Relay_Log_Pos: 715 Relay_Master_Log _文件:3306-binlog.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes
< p>

查看数据是否会完成:

root@localhost:mysql3306.sock [tt]>select * from t1;+----+- -----+|编号 | c1 |+----+------+| 1 | a1 || 2 | a2 || 3 | a3 || 4 | a4|| 5 | a5 |+ ----+------+

发现数据已经补全,并且添加副本没有问题。

最后要修改app1.cnf添加server1

 [server1]hostname=MHA-M1port=3306
< p>重启监控程序,检查MHA状态

 [root@MHA-S2 tmp]# masterha_check_repl --conf =/etc/mha/app1.cnf Sat Aug 12 20:37:01 2017 - [info] 复制过滤检查正常。 2017 年 8 月 12 日星期六 20:37:01 - [错误][/usr/local/share/perl5/MHA/Server.pm, ln398] MHA-M1(10.180.2.163:3306): 用户 repl 不存在或不存在拥有 REPLICATION SLAVE 权限!其他从站无法从此主机开始复制。 2017 年 8 月 12 日星期六 20:37:01 - [错误][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] 检查配置时发生错误。在 /usr/local/share/perl5/MHA/ServerManager.pm 林e 1403 2017 年 8 月 12 日星期六 20:37:01 - [错误][/usr/local/share/perl5/MHA/MasterMonitor. pm, ln525] 监控服务器发生错误。 2017 年 8 月 12 日星期六 20:37:01 - [信息] 得到退出代码 1(不是主人死了)。

那里发现权限问题,请尽快修复:

MHA-M1:

set session sql_log_bin=OFF;将 *.* 上的复制从属授予由 '123456' 标识的 repl@'%';设置会话 sql_log_bin=ON;

再次执行 MHA 状态检查:

masterha_check_repl --conf=/etc/mha/app1.cnfSat Aug 12 20:41:14 2017 - [info] CheChecking 复制运行状况在 MHA-M1..Sat Aug 12 20:41:14 2017 - [info] ok.Sat Aug 12 20:41:14 2017 - [info] 检查 MHA-S2 上的复制运行状况..Sat Aug 12 20:41:14 2017 - [info] ok。 2017 年 8 月 12 日星期六 20:41:14 - [info] 检查 master_ip_failover_script 状态:2017 年 8 月 12 日星期六 20:41:14 - [info] /usr/local/bin/master_ip_failover - -command=status --ssh_user=root --orig_master_host=MHA-S1 --orig_master_ip=10.180.2.164 --orig_master_port=3306 脚本测试====/sbin/ifconfig eth2:1 down==/sbin/ifconfig eth2 :1 10.180.2.168/24= ==检查脚本的状态.. OK Sat Aug 12 20:41:15 2017 - [信息] OK.Sat Aug 12 20:41:15 2017 - [警告] shutdown_script 未定义。Sat Aug 12 20:41 :15 2017 - [info] 退出代码 0(不是 master 死亡)。MySQL 复制运行状况良好。

最后启动监控程序

[root@MHA-S2 bin]# nohup monitor.sh &[root @MHA-S2 bin]# masterha_check_status --conf=/etc/mha/app1.cnf app1 (pid :32084) is running(0:PING_OK), master:MHA-S1

(2)手动在线切换测试

很多情况下,现有的主服务器需要迁移到另一台服务器。例如主服务器硬件出现故障、RAID控制卡需要重建、主服务器移至性能更好的服务器等。mary服务器导致性能下降,导致停机至少无法写入数据。另外,阻塞或杀死当前正在运行的会话会导致Master与Master之间的数据不一致。 MHA提供快速切换和优雅的阻塞写入。这个切换过程只需要0.5-2s,期间不能写入数据。在许多情况下,0.5-2s 的阻塞写入是可以接受的。因此,切换主服务器不需要计划的维护时段。

MHA在线切换的大致流程:
1.检测复制设置并确定当前主服务器
2.确定新的主服务器
3. 阻止对当前主服务器的写入
4.等待所有从服务器赶上复制
5。授予写入新的主服务器服务器
6。重置从服务器

注意应用架构需要考虑以下两个问题在线切换时:

1.自动识别主从的问题(主机可能会切换)。如果采用VIP方式,这个问题基本上可以解决。

2.负载均衡问题(可以定义大概的读写比例以及每台机器可以承受的负载比例,当有一台机器离开集群时,需要考虑这个问题)

为了保证数据完全一致,以最快的时间完成切换,MHA在线切换必须满足以下条件才可以切换成功,否则切换会失败。

1.所有从属 IO 线程都在运行

2.所有从属 SQL 线程都在运行

strong>

3.所有显示从属状态的输出中的 Seconds_Behind_Master 参数小于或等于 running_updates_limit 秒。如果切换过程中没有指定running_updates_limit,则running_updates_limit 默认为 1 秒。

4.在master端,通过show processlist输出,没有更新花费的时间超过running_updates_limit秒。

在线切换步骤如下:

先停止监控程序

< pre>[root @MHA-S2 app1]# masterha_stop --conf=/etc/mha/app1.cnf 成功停止 app1。

修改 master_ip_online_change 脚本如下:

< span class="cnblogs_code_copy" >

[root@MHA-S2 bin]# more master_ip_online_change#!/usr/bin/env perl# 版权所有 (C) 2011 DeNA Co.,Ltd. ## 该程序是免费软件;您可以根据 # 自由软件基金会发布的 GNU 通用公共许可证条款重新分发和/或修改 # 它; livense 的版本 2,或#(由您选择)任何更高版本。 ## 分发此程序是为了希望它有用,#但没有任何保证; WIT Hote 甚至 #Merc 的默示保证适合特定目的的能力或适用性。有关更多详细信息,请参阅# GNU 通用公共许可证。## 您应该随此程序一起收到一份 GNU 通用公共许可证# 的副本;如果没有,请写信给自由软件# Foundation, Inc.,# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # 注意:这是一个示例脚本,并不完整。根据您的环境修改脚本。use strict;use warnings FATAL => 'all';use Getopt::Long;use MHA::DBHelper;use MHA::NodeUtil ;use Time::HiRes qw( sleep gettimeofday tv_interval );使用数据::Dumper;我的$_tstart;我的$_running_interval = 0.1;我的($command,$orig_master_host,$orig_master_ip,$orig_master_port,$orig_master_user,$new_master_host,$new_master_ip,$new_master_port,$new_master_user,);我的$vip = '10.180.2.168/19'; #虚拟IP my $key = "1 ";我的 $ ssh_start_vip = “/sbin/ifconfig eth2:$key $vip”;我的 $ssh_stop_vip = “/sbin/ifconfig eth2:$key down”;我的 $ssh_user = “root”;我的 $new_master_password='123456';我$orig_master_password ='123456';GetOptions( 'command=s' => \$command, #'ssh_user=s' => \$ssh_user, 'orig_master_host=s' => \$orig_master_host, 'orig_master_ip=s' => \ $orig_master_ip, 'orig_master_port=i' => \$orig_master_port, 'orig_master_user=s' => \$orig_master_user, #'orig_master _password=s' => \$orig_master_password, 'new_master_host=s' => \$new_master_host, ' new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, 'new_master_user=s' => \$new_ master_user, # 'new_master_password=s' => \$new_master_password,);exit &main( );sub current_time_us { my ( $sec, $microsec ) = gettimeofday();我的 $curdate = localtime($sec);返回 $curdate 。 ” “。 sprintf(“%06d”, $微秒); }sub sleep_until { 我的 $elapsed = tv_interval($_tstart); if ( $_running_interval > $elapsed ) { 睡眠( $_running_interval - $elapsed ); }}sub get_threads_util { 我的 $dbh = shift;我的 $my_connection_id = 转变;我的 $running_time_threshold = 转变;我的 $type = 转变; $running_time_threshold= 0 除非 ($running_time_threshold); $type = 0 除非 ($type);我的@线程;我的 $sth = $dbh->prepare("显示进程列表"); $sth->执行(); while ( 我的 $ref = $sth->fetchrow_hashref() ) { 我的 $id = $ref->{Id};我的 $user = $ref->{User};我的 $host = $ref-> {Host};我的 $command = $ref->{Command};我的 $state = $ref->{State};我的 $query_time = $ref->{时间};我的 $info = $ref->{Info}; $info =~ s/^\s*(.*? )\s*$/$1/ 如果已定义($info);下一个 if ( $my_connection_id == $id );接下来 if ( 已定义($query_time) && $query_time < $running_time_threshold );接下来 if ( Defined($command) && $command eq "Binlog Dump" );接下来 if ( Defined($user) && $user eq "系统用户" );接下来 if ( 定义($command) && $command eq "睡眠" && 定义($query_time) && $query_time >= 1); if ($type >= 1) { next if (define($command) && $command eq " Sleep" );接下来 if ( 已定义($command) && $command eq "Connect" ); } if ( $type >= 2 ) { next if ( Defined($info) && $info =~ m/^select/i );接下来 if ( 已定义($info) && $info =~ m/^show/i ); } 推@threads,$ref; } return @threads;}sub main { if ( $command eq "stop" ) { ## 优雅地终止当前 master 上的连接 # 1. 在新 master 上设置 read_only= 1 # 2. DROP USER 以便应用程序用户无法访问建立新连接 # 3. 在当前主机上设置 read_only= 1 # 4. 终止当前查询 # * 任何数据库访问失败都会导致脚本死亡。我的 $exit_code = 1 ; eval { ## 在新的 master 上设置 read_only=1 (以避免意外) my $new_master_handler = new MHA::DBHelper(); # args: 主机名、端口、用户、密码、raise_error(die_on_error)_or_not $new_master_handler -> connect( $new_master_ip, $new_master_port, $new_master_user, $new_master_password, 1);打印 current_time_us() 。 “在新主机上设置只读..”; $new_master_handler->enable_read_only(); if ( $new _master_handler->is_read_only() ) {                       print "ok.\n"; } else { die "失败!\n"; $new_master_handler->disconnect(); # 连接到orig master,有数据就死掉我的 $orig_master_ handler = new MHA:: DBHelper(); 发生基本错误$orig_master_handler->connect( $orig_master_ip, $orig_master_port, $orig_master_user, $orig_master_password, 1 ); ## 删除应用程序用户,以便没有人可以连接。预先禁用每个会话的二进制日志 #$orig_master_handler->disable_log_bin_local();以便当前连接可以退出我的 $time_until_read_only = 15; $_tstart = [gettimeofday];我的 @threads = get_threads_util( $orig_master_handler->{dbh}, $orig_master_handler->{connection_id}); while ( $time_until_read_only > 0 && $#threads >= 0 ) {   if ( $time_until_read_only % 5 == 0 ) { printf"%s 等待所有正在运行的 %d 线程断开连接..(最多 %d 毫秒)\n", current_time_us(), $#threads + 1, $time _until_read_only * 100; if ( $#threads < 5 ) { print Data::Dumper->new( [$_] )->Indent(0)->Terse(1)->Dump 。 "\n" foreach (@threads) ; bsp;} sleep_until(); $_tstart = [gettimeofday]; $time_until_read_only--; @threads = get_threads_util( $orig_master_handler->{dbh}, $orig_master_handler->{connection_id} ); } } ## 在当前 master 上设置 read_only=1 ,以便没有人(除了 SUPER)可以写入 print current_time_us() 。 “在原始主机上设置 read_only=1..”; $orig_master_handler->enable_read_only(); if ( $orig_master_handler->is_read_only() ) { 打印“确定。\n”; } else { die "失败!\n"; } ## 等待 M * 100 毫秒,以便当前更新查询可以完成我的 $time_until_kill_threads = 5; @threads = get_threads_util ( $orig_master_handler->{dbh}, $orig_master_handler->{connection_id} ); while ( $time_until_kill_threads > 0 && $#threads >= 0 ) { if ( $time_until_kill_threads % 5 == 0 ) { printf"%s 等待所有正在运行的 %d 个查询断开连接..(最多 %d 毫秒)\n", current_time_us(), $#threads + 1, $time_until_kill_threads * 100; #threads < 5 ) { print Data::Dumper->new( [$_] )->Indent(0)->简洁(1)->转储。 “\n” foreach (@threads); } } } 睡眠 p_until(); $_tstart = [gettimeofday]; $time_until_kill_threads--; @threads = get_threads_util( $orig_master_handler->{dbh},        $orig_master_handler->{connection_id}); \ n"; " "t;; $orig_master_handler->kill_threads(@threads) if ( $#threads >= 0 ); print current_time_us() . " 完成。\n"; #$orig_master_handler->enable_log_bin_local(); $ orig_master_handler->disconnect () ; exit $exit_code; } elsif ( $command eq "start" ) { ## 在新的 master 上激活 master ip # 1. 创建具有写入权限的应用用户 # 2. 如果需要,移动备份脚本 # 3 . 将新主站的 IP 注册到目录数据库# 即使激活可更新帐户/IP 失败,我们也不会返回错误,这样我们就不会中断从站的恢复。# 如果退出代码为 0 或 10,MHA 不会中止我的 $ exit_code = 10; eval { my $new_master_handler = new MHA::DBHelper();        # 参数:主机名、端口、用户、密码、raise_error_or_not $new_master_handler->connect( $new_master_ip, $new_master_port, $new_master_user, $new_master_password, 1); ## 在新的 master 上设置 read_only=0 #$new_master_handler->disable_log_bin_local();打印 current_time_us( ) 。 " 在新主机上设置 read_only=0。\n"; $new_master_handler->disable_read_only(); ## 在新的 master 上创建应用程序用户 #print current_time_us() 。 “在新主服务器上创建应用程序用户..\n”; #FIXME_xxx_create_app_user($new_master_handler); "在新主服务器上启用 VIP - $vip - $new_master_host \n";退出$exit_code; } 退出 $exit_code; } elsif ( $command eq "status" ) { # 不执行任何操作 exit 0; } else { &usage(); 1号出口; }}# 一个简单的系统调用,在新的主子节点上启用 V IP start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip\"`;}# 一个简单的系统调用,禁用 old_mastersub stop_vip() { `ssh $ssh_user\@$orig_master_host \" $ ssh_stop_vip \"`;}sub 用法 { print"Usage: master_ip_online_change --command=启动|停止|状态 --orig_master_host=主机 --orig_master_ip=ip --orig_master_port=端口 --new_master_host=主机 --new_master_ip=ip --new_master_port=端口\n"; die;}
< p>< span class="cnblogs_code_copy">

执行开关

[root@MHA-S2 tmp]# masterha_master_switch --conf=/etc/mha/app1 .cnf - -master_state=alive --new_master_host=MHA-M1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

参数含义:

--orig_master_is_new_slave 切换时添加该参数,会将原master变成slave节点,如果不添加该参数,原master将不会启动

--running_updates_limit=10000,故障切换时,如果有候选主机有延迟,mha 交换机不能成功的。添加该参数表示可以在这个时间范围内切换延时(单位为s),但切换的时长由恢复时relay log的大小决定

查看每台机器的状态切换后:

S2:

root@localhost: mysql3306.sock [tt]>显示从属状态\G ****************************** 1. 行************ **************** Slave_IO_State:等待主机发送事件 Master_Host:MHA-M1 Master_User:repl                Master_Port:3306          Connect_Retry:60                             Master_Log_File:3306-binlog.0000 04    ile: 3306-binlog.000004 Slave_IO_Running: 是 Slave_SQL_Running: 是

S1:

root@localhost:mysql3306.sock [tt]>显示从属状态 \G******************** ********** 1. 行 ************************** Slave_IO_State: 等待 ma发送事件 Master_Host: MHA-M1 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: 3306-binlog .000004 Read_Master_Log_Pos: 748 Relay_Log_File: MHA-S1-relay-bin.000002                                                                                                                                                                                                                        Slave_SQL_Running:是

< span class="cnblogs_code_copy">

M1:

root@localhost:mysql3306.sock [tt]>显示从属状态\GE空集(0.00 秒)

在线切换日志:

[root@MHA-S2 tmp]# more sw.log [root @MHA-S2 bin]# masterha_master_switch --conf= /etc/mha/app1.cnf --master_state=alive --new_master_host=MHA-M1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000Sat 8 月 12 日 21:34 :54 2017 - [信息] MHA::MasterRotate 版本 0.57.Sat Aug 12 21:34:54 2017 - [信息]启动在线主开关..Sat Aug 12 21:34:54 2017 - [info] Sat Aug 12 21:34:54 2017 - [info] * 第 1 阶段:配置检查阶段..Sat Aug 12 21:34:54 2017 - [info] Sat Aug 12 21:34:54 2017 - [警告] 未找到全局配置文件 /etc/masterha_default.cnf。 Skipping.Sat Aug 12 21:34:54 2017 - [info] 从 /etc/mha/app1.cnf 读取应用程序默认配置..Sat Aug 12 21:34: 54 2017 - [info] 从 /etc/ 读取服务器配置mha/app1.cnf..Sat Aug 12 21:34:54 2017 - [info] GTID 故障转移模式 = 1Sat Aug 12 21:34:54 2017 - [info] 当前活跃主控:MHA-S1(10.180.2.164:3306 )2017 年 8 月 12 日星期六 21:34:54 - [信息] ] 活着的奴隶:2017 年 8 月 12 日星期六 21:34:54 - [信息] MHA-M1(10.180.2.163:3306) 版本=5.7.18-log(最旧)从站之间的主要版本) log-bin:enabledSat Aug 12 21: 34:54 2017 - [info] GTID ONSat Aug 12 21:34:54 2017 - [info] 从 MHA-S1(10.180.2.164:3306)Sat Aug 复制12 21:34:54 2017 - [info] MHA -S2 (10.180.2.165:3306) Version=5.7.18-log (最旧的 m从站之间的主要版本) log-bin:enabledSat Aug 12 21:34:54 2017 - [info] GTID ONSat Aug 12 21:34:54 2017 - [info] 从 MHA-S1 复制(10.180.2.164:3306)它是最好在切换之前在主服务器上执行FLUSH NO_WRITE_TO_BINLOG TABLES。在MHA-S1(10.180.2.164:3306)上执行可以吗? (是/否):是Sat Aug 12 21:35:07 2017 - [info] 执行 FLUSH NO_WRITE_TO_BINLOG TABLES。这可能需要很长时间.. 2017 年 8 月 12 日星期六 21:35:07 - [info] 好的。 2017 年 8 月 12 日星期六 21:35:07 - [信息] 检查 MHA 未监控或执行故障转移。2017 年 8 月 12 日星期六 21:35:07 - [信息] 检查 MHA-M1 上的复制运行状况。21 月 12 日星期六: 35:07 2017 - [info] ok.Sat Aug 12 21:35:07 2017 - [info] 检查 MHA-S2 上的复制运行状况..Sat Aug 12 21:35 :07 2017 - [info] ok.Sat Aug 12 21:35:07 2017 - [info] MHA-M1 可以成为新的 master。Sat Aug 12 21:35:07 2017 - [info] From:MHA-S1(10.180 .2.164:3306) (当前 master) +-- MHA-M1(10.180.2.163:3306) +--MHA-S2(10.180.2.165:3306)至:MHA-M1(10.180.2.163:3306)(新质量之三) +--MHA-S2(10.180.2.165:3306) +--MHA-S1(10.180.2.164:3306)启动从MHA-S1(10.180.2.164:3306)到MHA-M1(10.180.2.163)的总开关:3306)? (是/否):是Sat Aug 12 21:35:15 2017 - [info] 检查 MHA-M1(10.180.2.163:3306) 是否适合新主人..Sat Aug 12 21:35:15 2017 - [信息] ok.Sat Aug 12 21:35:15 2017 - [信息] MHA-S1(10.180.2.164:3306):显示从站状态返回空结果。要检查复制过滤规则,请临时对虚拟主机执行 CHANGE MASTER。2017 年 8 月 12 日星期六 21:35:15 - [info] MHA-S1(10.180.2.164:3306):重置指向虚拟主机的从站。8 月 12 日星期六2017 年 21:35:15 - [info] ** 第 1 阶段:配置检查阶段已完成。2017 年 8 月 12 日星期六 21:35:15 - [info] 2017 年 8 月 12 日星期六 21:35:15 - [info ] * 第 2 阶段:拒绝更新 Phase..Sat Aug 12 21:35:15 2017 - [info] Sat Aug 12 21:35:15 2017 - [info] 执行 master ip 在线更改脚本以禁用当前 master 上的写入:Sat Aug 12 21: 35:15 2017 - [信息] /usr/local/bin/master_ip_online_change --command=stop --orig_master_host=MHA-S1 --orig_master_ip=10.180.2.164 --orig_master_port=3306 --orig_master_user='root' --new_master_host=MHA-M1 --new_master_ip=10.180 .2.163 --new_master_port=第3306章未知选项:new_master_passwordSat 8 月 12 日 21 日: 35:15 2017 568580 在新的 master 上设置 read_only .. ok.Sat Aug 12 21:35:15 2017 573508 等待所有正在运行的 2 个线程断开连接.. (最大 1500 毫秒){'Time ' => '272878',' Command' => 'Binlog Dump GTID','db' => undef,'Id' => '40','Info' => undef,'User' => 'repl', 'State' => 'Master 有将所有binlog发送到slave;等待更多更新','Host' => 'MHA-S2:46970'}{'Time' => '3738','Command' => 'Binlog Dump GTID','db' =>undef,'Id' => '55','Info' => undef,'User' => 'repl','State' => 'Master 已将所有 binlog 发送到 Slave;等待更多更新','Host' => 'MHA-M1:51506'}Sat Aug 12 21:35:16 2017 075020 等待所有正在运行的 2 个线程断开连接..(最长 1000 毫秒){'Time' => ' 272879','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '40','Info' => undef,'User' => 'repl','State' = > 'Master已将所有binlog发送给slave;等待更多更新','Host' => 'MHA-S2:46970'}{'Time' => '3739','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '55','Info' => undef,'User' => 'repl','State' => 'Master 已将所有 binlog 发送到 Slave;等待更多更新','Host' => 'MHA-M1:51506'}Sat Aug 12 21:35:16 2017 576059 等待所有正在运行的 2 个线程断开连接..(最长 500 毫秒){'Time' => ' 272879','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '40','Info' => undef,'User' => 'repl','State' = > 'Master已将所有binlog发送给slave;等待更多更新','主机' => 'MHA-S2:46970'}{'时间'=> '3739','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '55','Info' => undef,'User' => 'repl',' State' => 'Master已将所有binlog发送给slave;等待更多更新',' Host' => 'MHA-M1:51506'}Sat Aug 12 21:35:17 2017 076940 在原始主机上设置 read_only=1.. 好的。Sat Aug 12 21:35:17 2017 079645 等待所有正在运行的 2 个查询断开连接..(最长 500 毫秒){'Time' => '272880','Command' => 'Binlog Dump GTID','db' => undef,'Id' => '40 ','Info' => undef,'User' => 'repl','State' => 'Master已将所有binlog发送到slave;等待更多更新','Host' => 'MHA-S2:46970'}{'Time' => '3740','Command' => 'Binlog Dump GTID', 'db' => undef,'Id' => '55','Info' => undef,'User' => 'repl','State' => 'Master 已将所有 binlog 发送到 Slave;正在等待更多更新 ','Host' => 'MHA-M1:51506'}在旧主服务器上禁用 VIP:MHA-S1 Sat Aug 12 21:35:17 2017 683769 杀死所有应用程序线程..Sat Aug 12 21: 35:17 2017 686090 完成。2017 年 8 月 12 日星期六 21:35:17 - [信息] 好的。8 月 1 日星期六2 21 : 35:17 2017 - [info] 锁定原始主机上的所有表以拒绝来自每个人(包括 root)的更新:2017 年 8 月 12 日星期六 21:35:17 - [info] 执行带有读锁的刷新表..星期六2017年8月12日21:35:17 - [info] ok.Sat Aug 12 21:35:17 2017 - [info] Orig master binlog:pos is 3306-binlog.000003:61945043.Sat Aug 12 21:35:17 2017 - [info] ] 等待执行 MHA-M1(10.180.2.163:3306)..Sat Aug 12 21:35:17 2017 - [info] master_pos_wait(3306-binlog.000003:61945043) 在 MHA 上完成-M1(10.180.2.163:3306)。执行了 0 个事件。Sat Aug 12 21 : 35:17 2017 - [info] 完成。Sat Aug 12 21:35:17 2017 - [info] 获取新的 master 的 binlog 名称和位置..Sat Aug 12 21:35:17 2017 - [info] 3306-binlog.000004 :748Sat Aug 12 21:35:17 2017 - [info] 所有其他从站应该从这里开始复制。语句应为:CHANGE MASTER TO MASTER_HOST='MHA-M1 or 10.180.2.163', MASTER_PORT=3306, MASTER_AUTO_POSITION =1, MASTER_USER='repl', MASTER_PASSWORD='xxx';Sat Aug 12 21:35:17 2017 - [info] 执行 master ip 在线更改脚本以允许在新 master 上写入:Sat Aug 12 21:35:17 2017 - [info] /usr/local/bin/master_ip_online_change --command=start --orig_master_host = MHA-S1 --orig_master_ip=10.180.2.164 --orig_master_port=3306 --orig_master_user='root' --new_master_host=MHA-M1 --new_master_ip=10.180.2.163 --new_master_port=3306 --new_master_user='root' - - orig_master_ssh_user=root --new_master_ssh_user=root --orig_master_is_new_slave --orig_master_password=xxx --new_master_password=xxx未知选项:orig_master_ssh_userUnknown 选项:new_master_ssh_userUnknown 选项:orig_master_is_new_slaveUnknown 选项:或 ig_master_passwordUnknown 选项:new_master_passwordSat 12 21:35:17 2017 865209 设置只读= 0 在新主机上。在新主机上启用 VIP - 10.180.2.168/19 - MHA-M1 2017 年 8 月 12 日星期六 21:35:17 - [信息] ok.2017 年 8 月 12 日星期六 21:35:17 - [信息] Sat Aug 12 21:35:17 2017 - [info] * 并行切换从属..Sat Aug 12 21:35:17 2017 - [info] Sat Aug 12 21:35: 17 2017 - [info] -- 主机 MHA-S2(10.180.2.165:3306) 上的从属开关启动,pid: 2327Sat Aug 12 21:35:17 2017 - [info] Sat Aug 12 21:35:18 2017 - [ info] 来自 MHA-S2 的日志消息...2017 年 8 月 12 日星期六 21:35:18 - [info] 2017 年 8 月 12 日 21:35:18 星期六 - [info] 等待执行所有MHA-S2 上的中继日志(10.180.2.165:3306)..2017 年 8 月 12 日星期六 21:35:18 - [info] master_pos_wait(3306-binlog.000003:61945043) 在 MHA-S2(10.180.2.165:3306) 上完成。已执行 0 个事件。2017 年 8 月 12 日星期六 21:35:18 - [info] 完成。2017 年 8 月 12 日星期六 21:35:18 - [info] 重置从属 MHA-S2(10.180.2.165:3306) 并从新的开始复制master MHA-M1(10.180.2.163:3306)..Sat Aug 12 21:35:18 2017 - [info] 执行变更 MASTER.Sat Aug 12 21:35:18 2017 - [info] Slave started.Sat Aug 12 21 :35:18 2017 - [info] 来自 MHA-S2 的日志消息结束 ...Sat Aug 12 21:35:18 2017 - [info] Sat Aug 12 21:35:18 2017 - [info] -- 从机切换在主机 MHA-S2(10.180.2.165:3306) 上成功。2017 年 8 月 12 日星期六 21:35:18 - [info] 解锁原始主机上的所有表:Sat Aug 12 21:35:18 2017 - [info] 执行 UNLOCK TABLES..Sat Aug 12 21:35:18 2017 - [info] ok.Sat Aug 12 21:35: 18 2017 - [info] 启动 orig master 作为新的从属..Sat Aug 12 21:35:18 2017 - [info] 重置从属 MHA-S1(10.180.2.164: 3306) 并从新的主控 MHA-M1 开始复制(10.180.2.163:3306)..2017 年 8 月 12 日星期六 21:35:18 - [信息] 执行变更主。2017 年 8 月 12 日星期六 21:35:19 - [信息] 从属启动。8 月 12 日星期六 21:35:19 2017 - [info] 所有新的从服务器切换成功。Sat Aug 12 21: 35:19 2017 - [info] Sat Aug 12 21:35:19 2017 - [info] * 第 5 阶段:新主清理阶段..Sat Aug 12 21:35:19 2017 - [info] Sat Aug 12 21:35 :19 2017 - [info] MHA-M1:重置从属信息成功。Sat Aug 12 21:35:19 2017 - [info] 将主机切换到 MHA -M1(10.180.2.163:3306) 成功完成。

感谢您仔细阅读本文。希望小编多多指教重读《MySQL高可用架构MHA原理分析》这篇文章对大家有帮助。也希望大家支持、关注行业信息频道。更多相关知识等待您学习!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > MySQL高可用架构MHA原理分析

用户评论