MySQL的MHA高可用
1. 环境准备
- 前文搭建的一主二从结构
- 新增centos7当MHA Manager
整体结构:
| 主机角色 | IP 地址 | 说明 |
|---|---|---|
| MHA 管理节点 | 172.25.254.138 | 监控集群、执行故障调度 |
| MySQL 初始主库 | 172.25.254.135 | 故障后下线 |
| MySQL 候选主库 | 172.25.254.136 | candidate_master=1,故障后自动升级为新主 |
| MySQL 普通从库 | 172.25.254.137 | no_master=1,仅作为从库,不参与主库竞选 |
2.实验步骤
2.1 安装centos7虚拟机
镜像地址https://mirrors.cloud.tencent.com/centos-vault/7.9.2009/isos/x86_64/选择CentOS-7-x86_64-Minimal-2009.iso即可满足需求
2.2切换yum源
原因:由于红帽官方已经终止对 CentOS 7 的维护及软件分发服务,系统预装的默认 yum 源会请求 CentOS 官方服务器的常规软件目录;目前 CentOS 7 的安装包整体迁移至归档目录,原有路径下资源大量缺失,继续使用原装源执行yum install时,容易出现连接超时、软件包检索失败、下载中断等问题,无法顺利安装所需的各类依赖组件。 因此我们把系统 yum 源切换至腾讯云镜像源,同时修正源内归档目录路径,依托国内镜像稳定的访问能力,保障后续软件安装、MHA 部署流程正常推进。
切换步骤:
1.备份原有yum源
[root@mha-manager ~]# mkdir -p /etc/yum.repos.d/bak
[root@mha-manager ~]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
2.切换
#从网络下载文件并指定保存位置
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
虽然中间出现Connection refused,但这没太大影响,这是阿里云普通centos/7旧节点访问受限、部分备用镜像节点端口拦截,yum 具备自动重试、切换其他可用镜像的能力;后面 10 项仓库元数据全部下载完成,末尾输出元数据缓存已建立,代表 yum 缓存构建成功。经验证是可以正常安装软件的。
2.3关闭防火墙和selinux
2.4配置集群ssh免密
1. 在 mha-manager 生成密钥
一路回车即可
2. 把公钥分发到所有 MySQL 节点
免密主库:
其它两个从库以此类推。
3.反向免密
MHA 故障切换时,从库需要主动向管理机传输日志、上报状态,单向免密会导致后续校验失败。 操作示例(以主库为例,两台从库执行同样操作):
总的来说就是先ssh到没有与管理机双向免密的机器上,ssh上后生成密钥,再ssh-copy-id 给管理机即可。
2.4 三台 MySQL 数据库节点统一部署环境
前提条件:
下面这三个rpm包是必须的。
epel-release-latest-9.noarch.rpm
作用:部署 EPEL 第三方 yum 源;MHA node 程序运行依赖大量 perl 组件,系统默认源不提供,需要 EPEL 源下载依赖包。部署范围:仅 3 台 MySQL 数据库节点(135、136、137)安装;MHA 管理节点不需要安装
下载地址:Making sure you're not a bot!
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
作用:MHA 节点程序;负责收集本机 binlog、中继日志、日志补齐、动态修改主从复制配置,与 manager 节点通信。部署范围:3 台 MySQL 数据库节点(135、136、137)安装
下载地址:https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
作用:MHA 管理端核心程序;负责监控 MySQL 集群、故障判定、调度所有 node 节点执行故障转移、输出转移日志。部署范围:仅 MHA 管理节点单独安装;三台 MySQL 节点不安装
下载地址:https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
2.5 三台 MySQL 节点搭建初始主从复制(初始拓扑:135 为主,136、137 为从)
在三台 MySQL 节点登录 MySQL,创建复制账号 repl、MHA 管理账号 mha:
CREATE USER repl@'%' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO repl@'%'; CREATE USER mha@'%' IDENTIFIED BY 'Mha@123456'; GRANT ALL ON *.* TO mha@'%'; FLUSH PRIVILEGES;在 136、137 两台从库配置复制,指向初始主库 135:
CHANGE MASTER TO MASTER_HOST='172.25.254.135', MASTER_USER='repl', MASTER_PASSWORD='Repl@123456', MASTER_AUTO_POSITION=1; START SLAVE;校验复制状态:
show slave status\G预期结果:两台从库全部Slave_IO_Running: Yes,Slave_SQL_Running: Yes
常见问题:从库 Slave_IO_Running: No,无法连接主库
解决:检查防火墙 3306 端口、repl 账号密码、MySQL 地址解析;主库开启 skip_name_resolve 优化。
2.6MHA 管理节点配置集群、校验、启动监控(仅 mha-manager 执行)
1.创建目录,编写 MHA 配置文件/etc/mha/app1.cnf,定义各个数据库节点、候选主、VIP 脚本路径。
[server default] user=mha password=Mha@123456 repl_user=repl repl_password=Repl@123456 ssh_user=root manager_workdir=/var/log/mha/app1 manager_log=/var/log/mha/app1/manager.log remote_workdir=/var/log/mha/app1 ping_interval=3 [server1] hostname=172.25.254.135 port=3306 candidate_master=1 [server2] hostname=172.25.254.136 port=3306 candidate_master=1 [server3] hostname=172.25.254.137 port=3306 no_master=1密码和hostname记得根据实际。
2.SSH 互通校验(依托前期免密)
masterha_check_ssh --conf=/etc/mha/app1.cnf3.如果结果报ok就说明免密成功。
3.MySQL 主从复制状态校验
masterha_check_repl --conf=/etc/mha/app1.cnf
4.启动MHA监控
nohup masterha_manager --conf=/etc/mha/app1.cnf & # 实时查看转移日志 tail -f /var/log/mha/app1/manager.log3.实验
模拟主库宕机,在主库执行systemctl stop mysqld。
管理机报错:
自动切换成功:
验证:
在slave2上,主从仍然有效,且主库切换为slave1。