MySQL MHA高可用实施
用于 MySQL 数据库的高可用性解决方案,旨在实现主节点自动故障转移和数据一致性
MHA 的主要目的是在主节点发生故障时,能够迅速地将一个从节点提升为新的主节点,从而最大限度地减少数据库的停机时间
主要特点:
- 自动故障转移:当 MySQL 主节点发生故障时,MHA 能够自动检测到这个故障,并将一个健康的从节点提升为新的主节点。这样可以确保数据库服务的高可用性
- 数据一致性:在进行故障转移之前,MHA 会检查所有从节点的数据,以确保新的主节点的数据与旧的主节点一致。这有助于避免数据丢失或不一致的情况
- 恢复操作:MHA 支持恢复操作,可以在主节点恢复后,将其重新配置为从节点,以便重新加入到复制链中
- 管理工具:MHA 提供了管理和监控工具,包括
mha-manager
和mha-node
,用于管理集群的状态和执行故障转移操作
MHA 组成:
- MHA Manager:主要负责监控 MySQL 节点的状态,并在检测到主节点故障时执行故障转移操作。它还负责协调从节点的提升过程
- MHA Node:安装在每个 MySQL 节点上,负责向 MHA Manager 发送节点状态信息,并在需要时执行一些操作(例如故障转移或数据同步)
- MHA Admin:提供了管理和配置 MHA 的工具,帮助用户配置和维护 MHA 环境
MHA Manager 通常需要部署在一台独立的机器上,而不是与 MySQL 数据库节点(主节点或从节点)共享同一台服务器。这是为了确保 MHA Manager 的高可用性和独立性,同时避免因 MySQL 节点故障导致 MHA Manager 失效
环境准备
在所有 mysql 节点安装 mha node,在管理端安装 mha node 和 manager
环境准备:
首先切换下载源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.tencentyun.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.tencentyun.com/repo/epel-7.repo
或者是
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
yum update
安装 mha 所需要的环境:
yum install compat-db mysql-libs perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-Config-Tiny perl-DBD-MySQL perl-DBI perl-Email-Date-Format perl-Log-Dispatch perl-Mail-Sender perl-Mail-Sendmail perl-MailTools perl-MIME-Base32 perl-MIME-Lite perl-MIME-Types perl-Parallel-ForkManager perl-Params-Validate perl-TimeDate perl-Time-HiRes
在所有节点端安装 mha node:rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
在管理端安装 node 和 manager :rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
开始配置 mha 高可用
作业前提:所有节点需要配置无密码 ssh 登录,mha 检测环境需要用到;开放所有机器的 mysql 端口
在所有的 mysql 节点,创建用于 mha 的用户,mysql 配置好主从后,只用在一个机器中做配置即可
CREATE USER 'mha_manager'@'%' IDENTIFIED BY '123456zzlZZL!';
GRANT ALL PRIVILEGES ON . TO 'mha_manager'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

看下 21 和 22 机器


对 mha manager 进行配置,通常位于 /etc/mha.cnf
[server1]
# 主服务器
hostname=10.0.0.20
user=mha_manager
#password=123456zzlZZL!
ssh_user=root
[server2]
# 从服务器1
hostname=10.0.0.21
user=mha_manager
ssh_user=root
[server3]
# 从服务器2
hostname=10.0.0.22
user=mha_manager
ssh_user=root
[mha_manager]
# MHA Manager 配置
manager_user=mha_manager
manager_password=123456zzlZZL!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
验证配置文件:masterha_check_repl --conf=/etc/mha.cnf
然后启动 mha manager:masterha_manager --conf=/etc/mha.cnf
问题1:可能会遇到之前主从配置的用户的权限问题
GRANT REPLICATION SLAVE ON . TO 'zzl'@'%' IDENTIFIED BY '123456zzlZZL!';
FLUSH PRIVILEGES;
问题2:log_bin 二进制文件位置找不到
现在 master 上查看 log_bin 的位置:mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin%';"
在 mha manager 的配置文件中加入:master_binlog_dir=实际位置
例如,log_bin 在 /usr/local/mysql/data/ 下,那么就配置 master_binlog_dir=/usr/local/mysql/data/
问题3:mha manager 需要用到 mysqlbinlog
确保 mysqlbinlog 工具存在并且在系统的 PATH 环境变量中,通常,mysqlbinlog 位于 MySQL 安装目录的 bin 子目录下
如果工具存在但路径不在 PATH 中,你可以通过以下命令来临时设置 PATH
export PATH=$PATH:/usr/local/mysql/bin
或者将其添加到 /etc/profile 文件中,以便系统重启后自动加载
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bashrc
source ~/.bashrc
mysqlbinlog --version:查看 mysqlbinlog 是否配置好
解决完所有问题后,正常启动成功