MHA简介
MHA(Master High Availability Manager and tools for MySQL)目前在MySQL高 可用方面是一个相对成熟的解决方案,它是采用Perl语言编写 的一个脚本管理工具,可以实现故障切换和主从提升功能。在 MySQL 故障切换过程 中,MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障 切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。
管理节点可以单独部署在一台独立的服务器上管理多个主从集群,也可以部署在一台从服务器上。
数据节点运行在每台 MySQL 服务器上。
管理节点会定时探测集群中的主服务器,当主服务器出现故障时,它可以自动将具有 最新数据的从服务器提升为新的主服务器,然后将所有其他的从服务器 slave重新指 向新的主服务器 master。整个故障转移过程对应用程序完全透明。
MHA的优势在于可以非常快速地完成故障转移及提升从服务器角色、主服务崩溃时 不会导致数据不一致、用户无须修改当前 MySQL 设置、不会产生性能损失,并且适 用于任何存储引擎。
提供的工具
Manager节点:
masterha_check_ssh :MHA 依赖的 ssh 环境监测工具;
masterha_check_repl :MYSQL 复制环境检测工具;
masterga_manager :MHA 服务主程序;
masterha_check_status :MHA 运行状态探测工具;
masterha_master_monitor :MYSQL master 节点可用性监测工具; masterha_master_swith:master :节点切换工具;
masterha_conf_host :添加或删除配置的节点;
masterha_stop :关闭 MHA 服务的工具。
Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)
save_binary_logs :保存和复制 master 的二进制日志;
apply_diff_relay_logs :识别差异的中继日志事件并应用于其他 slave;
purge_relay_logs :清除中继日志(不会阻塞 SQL 线程);
自定义扩展:
secondary_check_script :通过多条网络路由检测master的可用性; master_ip_failover_script :更新application使用的masterip;
report_script :发送报告;
init_conf_load_script :加载初始配置参数;
master_ip_online_change_script ;更新master节点ip地址。
MHA的优缺点
优点
可以根据需要扩展 MySQL 的节点数量。
只要复制没有延迟,MHA 通常可以在几秒内实现故障切换。
可以使用任何存储引擎。
缺点
仅监视主数据库。
需要做 SSH 互信 使用 Perl 开发,二次开发困难。
跟不上 MySQL 新版本,最近一次发版是 2018 年。
(曾经MHA所解决的问题,已经逐渐被官方的解决方案所代替,因此,从MySQL8.0开 始,作者已经不在对MHA进行开发和维护。)
搭建
架构规划
设置主机名
hostnamectl set-hostname 1_master
# 1_master
hostnamectl set-hostname 1_slave1
# 1_slave1
hostnamectl set-hostname 1_slave2
# 1_slave2
配置Host文件
192.168.126.6 1_master
192.168.126.7 1_slave1
192.168.126.9 1_slave2
配置ssh互信
三台机器互相免密码登录,注意,自己跟自己也要配免密码登录
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.162.6"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.126.7"
ssh-copy-id -i /root/.ssh/id_rsa.pub "root@192.168.126.9"
# 三台都执行
# 并都测试
ssh 192.168.162.6 date
ssh 192.168.162.7 date
ssh 192.168.162.9 date
GTID同步
gtid的全称为全局事务标识符(global transaction identifiner),是MySQL 5.6引 入的一个特性。gtid保证了MySQL的每一个事务都有一个全局唯一的标识,该标识在 本实例甚至主从复制环境都保证全局唯一。
GTID = server_uuid:sequence_id server_uuid是一个32字节+1字节(/0)的字符串,MySQL第一次启动时生成,并将该 信息写入datadir目录下的auto.cnf文件。如果该文件丢失,MySQL会重新生成一个 新的server_uuid。相同的server_uuid下的事务对应的sequence_id在binlog文件中 是递增且连续有序的,他们以集合的方式呈现。
配置my.cnf文件,重启mysql服务
# 1_master
vim /etc/my.cnf
[mysqld]
server-id=6
log-bin=mysql-bin
skip-name-resolve = on
relay-log = relay-log
gtid-mode=on
enforce-gtid-consistency=true
default_authentication_plugin=mysql_native_password
# 1_slave1
vim /etc/my.cnf
[mysqld]
server-id = 7
relay_log = relay-log
read_only = 1
log_bin = mysql-log
log_slave_updates = 1
relay_log_purge = 0
skip_name_resolve
gtid-mode=on
enforce-gtid-consistency=true
default_authentication_plugin=mysql_native_password
# 1_slave2
vim /etc/my.cnf
[mysqld]
server-id = 9
relay_log = relay-log
read_only = 1
log_bin = mysql-log
log_slave_updates = 1
relay_log_purge = 0
skip_name_resolve
gtid-mode=on
enforce-gtid-consistency=true
default_authentication_plugin=mysql_native_password
#都重启
systemctl restart mysqld
mysql> SHOW GLOBAL VARIABLES LIKE 'GTID_MODE';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode | ON |
+---------------+-------+
1 row in set (0.01 sec)
# 如果模式没打开就打开
mysql> SET GLOBAL GTID_MODE = ON;
Query OK, 0 rows affected (0.00 sec)
主从同步
基于GTID的方式只需要开启GTID,也就是全局事务ID,后面就可以直接使用比较简 单的方式来进行复制,不用关心当前的binlog应用到的位置。
# 主库
mysql>create user repl@'%' identified with mysql_native_password by 'Ch#123546';
mysql> grant replication slave on *.* to repl@'%' with grant option;
mysql> flush privileges;
# 从库
change master to
master_host='192.168.126.6',
master_port=3306,
master_user='repl',
master_password='Ch#123456',
master_auto_position=1;
Master设置VIP,在主库上执行添加VIP的过程(第一次手动添加,后续启动切换)
ifconfig ens33:1 192.168.42.5
# 不存在的网段
源码安装mha4mysql-node和mha4mysql-manager
mha 的 manager 软件是依赖于 node 软件运行的,所以需要先安装 node 端
编译安装node(三个节点都做)
yum install -y perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN
tar zxvf mha4mysql-node-0.58.tar.gz -C /user/local
cd /usr/local/mha4mysql-node-0.58
perl Makefile.PL
make
make install
安装完成后 会在/usr/local/bin/生成以下脚本文件,Node脚本说明(这些工具通常由 MHAManager的脚本触发)
编译安装Manager(在master节点上)
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
tar -zxf mha4mysql-manager-0.58.tar.gz -C /usr/local/
cd /usr/local/mha4mysql-manager-0.58/
perl Makefile.PL
make
make install
这时使用make无法进行编译,在自动下载一些依赖的时候下载超时,需要更换国内源。
更换cpan国内源
# perl修改镜像源地址
[root@1_master mha4mysql-manager-0.58]# perl -MCPAN -e shell
Terminal does not support AddHistory.
cpan[1]> o conf urllist unshift https://mirrors.aliyun.com/CPAN/
Please use 'o conf commit' to make the config permanent!
cpan[2]> o conf commit
commit: wrote '/root/.cpan/CPAN/MyConfig.pm'
cpan[3]> o conf urllist
urllist
0 [https://mirrors.aliyun.com/CPAN/]
1 [http://www.cpan.org/]
2 [https://mirrors.aliyun.com/CPAN/]
3 [https://mirrors.tuna.tsinghua.edu.cn/CPAN/]
Type 'o conf' to view all configuration items
# 更换后就可以使用make命令
编译安装完成后,在/usr/local/mha4mysql-manager-0.58/samples/scripts 目录下会有相关脚本
master_ip_failover | 自动切换时 VIP 管理的脚本 |
master_ip_online_change | 在线切换时 vip 的管理 |
power_manager | 故障发生后关闭主机的脚本 |
send_report | 因故障切换后发送报警的脚本 |
修改故障转移脚本(master_ip_failover),添加如下
vim /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_failover
# 配置一个闲置的网段
my $vip = '192.168.126.5/24';
my $key = '1';
m y $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
# 换成自己的网卡名称
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
# 换成自己的网卡名称
my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 192.168.126.5";
# 换成自己的网卡名称
配置MHA
由于脚本中并没有master_ip_failover脚本,启动时会报错,请到 mha4mysqlmanager-0.5X/samples/scripts下拷贝对应脚本到指定位置。或注释掉 master_ip_failover_script也可以。
mkdir -p /usr/local/mha
mkdir -p /etc/mha
vim /etc/mha/mha.cnf
[server default]
manager_workdir=/usr/local/mha
manager_log=/usr/local/mha/manager_running.log
master_ip_failover_script=/usr/local/mha/scripts/master_ip_failov
er
master_ip_online_change_script=/usr/local/mha/scripts/master_ip_o
nline_change
ping_interval=1
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 1_slave1 -s 1_slave2 --user=root --master_host=1_master --master_ip=192.168.126.6 --master_port=3306
ssh_user=root
user=root
password=Ch#123456
repl_user=repl
repl_password=Ch#123456
[server1]
hostname=192.168.126.6
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.126.7
port=3306
[server3]
hostname=192.168.126.9
port=3306
执行完命令后,需要创建对应的目录如下,然后将自带的一些shell脚本copy到此目录中
cd /usr/local/mha
mkdir scripts
cd scripts/
cp /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_* .
MHA服务启动
到这步我才发现我在安装perl-Log-Dispatch的时候,yum仓库并没有这个包,所以有两个解决办法
yum install epel-release
# epel-release 是一个软件仓库,全称是Extra Packages for Enterprise Linux(企业版Linux的额外软件# 包)。
# 这个软件仓库提供了一些常用的软件包,这些软件包可能没有包含在主要的 Linux 发行版中。
# 这些软件包通常是由社区维护的,而不是由 Linux 发行版的官方团队维护的。
# 如果您想要在您的 Linux 系统中安装一些额外的软件包,
# 您可以将 epel-release 软件仓库添加到您的系统中。
yum install perl-CPAN
perl -MCPAN -e 'install Log::Dispatch'
# 手动安装该软件包。
# 您可以在 CPAN 上找到该软件包的安装文件并进行手动安装。
# 手动安装软件包可能需要下载和编译源代码,并且可能需要满足其他依赖项。
# 因此,这可能需要一些时间和技术知识。
# 我反正使用第一种,第二种已经在更换国内源就花费好长时间了。
1.检查SSH情况
[root@1_master bin]# masterha_check_ssh --conf=/etc/mha/mha.cnf
Sun Apr 16 09:34:31 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 16 09:34:31 2023 - [info] Reading application default configuration from /etc/mha/mha.cnf..
Sun Apr 16 09:34:31 2023 - [info] Reading server configuration from /etc/mha/mha.cnf..
Sun Apr 16 09:34:31 2023 - [info] Starting SSH connection tests..
Sun Apr 16 09:34:32 2023 - [debug]
Sun Apr 16 09:34:31 2023 - [debug] Connecting via SSH from root@192.168.126.6(192.168.126.6:22) to root@192.168.126.7(192.168.126.7:22)..
Sun Apr 16 09:34:31 2023 - [debug] ok.
Sun Apr 16 09:34:31 2023 - [debug] Connecting via SSH from root@192.168.126.6(192.168.126.6:22) to root@192.168.126.9(192.168.126.9:22)..
Sun Apr 16 09:34:32 2023 - [debug] ok.
Sun Apr 16 09:34:33 2023 - [debug]
Sun Apr 16 09:34:32 2023 - [debug] Connecting via SSH from root@192.168.126.9(192.168.126.9:22) to root@192.168.126.6(192.168.126.6:22)..
Sun Apr 16 09:34:32 2023 - [debug] ok.
Sun Apr 16 09:34:32 2023 - [debug] Connecting via SSH from root@192.168.126.9(192.168.126.9:22) to root@192.168.126.7(192.168.126.7:22)..
Sun Apr 16 09:34:33 2023 - [debug] ok.
Sun Apr 16 09:34:33 2023 - [debug]
Sun Apr 16 09:34:31 2023 - [debug] Connecting via SSH from root@192.168.126.7(192.168.126.7:22) to root@192.168.126.6(192.168.126.6:22)..
Sun Apr 16 09:34:32 2023 - [debug] ok.
Sun Apr 16 09:34:32 2023 - [debug] Connecting via SSH from root@192.168.126.7(192.168.126.7:22) to root@192.168.126.9(192.168.126.9:22)..
Sun Apr 16 09:34:32 2023 - [debug] ok.
Sun Apr 16 09:34:33 2023 - [info] All SSH connection tests passed successfully.
2.检查复制情况
masterha_check_repl --conf=/etc/mha/mha.cnf
# Bareword "FIXME_xxx" not allowed while "strict subs" in use at
# /usr/local/mha/scripts/master_ip_failover line 99.
# Execution of /usr/local/mha/scripts/master_ip_failover aborted due to compilation errors.
# Sun Apr 16 09:46:57 2023 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln229]
# Failed to get master_ip_failover_script status with return code 255:0.
# Sun Apr 16 09:46:57 2023 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427]
# Error happened on checking configurations. at /usr/local/bin/masterha_check_repl line
# 48.
# Sun Apr 16 09:46:57 2023 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525]
# Error happened on monitoring servers.
# Sun Apr 16 09:46:57 2023 - [info] Got exit code 1 (Not master dead).
#
# MySQL Replication Health is NOT OK!
# 根据报错我们把/usr/local/mha/scripts/master_ip_failover的第99行'FIXME_xxx'注释掉
# 后面的报错也一并解决了
# 虽然还有报错,但是看到MySQL Replication Health is OK.应该就行了
3.检查MHA状态
[root@1_master bin]# masterha_check_status -conf=/etc/mha/mha.cnf
mha is stopped(2:NOT_RUNNING).
4.启动MHA Manager ,并查看状态
[root@1_master bin]# nohup masterha_manager --conf=/etc/mha/mha.cnf < /dev/null > /usr/local/mha/manager_start.log 2>&1 &
[1] 31703
[root@1_master bin]# masterha_check_status --conf=/etc/mha/mha.cnf
mha (pid:31819) is running(0:PING_OK), master:192.168.126.6
5.关闭MHA-manager
[root@1_master bin]# masterha_stop --conf=/etc/mha/mha.cnf
Stopped mha successfully.
[1]+ Exit 1 nohup masterha_manager --conf=/etc/mha/mha.cnf < /dev/null > /usr/local/mha/manager_start.log 2>&1