当前位置: 首页 > web >正文

MySQL高可用之MHA

MySQL高可用之MHA

前言

众所周知 服务器挂是一件很正常的事情 所有 我们去说一下 关于当主MySQL没了的时候 怎么切换

搭建基础环境:

角色主机名IP地址说明
Mastermha-node1192.168.3.145主库
Slave1mha-node2192.168.3.159从库(候选主库)
Slave2mha-node3192.168.3.163从库
Managermha-manager192.168.8.135MHA管理节点(独立服务器)

配置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

命令解析:

  1. 生成 SSH 密钥对
    bash

    ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
    

    • -t rsa:指定生成 RSA 类型的密钥对

    • -N '':设置空密码(无需输入密码即可使用密钥)

    • -f ~/.ssh/id_rsa:指定密钥文件路径和名称(默认路径)

    • 执行后会在~/.ssh/目录下生成两个文件:

      • id_rsa:私钥(保存在本地,需妥善保管)
      • id_rsa.pub:公钥(需要分发到目标主机)
  2. 分发公钥到目标主机
    bash

    for 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 的状态:确保主库 1 已经完全恢复正常,包括数据库服务已启动,数据完整性和一致性得到保证。
  2. 查看当前集群状态:在 MHA 管理节点上,使用相关命令查看当前集群的状态,例如masterha_check_status --conf=/etc/mha/mha_cluster.cnf,了解当前主库和从库的情况。
  3. 停止主库 1 的复制进程:登录到主库 1,执行STOP SLAVE;命令,停止其作为从库的复制进程。
  4. 在新主库上查看日志信息:登录到当前的新主库,执行SHOW MASTER STATUS;命令,记录下当前的二进制日志文件名(File)和位置(Position)。
  5. 在主库 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 的复制进程:在主库 1 上,执行START SLAVE;命令,启动其作为从库的复制进程。
  2. 验证复制状态:在主库 1 上,执行SHOW SLAVE STATUS\G;命令,查看复制状态,确保Slave_IO_RunningSlave_SQL_Running都为Yes,表示复制正常。
  3. 手动切换主库(可选) :如果需要将主库 1 重新提升为主库,可以在 MHA 管理节点上,使用masterha_master_switch命令进行手动切换。但在进行切换之前,需要确保主库 1 的数据已经完全同步到最新状态,并且切换操作不会对业务造成影响。

需要注意的是,具体的操作步骤可能会因 MHA 的配置和版本不同而有所差异。在进行任何操作之前,建议备份好重要数据,并在测试环境中进行充分的测试。

总结

好了 就这 其实很简单 只不过过程中会有一下小错误 大多都出在主从复制 或者ssh 再或者用户权限 等等 大多数情况看日志就好了

明天周末了 就懒得搞了 希望大家天天开心(总结越来越敷衍?? )

http://www.xdnf.cn/news/18526.html

相关文章:

  • 【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(1):智绘旅程构建文旅新基建
  • 稀土元素带来农业科技革命
  • 哈尔滨服务器托管,如何实现高效稳定运行?
  • OBCP第四章 OceanBase SQL 调优学习笔记:通俗解读与实践指南
  • comfyUI背后的一些技术——Checkpoints
  • React:Umi + React + Ant Design Pro的基础上接入Mock数据
  • Unity编辑器相关
  • 基于STM32设计的大棚育苗管理系统(4G+华为云IOT)_265
  • RabbitMQ:技巧汇总
  • 如何用 SolveigMM Video Splitter 从视频中提取 AAC 音频
  • leetcode_238 除自身以外的数组乘积
  • 实践题:智能客服机器人设计
  • 【Dify(v1.x) 核心源码深入解析】prompt 模块
  • centos下安装Nginx(搭建高可用集群)
  • 利用随机森林筛查 “癌症点”
  • yggjs_react使用教程 v0.1.1
  • Excel中运行VB的函数
  • 自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec
  • Docker安装elasticsearch以及Kibana、ik分词器
  • Day24 目录遍历、双向链表、栈
  • k8s集合
  • GIS在城乡供水一体化中的应用
  • CT02-20.有效的括号(Java)
  • Flutter 线程模型详解:主线程、异步与 Isolate
  • 机器学习中的两大核心算法:k 均值聚类与集成学习
  • Linux之Ansible自动化运维(二)
  • 分布式集群压测+grafana+influxdb+Prometheus详细步骤
  • 小程序个人信息安全检测技术:从监管视角看加密与传输合规
  • 【StarRocks】-- SQL CTE 语法
  • Ubuntu22.04安装VMware Tools