目录
1、案例概述
■ 传统的MySQL主从架构存在的问题
● 单点故障
1.1、MHA概述(基于一主多从架构,最少一主两从)
■ 一套优秀的MySQL高可用环境下故障切换和主从复制的软件
■ MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换
■ MHA的组成
● MHA Manager (管理节点)
● MHA Node (数据节点)
■ MHA特点
● 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
● 使用半同步复制,可以大大降低数据丢失的风险
● 目前MHA支持一主多从架构, 最少三台服务,即一主两从
2、案例分析
1、实验思路:
2、MHA架构
3、数据库安装
4、一主两从
5、MHA搭建
6、故障模拟
7、主库失效
8、备选主库成为主库
9、从库2将备选主库指向为主库
9、故障修复
10、坏库修复,启动
11、在修复好的库上建立新主从关系
12、修改manager配置文件,添加修好的库的记录
12、重启mha
2.2、本案例环境
1、服务器 CentOS7.3(64 位) MHA-manager/192.168.8.100
管理节点,安装 manager 组件
服务器 CentOS7.3(64 位) Mysql1/192.168.8.134 Master 节点,安装 node 组件
服务器 CentOS7.3(64 位) Mysql2/192.168.8.136 Slave 节点,安装 node 组件
服务器 CentOS7.3(64 位) Mysql3/192.168.8.139 Slave 节点,安装 node 组件
本实例中用到 MYSQL 版本请从官网进行下载,MHA 的版本请从一些相关资源进行下
载,因为 google 官网上面最新的还是 2012 年 0.55 版本,而且 0.55 版本只支持到 CentOS6,
这里操作系统是 CentOS7 版本,所以这里下载 MHA 版本是 0.57 版本
2.3、 案例需求
本案例要求通过 MHA 监控 MySQL 数据库在故障时进行自动切换,不影响业务
2.4、拓扑图
2.5、实验步骤
2.5.1、开启三台数据库服务器所有会话功能,安装数据库
放入 cmake-2.8.6.tar.gz mysql-5.6.36.tar.gz软件包
[root@mysql-server ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install #安装编译依赖的环境
[root@mysql-server ~]# tar zxvf cmake-2.8.6.tar.gz #解压缩
[root@mysql-server ~]# cd cmake-2.8.6
[root@mysql-server cmake-2.8.6]# ./configure #设置配置
[root@mysql-server cmake-2.8.6]# gmake && gmake install #安装 gmake 编译软件
[root@mysql-server cmake-2.8.6]# cd
[root@mysql-server ~]# tar -zxvf mysql-5.6.36.tar.gz #解压缩
[root@mysql-server ~]# cd mysql-5.6.36
[root@mysql-server mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc #设置安装路径
[root@mysql-server mysql-5.6.36]# make && make install #编译安装
[root@mysql-server mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? yes
[root@mysql-server mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@mysql-server mysql-5.6.36]# cd
[root@mysql-server ~]# chmod +x /etc/rc.d/init.d/mysqld #添加权限
[root@mysql-server ~]# chkconfig --add mysqld #加入系统管理
[root@mysql-server ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile #设置环境变量
[root@mysql-server ~]# source /etc/profile #立即执行变量
[root@mysql-server ~]# groupadd mysql #加入mysql组
[root@mysql-server ~]# useradd -M -s /sbin/nologin mysql -g mysql #创建不可登录,没有宿主的目录
[root@mysql-server ~]# chown -R mysql.mysql /usr/local/mysql #添加权限
[root@mysql-server ~]# mkdir -p /data/mysql #创建目录
[root@mysql-server ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
2.5.2.1、关闭所有会话功能,进入主数据库配置文件
[root@mysql-server ~]# vi /etc/my.cnf #删除所有,重新配置
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1 #设置服务器ID
log_bin = master-bin #同步的二进制日志开启前缀
log-slave-updates = true #允许日志同步给从数据库
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
2.5.2.2、进入从数据库配置文件
[root@mysql-slave1 ~]# vi /etc/my.cnf #删除所有,重新配置
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 2 #服务id为2,不能重复
log_bin = master-bin #同步的二进制日志开启前缀
relay-log = relay-log-bin #二进制日志的中继日志前缀
relay-log-index = slave-relay-bin.index #中继日志索引
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
[root@mysql-slave2 ~]# vi /etc/my.cnf #删除所有,重新配置
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 3
log_bin = master-bin #同步的二进制日志开启前缀
relay-log = relay-log-bin #二进制日志的中继日志前缀
relay-log-index = slave-relay-bin.index #中继日志索引
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
2.5.3、为所有数据库创建软连接软链接是为 HMA 服务的
[root@mysql-server ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql-server ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
[root@mysql-server ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
mysql #登录数据库
mysql> set password for root@localhost = password('123456'); #为所有数据库设置密码
2.5.4、启动所有数据库
[root@mysql-server ~]# service mysqld restart
[root@mysql-slave1 ~]# service mysqld restart
[root@mysql-slave2 ~]# service mysqld restart
2.5.5、部署主从同步
[root@mysql-server ~]# mysql -uroot -p123456 #进入主数据库
mysql> grant replication slave on *.* to 'myslave'@'192.168.140.%' identified by '123456'; #授予所有库权限
mysql> grant replication slave on *.* to 'myslave'@'192.168.140.%' identified by 'manager'; #授予MHA-manager权限
mysql> flush privileges; #刷新权限
mysql> exit #退出数据库
[root@mysql-server ~]# systemctl restart mysqld #重启服务
[root@mysql-server ~]# netstat -anpt | grep 3306 #查看端口信息
[root@mysql-slave1 ~]# mysql -uroot -p123456 #进入slave1
mysql> grant replication slave on *.* to 'myslave'@'192.168.140.%' identified by '123456';
mysql> grant replication slave on *.* to 'myslave'@'192.168.140.%' identified by 'manager';
mysql> flush privileges;
mysql> exit
[root@mysql-slave1 ~]# systemctl restart mysqld
[root@mysql-slave1 ~]# netstat -anpt | grep 3306
[root@mysql-slave2 ~]# mysql -uroot -p123456 #进入slave2
mysql> grant replication slave on *.* to 'myslave'@'192.168.140.%' identified by '123456';
mysql> grant replication slave on *.* to 'myslave'@'192.168.140.%' identified by 'manager';
mysql> flush privileges;
mysql> exit
[root@mysql-slave2 ~]# systemctl restart mysqld
[root@mysql-slave2 ~]# netstat -anpt | grep 3306
2.5.5.1、进入主数据库上查看二进制文件和同步点
[root@mysql-server ~]# mysql -uroot -p123456 #进入数据库
mysql> show master status; #查看主数据库状态
2.5.2.2、进入从数据库设置主从同步查看效果
[root@mysql-slave1 ~]# mysql -uroot -p123456
mysql> change master to master_host='192.168.140.40',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=120;
mysql> start slave;
mysql> show slave status\G
[root@mysql-slave2 ~]# mysql -uroot -p123456
mysql> change master to master_host='192.168.140.40',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=120;
mysql> start slave;
mysql> show slave status\G
2.5.2.3、进入从数据库设置只读,主数据库插入数据,主从同步查看效果
mysql> set global read_only=1;
#两个从数据库设置全局变量read_only=1,为只读,普通用户无法在从数据库上写数据,超级用户仍然可以操作(当备选主变为主时,自动 read_only=0)
mysql> create database bbb; #进入主数据库,创建'bbb'数据库
mysql> show databases; #查看数据库
mysql> show databases; #进入slave1查看数据库
mysql> show databases; #进入slave2查看数据库
主从同步完成总结:如需设置为只读状态,将该read_only参数设置为1或TRUE状态,但设置 read_only=1 状态有两个需要注意的地方:
-
read_only=1只读模式,不会影响slave同步复制的功能,所以在MySQL slave库中设定了read_only=1后,通过"show slave status\G" 命令查看salve状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致;
-
read_only=1只读模式,限定的是普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作 (但是如果设置了"super_read_only=on", 则就会限定具有super权限的用户的数据修改操作了);在MySQL中设read_only=1后,普通的应用用户进行insert、update、delete等会产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数据变化的错误,但具有super权限的用户,例如在本地或远程通过root用户登录到数据库,还是可以进行数据变化的DML操作;(也就是说"real_only"只会禁止普通用户权限的mysql写操作,不能限制super权限用户的写操作; 如果要想连super权限用户的写操作也禁止,就使用"flush tables with read lock;",这样设置也会阻止主从同步复制!)这样通过 设置“read_only=1”和“flush tables with read lock;”两条命令,就可以确保数据库处于只读模式,不会发生任何数据改变,在MySQL进行数据库迁移时,限定master主库不能有任何数据变化,就可以通过这种方式来设定。
2.6、安装配置MHA
注:首先在所有设备上添加软件包, 所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源,添加CentOS7-Base-163.repo、epel.repo
添加安装包
mha4mysql-node-0.57.tar.gz
在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,
因为 manager 依赖 node 组件,下面都是在 Mysql1 上操作演示安装 node 组件
2.6.1、开启同步会话,所有服务器放入安装包
CentOS7-Base-163.repo、epel.repo、mha4mysql-node-0.57.tar.gz安装包,在mha-manager上额外添加mha4mysql-manager-0.57.tar.gz
[root@mysql-server ~]# cd /etc/yum.repos.d/
[root@mysql-server yum.repos.d]# ls -lh
[root@mysql-server yum.repos.d]# cd
[root@mysql-server ~]# yum install epel-release --nogpgcheck
[root@mysql-server ~]# yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPANr perl-ExtUtils-MakeMaker perl
[root@mysql-server ~]# tar zxvf mha4mysql-node-0.57.tar.gz #解压缩安装node节点
[root@mysql-server ~]# cd mha4mysql-node-0.57/
[root@mysql-server mha4mysql-node-0.57]# perl Makefile.PL #执行安装配置文件
报错信息:
解决:
[root@mysql-server mha4mysql-node-0.57]# cd
[root@mysql-server ~]# yum install perl-CPAN #重新安装 perl-CPAN
[root@mysql-server ~]# cd mha4mysql-node-0.57/
[root@mysql-server mha4mysql-node-0.57]# perl Makefile.PL
[root@mysql-server mha4mysql-node-0.57]# make && make install #编译安装
2.6.1.1、关闭同步会话,在mha-manager上额外添加mha4mysql-manager-0.57.tar.gz
[root@mha-manager mha4mysql-node-0.57]# cd
[root@mha-manager ~]# tar zxvf mha4mysql-manager-0.57.tar.gz #解压缩
[root@mha-manager ~]# cd mha4mysql-manager-0.57/
[root@mha-manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@mha-manager mha4mysql-manager-0.57]# make && make install
[root@mha-manager mha4mysql-manager-0.57]# cd /usr/local/bin/
[root@mha-manager bin]# ls -lh
注:manager 安装后在/usr/local/bin 下面会生成几个工具
masterha_check_ssh 检查MHA的SSH配置状况,ssh的健康检查,登录数据库
masterha_check_repl 检查MySQL复制状况,主从复制
masterha_manger 启动manager的脚本
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的 server信息
masterha_stop 关闭manager
注:node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHA Manager 的脚本触发,无需人为操作)
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave(半同步复制,有超前日志,会先同步给其它slave)
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)(防止回滚,日志重复)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
2.6.2、配置无密码认证,免密(在 manager 上配置到所有节点的无密码认证,监控所有节点)
[root@mha-manager bin]# cd
[root@mha-manager ~]# ssh-keygen -t rsa #生成密钥
[root@mha-manager ~]# ssh-copy-id 192.168.140.40 #免密登录
[root@mha-manager ~]# ssh-copy-id 192.168.140.50 #免密登录
[root@mha-manager ~]# ssh-copy-id 192.168.140.60 #免密登录
[root@mha-manager ~]# ssh root@192.168.140.40 #登录验证
[root@mysql-server ~]# exit
[root@mha-manager ~]# ssh root@192.168.140.50 #登录验证
[root@mysql-server ~]# exit
[root@mha-manager ~]# ssh root@192.168.140.60 #登录验证
[root@mysql-server ~]# exit
免密登录总结:
因为主从关系可能会失效,保证故障自动切换,由此数据库之间需要实现相互免密可以登录,切换
2.6.3、主数据库对从1和从2进行授权,并登录验证
[root@mysql-server mha4mysql-node-0.57]# cd
[root@mysql-server ~]# ssh-keygen -t rsa #生成密钥
[root@mysql-server ~]# ssh-copy-id 192.168.140.50 #授予从1密钥
[root@mysql-server ~]# ssh-copy-id 192.168.140.60 #授予从2密钥
[root@mysql-server ~]# ssh root@192.168.140.50 #登录验证
[root@mysql-slave1 ~]# exit
[root@mysql-server ~]# ssh root@192.168.140.60 #登录验证
[root@mysql-slave2 ~]# exit
2.6.3.1、slave1对主数据库和slave2进行授权,并登录验证
[root@mysql-slave1 mha4mysql-node-0.57]# cd
[root@mysql-slave1 ~]# ssh-keygen -t rsa
[root@mysql-slave1 ~]# ssh-copy-id 192.168.140.40
[root@mysql-slave1 ~]# ssh-copy-id 192.168.140.60
[root@mysql-slave1 ~]# ssh root@192.168.140.40
[root@mysql-server ~]# exit
[root@mysql-slave1 ~]# ssh root@192.168.140.60
[root@mysql-server ~]# exit
2.6.3.2、slave2对主数据库和slave1进行授权,并登录验证
[root@mysql-slave2 mha4mysql-node-0.57]# cd
[root@mysql-slave2 ~]# ssh-keygen -t rsa
[root@mysql-slave2 ~]# ssh-copy-id 192.168.140.40
[root@mysql-slave2 ~]# ssh-copy-id 192.168.140.50
[root@mysql-slave2 ~]# ssh root@192.168.140.40
[root@mysql-server ~]# exit
[root@mysql-slave2 ~]# ssh root@192.168.140.50
[root@mysql-server ~]# exit
2.6.4、配置 MHA
2.6.4.1、 manager 节点配置
在 manager 节点上复制相关脚本到/usr/local/bin 目录
master_ip_failover #自动切换时 VIP 管理的脚本,当master出现故障时,实现故障自动转移,拷贝相关脚本到 /usr/local/bin/目录下
[root@mha-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin/
[root@mha-manager ~]# cd /usr/local/bin/
[root@mha-manager bin]# ls -lh #查看脚本
[root@mha-manager bin]# cd scripts/
[root@mha-manager scripts]# ls -lh #查看脚本内容
注:
master_ip_online_change #在线切换时 vip 的管理
power_manager #故障发生后关闭主机的脚本
send_report #因故障切换后发送报警的脚本
2.6.4.2、复制管理脚本
复制上述的自动切换时 VIP 管理的脚本到/usr/local/bin 目录,这里使用脚本管理 VIP虚拟地址,也是推荐的一种方式,生产环境不太建议使用 keepalived
[root@mha-manager scripts]# cp master_ip_failover /usr/local/bin/
[root@mha-manager scripts]# ls -lh
[root@mha-manager ~]# cd /usr/local/bin/
[root@mha-manager bin]# ls -lh
2.6.4.3、修改自动切换脚本内容
[root@mha-manager bin]# vi master_ip_failover
#master_ip_failover:使用情况为,主master失效时使用,自动切换脚本
删除所有
复制引用模板(先定义,后调用)
添加部分
my $vip = '192.168.140.200'; 虚拟地址
my $brdc = '192.168.140.255'; 广播地址
my $ifdev = 'ens33'; 网卡
my $key = '1'; 设置虚拟地址时ens33:1
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; 设置虚拟地址
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; 虚拟地址移除
my $exit_code = 0; 退出代码
2.6.4.4、创建 MHA 软件目录并拷贝配置文件
注:
每次健康检查时,定义谁为备选主,数据库基本信息所在,都是以该配置文件为依据
[root@mha-manager bin]# cd
[root@mha-manager ~]# mkdir /etc/mha #创建mha目录
[root@mha-manager ~]# cp mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/mha/
[root@mha-manager ~]# vi /etc/mha/app1.cnf #编辑配置文件
[server default] 默认配置
manager_workdir=/var/log/masterha/app1 工作目录
manager_log=/var/log/masterha/app1/manager.log 管理日志文件路径
master_binlog_dir=/usr/local/mysql/data 二进制日志文件路径
master_ip_failover_script= /usr/local/bin/master_ip_failover 主master故障时自动切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change 在线切换脚本
password=manager mha登录数据库使用的授权账户和密码
user=mha
ping_interval=1 数据检查
remote_workdir=/tmp 远程工作目录
repl_password=123456 主从复制状态检查账号与密码(master_check_repl)
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.140.50 -s 192.168.140.60
主从复制检查时先主,后从,检查slave状态时的,脚本引用, 从ip地址
shutdown_script="" 关机脚本
ssh_user=root 默认远程登录用户名
[server1]
hostname=192.168.140.40 master 主ip地址
port=3306 数据库端口号
[server2]
hostname=192.168.140.50 slave1 从ip地址
port=3306
candidate_master=1 候选者(备选主)手动指定
check_repl_delay=0
[server3]
hostname=192.168.140.60 slave2 从ip地址
port=3306
2.6.4.5、查看mha是否具有登录数据库的授权账户与密码
报错:
mysql> grant all privileges on *.* to 'mha'@'192.168.140.%' identified by 'manager'; #重新给予权限
mysql> flush privileges;
mysql> exit
[root@mysql-server ~]# systemctl restart mysqld
[root@mysql-server ~]# mysql -uroot -p123456
mysql> show grants for 'mha'@'192.168.140.%';
注:解析切换备选主库的算法
■ 一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
■ 数据一致的情况下,按照配置文件顺序,选择备选主库。
■ 设定有权重(candidate_master=1),按照权重强制指定备选主(设置优先级)
● 默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
● 如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
如果设置优先级就按优先级选择,无优先级就按二进制日志先后进行选择,二进制日志一样,按排列顺序选择备选主
2.6.4.6、 测试 ssh 无密码认证,进行健康检查
[root@mha-manager ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf #进行检查
2.6.4.7、进行主从复制检查
[root@mha-manager ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
2.6.4.8、主数据库手动开启虚拟IP地址
注:第一次启动mha,主库上并不会主动的生成vip(虚拟)地址,需要手动开启在主上添加虚拟地址
[root@mysql-server ~]# ifconfig ens33:1 192.168.140.200/24 up #开启虚拟地址
[root@mysql-server ~]# ip addr #查看信息
2.6.4.9、开启MHA
[root@mha-manager ~]# 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 &
注:
nohup masterha_manager :延迟启动
–conf=/etc/mha/app1.cnf :基于配置文件启动
/var/log/masterha/app1/manager.log:日志输出路径位置
2>&1 :混合输出,无论操作正确,还是错误日志都输出到该文件中
&:在后台运行
–remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
–manger_log 日志存放位置。
–ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover
[root@mha-manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf #查看当前MHA运行状态
[root@mha-manager ~]# cat /var/log/masterha/app1/manager.log #查看manager日志文件
2.7、故障模拟
2.7.1、主数据库模拟故障宕机
[root@mysql-server ~]# pkill mysqld #停止mysql服务
[root@mysql-server ~]# ip addr #查看信息
2.7.2、在mha-manager上查看日志
[root@mha-manager ~]# cat /var/log/masterha/app1/manager.log
2.7.3、查看slave1虚拟地址是否漂移
mysql> exit
Bye
[root@mysql-slave1 ~]# ip addr
mysql> show master status; #查看主数据库状态
2.7.4、查看slave2数据库状态
mysql> show slave status\G
2.7.5、修复故障的数据库
[root@mysql-server ~]# systemctl start mysql #重启原主数据库
[root@mysql-server ~]# systemctl status mysql
报错:
解决:
[root@mysql-server ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql & #添加链接
mysql> change master to master_host='192.168.140.50',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=1493;
#主数据库授权
mysql> start slave; #启动从数据库
mysql> show slave status\G #查看从数据库状态
2.7.6、进入mha-manager配置文件,添加原主信息
注:主从数据库状态转换,原主数据库信息自动消失
[root@mha-manager ~]# vi /etc/mha/app1.cnf #进入配置文件
2.7.7、启动MHA,查看状态
[root@mha-manager ~]# 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 &
[root@mha-manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf