# mysql MHA高可用实战


<!--more-->


## 一. 环境准备

- 准备4台Linux,装好mysql

  最好是全新安装,可以避免之前的配置造成的异常

- 尽量创建一个服务器标识

  如 mysql1, mysql2, mysql3, MHA-manager, 便于操作进辨识

  **此步骤可以忽略**

-  mysql1, mysql2, mysql3 配置好主从同步

  参考主从同步教程,并关掉防火墙 systemctl stop firewalld.service 

- 删除 `/var/lib/mysql/auto.cnf`

  如果未在my.cnf 中自定义指定路径, 默认为`var/lib/mysql/auto.cnf`路径

  **此步骤可以忽略**,但如果通过虚拟机克隆机器,会造成uuid一样,Mysql同步会报错

- 设置4台机器免密互联互通

  可参考本站 linux部署教程设置, 以下仅作简要步骤示例

  ```shell
  #1. 各服务器执行以下命令
  ssh-keygen -t rsa
  
  #2. 在mysql1, mysql2, mysql3上分别执行以下命令, 密码输入系统密码,将公钥拷贝到MHA-manager服务器上
  ssh-copy-id 10.211.55.10  #ip地址为manager服务器ip
  
  #3. 切换到MHA-manager服务器,查看公钥
  cat /root/.ssh/authorized_keys
  
  #4. 执行以下命令,将自身公钥也添加到authorized_keys文件中,此时应该有4条
  cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
  
  #5. 将authorized_keys文件复制到其他3台mysql服务器上
  scp /root/.ssh/authorized_keys root@10.211.55.7:/root/.ssh/authorized_keys
  scp /root/.ssh/authorized_keys root@10.211.55.8:/root/.ssh/authorized_keys
  scp /root/.ssh/authorized_keys root@10.211.55.9:/root/.ssh/authorized_keys
  ```



## 二. MHA下载安装

### 2.1 MHA下载

MySQL5.7对应的MHA版本是0.5.8，所以在GitHub上找到对应的rpm包进行下载，MHA manager和node的安装包需要分别下载：

```http
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58 
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
```

下载后

- 3台mysql服务器安装node
- MHA-manager安装manager和node

### 2.2 node安装

在四台服务器上安装mha4mysql-node。

MHA的Node依赖于**perl-DBD-MySQL**，所以要先安装perl-DBD-MySQL。 

```shell
yum install perl-DBD-MySQL -y 
# 可参会报以下错误 
错误：软件包：perl-DBD-MySQL-4.023-6.el7.x86_64 (base)
          需要：libmysqlclient.so.18(libmysqlclient_18)(64bit)
错误：软件包：perl-DBD-MySQL-4.023-6.el7.x86_64 (base)

#安装 mysql-community-libs-compat-5.7.37-1.el7.x86_64.rpm 
#去该网站找: https://pkgs.org/download/mysql-community-libs-compat
wget https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql-community-libs-compat-5.7.37-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.37-1.el7.x86_64.rpm

# 安装perl-DBD-MySQL 
 yum install perl-DBD-MySQL 
 
# 安装node
wget https://github.com/yoshinorim/mha4mysql- node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
```



### 2.3 manager安装

在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。

MHA的manager又依赖了perl-Confifig-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager，也分别进行安装。

```shell
# 1.安装 epel-release-latest-7.noarch.rpm 
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 

rpm -ivh epel-release-latest-7.noarch.rpm 
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel- perl-Parallel-ForkManager -y 

# 2.安装manager
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 

rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

# 如果上一步报错,可能报如下错误,再次尝试执行以下缺少的安装包
错误：依赖检测失败：
	perl(Parallel::ForkManager) 被 mha4mysql-manager-0.58-0.el7.centos.noarch 需要

yum install perl-DBD-MySQL
yum install perl-Config-Tiny
yum install perl-Log-Dispatch
yum install perl-Parallel-ForkManager
```

> 提示：由于perl-Log-Dispatch和perl-Parallel-ForkManager这两个被依赖包在yum仓库找不到，因此安装epel-release-latest-7.noarch.rpm。在使用时，可能会出现下面异常：**Cannotretrieve metalink for repository: epel/x86_64**。可以尝试使用/etc/yum.repos.d/epel.repo，然后注释掉metalink，取消注释baseurl。



## 三. MHA配置文件

MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件，而所有的Master/Slave 集群也可共享全局配置

### 3.1 初始化配置目录

``` shell
#目录说明 
#/var/log (CentOS目录) 
# 			/mha (MHA监控根目录) 
# 				/app1 (MHA监控实例根目录) 
# 						/manager.log (MHA监控实例日志文件) 
mkdir -p /var/log/mha/app1 
touch /var/log/mha/app1/manager.log
```

### 3.2 配置监控全局配置文件

`vim  /etc/masterha_default.cnf`

```properties
[server default] 
#主库用户名，在master mysql的主库执行下列命令建一个新用户 
#create user 'mha'@'%' identified by '123123'; 
#grant all on *.* to mha@'%' identified by '123123'; 
#flush privileges;
#此处我们就用root
user=root 
password=123456 
port=3306 
#ssh登录账号 
ssh_user=root 
#从库复制账号和密码 
repl_user=root
repl_password=123456 
port=3306 
#ping次数 
ping_interval=1 
#二次检查的主机 
secondary_check_script=masterha_secondary_check -s 10.211.55.7 -s 10.211.55.8 -s 10.211.55.9
```

### 3.3 配置监控实例配置文件

先使用 `mkdir -p /etc/mha` 命令创建目录，然后使用` vim /etc/mha/app1.cnf `命令编辑文件

```properties
[server default] 
#MHA监控实例根目录 
manager_workdir=/var/log/mha/app1 
#MHA监控实例日志文件 
manager_log=/var/log/mha/app1/manager.log 
#[serverx] 服务器编号 
#hostname 主机名 
#candidate_master 可以做主库 
#master_binlog_dir binlog日志文件目录 
[server1] 
hostname=10.211.55.7 
candidate_master=1 
master_binlog_dir="/var/lib/mysql" 

[server2] 
hostname=10.211.55.8
candidate_master=1 
master_binlog_dir="/var/lib/mysql"

[server3] 
hostname=10.211.55.9 
candidate_master=1 
master_binlog_dir="/var/lib/mysql"
```



## 四. MHA配置检测

- 执行ssh通信检测

  在MHA Manager服务器上执行

  ```shell
  masterha_check_ssh --conf=/etc/mha/app1.cnf
  ```

- 检测mysql主从复制

  在MHA Manager服务器上执行

  ```shell
  masterha_check_repl --conf=/etc/mha/app1.cnf
  ```

  > tips: 我在测试的时候,一直报错, 是由于之前的主从关系设置, 并且我是直接克隆之前的linux,导致主从关系错乱



## 五. MHA manager启动

- 在MHA Manager服务器上执行

  ```shell
  nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
  ```

- 查看监控状态命令如下

  ```shell
  masterha_check_status --conf=/etc/mha/app1.cnf
  
  app1 (pid:19131) is running(0:PING_OK), master:10.211.55.7
  ```

- 查看监控日志命令如下

  ```shell
  tail -f /var/log/mha/app1/manager.log
  ```

## 六. 测试MHA故障转移

- 模拟主节点崩溃

  - 主节点打开日志`tail -200f /var/log/mha/app1/manager.log`

  - 关闭Master MySQL服务器服务，模拟主节点崩溃

    ```shell
    systemctl stop mysqld
    ```

  - 查看MHA日志，可以看到哪台slave切换成了master

    ![示意图](https://img.zhaojq.top/20260727091650300.png "示意图")


































