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); p> (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 "" 安装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他的软件是留给我们自己开发的。如果启用了下面任意一个脚本对应的参数,并且不修改这里对应的脚本,就会抛出错误,我被骗得很惨了) 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 以上就是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 pre> 修改 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"> p> M1: root@localhost:mysql3306.sock [tt]>显示从属状态\GE空集(0.00 秒) pre> |
感谢您仔细阅读本文。希望小编多多指教重读《MySQL高可用架构MHA原理分析》这篇文章对大家有帮助。也希望大家支持、关注行业信息频道。更多相关知识等待您学习!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > MySQL高可用架构MHA原理分析