MySQL高可用性解决方案Master High Availability (MHA) 是一种在 MySQL 故障转移环境中实现快速故障转移和数据保护的开源软件。MHA 能在 MySQL 主节点发生故障时,自动将备节点提升为主节点,并且不会中断正在进行的 SQL 操作。
需求:主从配置中如果主服务故障后,主库配置需自动切换至其中一个从库,MHA框架为此实现方案之一。
① 从宕机崩溃的master 保存二进制日志事件(binlog events );
② 识别含有最新更新的slave;
③ 应用差异的中继日志(relay log) 到其他slave;
④ 应用从master 保存的二进制日志事件(binlog events);
⑤ 提升一个slave(从库) 为新master(主库);
⑥ 使用其他的slave 连接新的master
一、MHA安装
1. 前置环境
三台已经搭建好的MySQL集群,并已配置好主从复制。
在所有节点上执行如下命令
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
2. 安装aliyun wget安装源配置(可选)
# 三台服务器均需要安装
yum install perl-DBD* -y
yum -y install wget
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
3. 下载MHA软件
# 三台服务器均需要下载
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
4. 安装Node软件以及依赖包(db1,db2,db3)
# node依赖
tar zxf mha-node-dep.tar.gz
rpm -ivh node/*
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# 如果上述命令失败,则使用
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm --nodeps --force
# node依赖也可以在线yum安装:yum install perl-DBD-MySQL
5. 安装Manager软件(db3)
#管理节点安装Manager软件
#需要安装依赖
tar zxf mha-manager-dep.tar.gz #manager依赖
rpm -ivh manager/*
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm --nodeps --force
#manager依赖也可以在线yum安装:
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManag
6. 验证manager版本(db3)
masterha_manager -v
7. 配置ssh免密(db1,db2,db3)
ssh-keygen -t rsa (一路回车)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@db1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@db2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@db3
#三台服务器之间无需密码校验,可参考文章服务器SSH(免密登录),免密登录必须测试成功!
8. 建立配置文件目录(db3)
mkdir -p /etc/mha/{conf,log,scripts}
9. 创建配置文件(db3)
vi /etc/mha/conf/mha.cnf #注意修改里面的ip,路径,用户,密码等(password与repl_password均为mysql密码)
[server default] manager_log=/etc/mha/log/manager.log manager_workdir=/etc/mha/log master_binlog_dir=/usr/local/mysql/data #failover和switchover脚本 master_ip_failover_script=/etc/mha/scripts/master_ip_failover master_ip_online_change_script=/etc/mha/scripts/master_ip_online_change password=123456 #配置检查主节点的次数 ping_interval=3 repl_password=123456 repl_user=root ssh_user=root user=root # masters [server1] hostname=192.168.31.135 port=3306 #cadidate_master为1表示优先考虑此节点转为主节点 #candidate_master=1 master_binlog_dir=/usr/local/mysql/data remote_workdir=/etc/mha/log [server2] candidate_master=1 check_repl_delay=0 hostname=192.168.31.140 port=3306 [server3] hostname=192.168.31.141 port=3306
注意:
配置中引用的脚本在附件里面,需要修改脚本master_ip_failover/master_ip_online_change中的my $vip和my $ifdev,代表vip和网卡名称,并上传到db3目录/etc/mha/scripts/
# 安装ifconfig命令
yum install net-tools
# 第一次配置需要在 Master 节点上手动开启虚拟IP,虚拟ip与之前在脚本中配置的保持一直,选用未占用的地址
ifconfig ens33:1 192.168.170.200/24
修改脚本master_ip_failover、master_ip_online_change中的vip信息和网卡信息
my $vip = '192.168.170.200'; my $ifdev = 'ens33'; my $key = '1'; my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 dev $ifdev label $ifdev:$key"; my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
11. 脚本添加执行权限(db3)
#将脚本文件移到/etc/mha/scripts/中 chmod +x /etc/mha/scripts/* yum install -y dos2unix dos2unix /etc/mha/scripts/master_ip_failover
脚本中记着修改vip地址以及用户密码,均为后续需要登录的数据库密码,方便切换主从。
12. ssh免密检查(db3)
# 注意配置[server3]时一定要对自己进行免密登录
masterha_check_ssh --conf=/etc/mha/conf/mha.cnf
. . .
[info] All SSH connection tests passed successfully.
13. 各节点复制情况检查(db3)
masterha_check_repl --conf=/etc/mha/conf/mha.cnf
#Result:Checking the Status of the script.. OK
# MySQL Replication Health is OK.
如出现”MySQL Replication Health is NOT OK!“,说明配置有问题
14. 检查manager的状态(db3)
masterha_check_status --conf=/etc/mha/conf/mha.cnf
# mha is stopped(2:NOT_RUNNING).
此处还未启动,停止状态为正常结果。
15. 启动manager(db3)
nohup masterha_manager --conf=/etc/mha/conf/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/log/manager.log 2>&1 &
# 检查日志
tail -f /etc/mha/log/manager.log
...
Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
...
16. 再次检查manager状态(db3)
masterha_check_status --conf=/etc/mha/conf/mha.cnf
#mha (pid:5535) is running(0:PING_OK), master:192.168.31.135
17. 主从高可用切换测试(可选)
确认当前主从状态(检查、检查、检查、一定要检查)
当前主从状态db1(主)、db2(从)、db3(从)
18. 将db1主节点的mysql进程停掉
systemctl stop mysqld
#如非systemctl启动,可用kill -9 pid 杀死进程
19. 检查manager.log
tail -f /etc/mha/log/manager.log
..
Master failover to 192.168.31.140(192.168.31.140:3306) completed successfully.
#显示主库已切换到db2
如图所示,可以看到主节点192.168.31.135的mysql进程已经下线,而从节点192.168.31.140的mysql节点也已经代替主节点在运行。
恭喜你的MySQL高可用已经配置成功!!