MySQL高可用之MHA
MySQL高可用之MHA
前言
众所周知 服务器挂是一件很正常的事情 所有 我们去说一下 关于当主MySQL没了的时候 怎么切换
搭建基础环境:
角色 | 主机名 | IP地址 | 说明 |
---|---|---|---|
Master | mha-node1 | 192.168.3.145 | 主库 |
Slave1 | mha-node2 | 192.168.3.159 | 从库(候选主库) |
Slave2 | mha-node3 | 192.168.3.163 | 从库 |
Manager | mha-manager | 192.168.8.135 | MHA管理节点(独立服务器) |
配置hosts(所有节点一致)
cat >> /etc/hosts << EOF
192.168.3.145 mha-node1
192.168.3.159 mha-node2
192.168.3.163 mha-node3
192.168.3.135 mha-manager
EOF
向 Linux 系统的 /etc/hosts
文件中添加 IP 地址与主机名的映射关系。
具体来说,它会在/etc/hosts
文件末尾追加以下内容:
plaintext
192.168.3.145 mha-node1
192.168.3.159 mha-node2
192.168.3.163 mha-node3
192.168.3.135 mha-manager
配置SSH免密登录
配置SSH免密登录 manager节点需免密登录所有数据库节点,数据库节点间也需互信
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
for host in mha-node1 mha-node2 mha-node3; dossh-copy-id -i ~/.ssh/id_rsa.pub $host
done
命令解析:
-
生成 SSH 密钥对
bashssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
-
-t rsa
:指定生成 RSA 类型的密钥对 -
-N ''
:设置空密码(无需输入密码即可使用密钥) -
-f ~/.ssh/id_rsa
:指定密钥文件路径和名称(默认路径) -
执行后会在
~/.ssh/
目录下生成两个文件:-
id_rsa
:私钥(保存在本地,需妥善保管) -
id_rsa.pub
:公钥(需要分发到目标主机)
-
-
-
分发公钥到目标主机
bashfor host in mha-node1 mha-node2 mha-node3; dossh-copy-id -i ~/.ssh/id_rsa.pub <span class="katex--inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>h</mi><mi>o</mi><mi>s</mi><mi>t</mi><mi>d</mi><mi>o</mi><mi>n</mi><mi>e</mi><mo><</mo><mi mathvariant="normal">/</mi><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mo><</mo><mi mathvariant="normal">/</mi><mi>p</mi><mi>r</mi><mi>e</mi><mo>></mo><mo><</mo><mi>p</mi><mo>></mo><mtext></mtext><mo><</mo><mi mathvariant="normal">/</mi><mi>p</mi><mo>></mo><mo><</mo><mi>u</mi><mi>l</mi><mo>></mo><mo><</mo><mi>l</mi><mi>i</mi><mo>></mo><mo><</mo><mi>p</mi><mo>></mo><mtext>这是一个循环命令,会依次对</mtext><mo><</mo><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mi>m</mi><mi>h</mi><mi>a</mi><mo>−</mo><mi>n</mi><mi>o</mi><mi>d</mi><mi>e</mi><mn>1</mn><mo><</mo><mi mathvariant="normal">/</mi><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mtext>、</mtext><mo><</mo><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mi>m</mi><mi>h</mi><mi>a</mi><mo>−</mo><mi>n</mi><mi>o</mi><mi>d</mi><mi>e</mi><mn>2</mn><mo><</mo><mi mathvariant="normal">/</mi><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mtext>、</mtext><mo><</mo><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mi>m</mi><mi>h</mi><mi>a</mi><mo>−</mo><mi>n</mi><mi>o</mi><mi>d</mi><mi>e</mi><mn>3</mn><mo><</mo><mi mathvariant="normal">/</mi><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mtext>三个主机执行操作</mtext><mo><</mo><mi mathvariant="normal">/</mi><mi>p</mi><mo>></mo><mo><</mo><mi mathvariant="normal">/</mi><mi>l</mi><mi>i</mi><mo>></mo><mo><</mo><mi>l</mi><mi>i</mi><mo>></mo><mo><</mo><mi>p</mi><mo>></mo><mtext></mtext><mo><</mo><mi>c</mi><mi>o</mi><mi>d</mi><mi>e</mi><mo>></mo><mi>s</mi><mi>s</mi><mi>h</mi><mo>−</mo><mi>c</mi><mi>o</mi><mi>p</mi><mi>y</mi><mo>−</mo><mi>i</mi><mi>d</mi><mo>−</mo><mi>i</mi><mtext> </mtext><mi mathvariant="normal">/</mi><mi mathvariant="normal">.</mi><mi>s</mi><mi>s</mi><mi>h</mi><mi mathvariant="normal">/</mi><mi>i</mi><msub><mi>d</mi><mi>r</mi></msub><mi>s</mi><mi>a</mi><mi mathvariant="normal">.</mi><mi>p</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">host done </code></pre> <p></p> <ul> <li> <p>这是一个循环命令,会依次对<code>mha-node1</code>、<code>mha-node2</code>、<code>mha-node3</code>三个主机执行操作</p> </li> <li> <p><code>ssh-copy-id -i ~/.ssh/id_rsa.pub </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">h</span><span class="mord mathnormal">os</span><span class="mord mathnormal">t</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">p</span><span class="mord mathnormal">re</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.1944em;"><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.1944em;"><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"><span class="mord cjk_fallback">这是一个循环命令,会依次对</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"><span class="mord mathnormal">mha</span><span class="mspace" style="margin-right:0.2222em;"><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">n</span><span class="mord mathnormal">o</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"><span class="mord cjk_fallback">、</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"><span class="mord mathnormal">mha</span><span class="mspace" style="margin-right:0.2222em;"><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">n</span><span class="mord mathnormal">o</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"><span class="mord cjk_fallback">、</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"><span class="mord mathnormal">mha</span><span class="mspace" style="margin-right:0.2222em;"><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">n</span><span class="mord mathnormal">o</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord">3</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"><span class="mord cjk_fallback">三个主机执行操作</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.1944em;"><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"><span class="mord mathnormal">co</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"><span class="mord mathnormal">ss</span><span class="mord mathnormal">h</span><span class="mspace" style="margin-right:0.2222em;"><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.1944em;"><span class="mord mathnormal">co</span><span class="mord mathnormal">p</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222em;"><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"><span class="mord mathnormal">i</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord mathnormal">i</span><span class="mspace nobreak"> </span><span class="mord">/.</span><span class="mord mathnormal">ss</span><span class="mord mathnormal">h</span><span class="mord">/</span><span class="mord mathnormal">i</span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mord mathnormal">s</span><span class="mord mathnormal">a</span><span class="mord">.</span><span class="mord mathnormal">p</span><span class="mord mathnormal">u</span><span class="mord mathnormal">b</span></span></span></span></span>host</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
:将本地的公钥文件id_rsa.pub
复制到目标主机的~/.ssh/authorized_keys
文件中- 测试时候链接成功
配置MySQL(主从差异化配置)
安装MySQL
脚本安装
mha-node1配置
server-id=11 # 唯一ID
log_bin=mysql-bin # 开启binlog
binlog_format=ROW # ROW模式(MHA推荐)
gtid_mode=ON # 开启GTID
enforce_gtid_consistency=ON # 强制GTID一致性
log_slave_updates=ON # 从库同步时记录binlog(用于级联复制)
skip_name_resolve=ON # 跳过域名解析
mha-node2~3
server-id=12 # 唯一ID(mha-node3设为13)
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
skip_name_resolve=ON
relay_log=relay-bin # 开启中继日志
read_only=ON # 从库只读(可选)
搭建主从复制(基于GTID)
在Master(mha-node1)创建复制用户
-- MySQL 8.0默认认证插件为caching_sha2_password,MHA需用mysql_native_passwordCREATE USER 'repl'@'192.168.3.%' IDENTIFIED WITH mysql_native_password BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.3.%';
FLUSH PRIVILEGES;--创建一个名为 repl 的用户,并授予其在 192.168.8.0/24 网段内所有主机上执行主从复制(Replication)的权限
--PS:一般情况下 在主库创建后 从库就会自动创建 尽量
在Slave(mha-node2/mha-node3)配置复制
-- 登录Slave的MySQL
CHANGE MASTER TOMASTER_HOST='mha-node1',MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
--基于GTID自动定位-- 启动复制
START SLAVE;--清除配置
RESET SLAVE ALL;-- 检查复制状态(确保Slave_IO_Running和Slave_SQL_Running均为Yes)
SHOW SLAVE STATUS\G;--检查两个选项
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
部署MHA
安装依赖(所有节点)
#安装阿里云YUM源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo#配置Yum扩展源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#安装Perl依赖(MHA基于Perl开发)
yum install -y perl-DBD-MySQL perl-CPAN perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum install -y perl-Email-Sender perl-Email-Valid perl-Mail-Sender
安装管理节点
--在教室可以使用局域网下载
--管理节点下载
wget http://192.168.56.200/Software/mha4mysql-manager-0.58.tar.gz
--所有节点下载
wget http://192.168.56.200/Software/mha4mysql-node-0.58.tar.gz--github下载
--管理节点下载
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
--所有节点下载
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
管理
mha4mysql-manager-0.58.tar.gz
节点
mha4mysql-node-0.58.tar.gz
安装MHA Node(所有节点)
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
perl Makefile.PL
make && make install
安装MHA Manager(仅manager节点)
tar -zxvf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58
perl Makefile.PL
make && make install# 创建MHA工作目录
mkdir -p /etc/mha/mha_cluster /var/log/mha/mha_cluster
创建MHA配置文件(manager节点)
cat > /etc/mha/mha_cluster.cnf << EOF
[server default]
# MHA管理用户(需在所有MySQL节点创建)
user=mha_user
password=Mha@123
# SSH登录用户
ssh_user=root
# MySQL复制用户
repl_user=repl
repl_password=Repl@123
# 健康检查间隔(秒)
ping_interval=1
# master的binlog目录
master_binlog_dir=/usr/local/mysql/data
# 远程节点临时目录
remote_workdir=/tmp
# 二次检查节点
secondary_check_script=masterha_secondary_check -s mha-node2 -s mha-node3
# manager工作目录
manager_workdir=/var/log/mha/mha_cluster
# manager日志
manager_log=/var/log/mha/mha_cluster/manager.log[server1]
hostname=mha-node1
port=3306
# 不优先作为候选主库
candidate_master=0[server2]
hostname=mha-node2
port=3306
# 优先作为候选主库(数据最新时)
candidate_master=1
# 忽略复制延迟,强制作为候选
check_repl_delay=0[server3]
hostname=mha-node3
port=3306
candidate_master=0
EOF
创建MHA管理用户(所有MySQL节点)
CREATE USER 'mha_user'@'192.168.3.%' IDENTIFIED WITH mysql_native_password BY 'Mha@123';
GRANT ALL PRIVILEGES ON *.* TO 'mha_user'@'192.168.3.%';
FLUSH PRIVILEGES;
验证MHA配置
1. 检查SSH连接(manager节点)
masterha_check_ssh --conf=/etc/mha/mha_cluster.cnf
# 输出"All SSH connection tests passed successfully."即为正常
2. 检查主从复制(manager节点)
masterha_check_repl --conf=/etc/mha/mha_cluster.cnf
# 输出"MySQL Replication Health is OK."即为正常
启动MHA Manager
# 前台启动(测试用,日志实时输出)
masterha_manager --conf=/etc/mha/mha_cluster.cnf# 后台启动(生产用)
nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf > /var/log/mha/mha_cluster/nohup.log 2>&1 &# 停止进程
masterha_stop --conf=/etc/mha/mha_cluster.cnf# 检查MHA状态
masterha_check_status --conf=/etc/mha/mha_cluster.cnf
# 输出"mha_cluster (pid: xxxx) is running(0:PING_OK)"即为正常运行
测试
模拟Master故障(在mha-node1执行)
systemctl stop mysqld # 停止主库服务
2. 观察故障切换(manager节点日志)
tail -f /var/log/mha/mha_cluster/manager.log
# 正常情况下,日志会显示:
# - 检测到master故障
# - 提升mha-node2为新master
# - 其他slave(mha-node3)指向新master
结果
结果就是2成了主 3成了从
报错解决方向
hu Aug 21 15:45:56 2025 - [error][/root/perl5/lib/perl5/MHA/MasterFailover.pm, ln310] Last failover was done at 2025/08/21 14:49:52. Current time is too early to do failover again. If you want to do failover, manually remove /var/log/mha/mha_cluster/mha_cluster.failover.complete and run this script again.
Thu Aug 21 15:45:56 2025 - [error][/root/perl5/lib/perl5/MHA/ManagerUtil.pm, ln177] Got ERROR: at /root/perl5/bin/masterha_manager line 65.
这个错误的原因是 MHA 为了防止短时间内频繁切换主库,默认会记录上次故障转移的时间,并在一定时间内(通常是 8 小时)拒绝再次执行故障转移。具体来说:
- 你的集群在
2025/08/21 14:49:52
刚完成一次故障转移,MHA 生成了标记文件/var/log/mha/mha_cluster/mha_cluster.failover.complete
。 - 当你在
15:45:56
(距离上次不足 1 小时)再次尝试触发故障转移时,MHA 检测到该文件存在,为避免风险而拒绝执行。
解决方法:手动清除上次故障转移的标记文件
如果你确认需要立即再次测试故障转移(比如验证配置是否生效),执行以下命令即可:
bash
# 删除 MHA 的故障转移标记文件
rm -f /var/log/mha/mha_cluster/mha_cluster.failover.complete# 重新启动 MHA 管理进程(或重新触发故障转移)
nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf --remove_dead_master_conf --ignore_last_failover &
-
--ignore_last_failover
参数:强制忽略上次故障转移的记录,允许立即执行新的故障转移(仅建议测试环境使用)。
报错查看日志:
tail -100 /var/log/mha/mha_cluster/manager.log
补充
在 MHA(Master High Availability)环境中,当主库 1 恢复后,通常不会直接让其返回主库身份,而是将其配置为新主库的从库,以保持集群的稳定性和数据一致性。如果确实需要让主库 1 重新成为主库,一般需要手动进行切换操作,步骤如下:
- 确认主库 1 的状态:确保主库 1 已经完全恢复正常,包括数据库服务已启动,数据完整性和一致性得到保证。
- 查看当前集群状态:在 MHA 管理节点上,使用相关命令查看当前集群的状态,例如
masterha_check_status --conf=/etc/mha/mha_cluster.cnf
,了解当前主库和从库的情况。 - 停止主库 1 的复制进程:登录到主库 1,执行
STOP SLAVE;
命令,停止其作为从库的复制进程。 - 在新主库上查看日志信息:登录到当前的新主库,执行
SHOW MASTER STATUS;
命令,记录下当前的二进制日志文件名(File
)和位置(Position
)。 - 在主库 1 上配置复制:在主库 1 上,执行
CHANGE MASTER TO
命令,将其指向新主库,并设置正确的日志文件名和位置。例如:
sql
CHANGE MASTER TO
MASTER_HOST='新主库的IP地址',
MASTER_PORT=3306,
MASTER_USER='复制用户名',
MASTER_PASSWORD='复制密码',
MASTER_LOG_FILE='新主库的二进制日志文件名',
MASTER_LOG_POS=新主库的二进制日志位置;
- 启动主库 1 的复制进程:在主库 1 上,执行
START SLAVE;
命令,启动其作为从库的复制进程。 - 验证复制状态:在主库 1 上,执行
SHOW SLAVE STATUS\G;
命令,查看复制状态,确保Slave_IO_Running
和Slave_SQL_Running
都为Yes
,表示复制正常。 - 手动切换主库(可选) :如果需要将主库 1 重新提升为主库,可以在 MHA 管理节点上,使用
masterha_master_switch
命令进行手动切换。但在进行切换之前,需要确保主库 1 的数据已经完全同步到最新状态,并且切换操作不会对业务造成影响。
需要注意的是,具体的操作步骤可能会因 MHA 的配置和版本不同而有所差异。在进行任何操作之前,建议备份好重要数据,并在测试环境中进行充分的测试。
总结
好了 就这 其实很简单 只不过过程中会有一下小错误 大多都出在主从复制 或者ssh 再或者用户权限 等等 大多数情况看日志就好了
明天周末了 就懒得搞了 希望大家天天开心(总结越来越敷衍?? )