mysql高可用之mha安装配置

前言

环境:centos7.9 mysql5.7.33 一主两从

什么是mha

MHA(Master High Availability) 是自动的 master 故障转移和 slave 提升的软件包。它是基于标准的 MySQL 复制(异步/半同步).
MHA 有两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。
MHA Manager 可以单独部署在一台独立机器上来管理多个 master-slave 集群,当然为了节省资源,也可以部署在其中一台 slave 上。
MHA node 运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移的过程。
作为前提条件,应先配置 MySQL 主从复制,架构为1主2从,并设置 各个mysql节点之间能够ssh免密码登录。
下面以 CentOS 为例来说明,最好先安装 EPEL( http://fedoraproject.org/wiki/EPEL ),不然 yum 可能找不到某些软件包。
MHA 由 Node 和 Manager 组成,Node 运行在每一台 MySQL 服务器上(manager节点上也要安装node), 也就是说,不管是 MySQL 主服务器,还是 MySQL 从服务器,都要安装 Node,而 Manager 通常运行在独立的服务器上,但如果硬件资源吃紧,也可以用一台 MySQL 从服务器来 兼职 Manager 的角色。

mha的工作原理

MHA Manager 探测集群的 node 节点,当发现 master 出现故障的时候,它可以自动将具有最新数据的 slave 提升为新的 master,然后将所有其它的 slave 指向新的 master。整个故障转移过程对应用程序是透明的。

准备条件

提前安装好mysql 的1主2从结构,而且从服务器也要开启binlog功能,这里要用到1主2从的mysql架构;配置mysql主从可以参考:https://blog.csdn.net/MssGuo/article/details/118219016
服务器规划:

192.168.118.140  mysql-master、mha-node 	#mysql主
192.168.118.140  mysql-slave、mha-node 		#从
192.168.118.140  mysql-slave、mha-node 		#从
192.168.118.140  mha-manager 、mha-node 	#mha-manager	
3台mysql数据库配置彼此ssh免密登陆,免密登陆可参考https://blog.csdn.net/MssGuo/article/details/114297424

下载mha软件

mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
安装方法:https://github.com/yoshinorim/mha4mysql-manager/wiki/Installation#installing-mha-node,官方文档安装讲的很详细,可以看

# centos7可在下面网站下载,我使用的就是centos7.9版本,所以下载这个版本
wget https://qiniu.wsfnk.com/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
wget https://qiniu.wsfnk.com/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

创建软链接

在所有安装有mysql的主从节点上都要创建软链接,这是因为mha内部代码使用了绝对路径导致的坑,你不做软链接,下面检查主从复制的时候会出现找不命令的报错,所以还是做个软链接吧:

#第一个mysqlbinlog是你安装mysql的bin目录下的命令,可以执行which mysqlbinlog看下
ln -s /opt/mysql/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
ln -s /opt/mysql/mysql/bin/mysql /usr/local/bin/mysql 

安装mha-node、mha-manager

在mysql数据库所有主从节点和mha-manager节点上全部都要安装mha-node,如下:

#使用yum安装mha-node会自动安装依赖perl-DBD-MySQL
yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm 

在单独服务器上安装mha-manager:

yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

#安装完成之后其实在/usr/bin目录下生成了一大堆命令:
[root@nginx ~]# ll /usr/bin/masterha*
-rwxr-xr-x 1 root root 1995 323 2018 /usr/bin/masterha_check_repl
-rwxr-xr-x 1 root root 1779 323 2018 /usr/bin/masterha_check_ssh
-rwxr-xr-x 1 root root 1865 323 2018 /usr/bin/masterha_check_status
-rwxr-xr-x 1 root root 3201 323 2018 /usr/bin/masterha_conf_host
-rwxr-xr-x 1 root root 2517 323 2018 /usr/bin/masterha_manager
-rwxr-xr-x 1 root root 2165 323 2018 /usr/bin/masterha_master_monitor
-rwxr-xr-x 1 root root 2373 323 2018 /usr/bin/masterha_master_switch
-rwxr-xr-x 1 root root 5172 323 2018 /usr/bin/masterha_secondary_check
-rwxr-xr-x 1 root root 1739 323 2018 /usr/bin/masterha_stop
[root@nginx ~]# 

创建mha专用监控用户

在mysql-master主节点上创建mha专用监控用户:

#在master创建用户,备库也自动同步到用户信息了
grant all privileges on *.* to mha@'192.168.118.%' identified by '123456';

在mha-manager节点上创建目录和配置文件

#创建配置文件目录
mkdir -p /etc/mha
#创建日志目录,即工作目录
mkdir /var/log/mha/mysql_mha  -p
#创建日志文件
touch /var/log/mha/mysql_mha/manager.log
#编辑mha配置文件,随便定义一个配置文件名即可,因为一个配置文件对应一组mha管理的mysql主从集群
vim /etc/mha/mysql_mha.cnf
[server default]
manager_log=/var/log/mha/mysql_mha/manager.log
manager_workdir=/var/log/mha/mysql_mha
#指定master节点binlog日志的目录,查看master节点/etc/my.cnf里log_bin = /opt/mysql/data/binlog,
#注意binlog只是文件的前缀,不是目录,所以这里我们写到data目录即可
master_binlog_dir=/opt/mysql/data/
user=mha                            #指定mha用户,刚才我们创建了       
password=123456                     #指定mha用户的密码          
ping_interval=2						#探测主库时发送ping包的时间间隔
repl_password=123456				#指定主从复制的用户,在创建mysql主从复制的时候创建了这个用户
repl_user=rep						#指定主从复制的用户密码
ssh_user=root						#ssh的用户
[server1]                           #下面几个就是定义mysql服务器的ip端口等信息    
hostname=192.168.118.140
port=3306                                  
[server2]            
hostname=192.168.118.141
port=3306
[server3]
hostname=192.168.118.142
port=3306

检查互信(ssh验证)

#在manager上验证各个mysql节点的互信
[root@nginx mha]# masterha_check_ssh  --conf=/etc/mha/mysql_mha.cnf
Sun Nov 13 12:37:34 2022 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
................................................
Sun Nov 13 12:37:37 2022 - [info] All SSH connection tests passed successfully.
[root@nginx mha]# 

检查主从复制是否ok

[root@nginx mha]# masterha_check_repl  --conf=/etc/mha/mysql_mha.cnf

Sun Nov 13 13:26:26 2022 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='mha' --.
.......................................
MySQL Replication Health is OK.
[root@nginx mha]# 
#检查主从复制是否ok这一步,出现了很多问题:
1、slave没开启binlog导致报错
2、mysqlbinlog: unknown variable 'default-character-set=utf8'  这个网上说是mysqlbinlog的bug,改为character-set-server = utf8,重启数据库,重新检查主从复制ok。

启动mha-manager

nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf  --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/mysql_mha/manager.log 2>&1 &
[root@nginx mha]# ps -ef | grep mha		#查看进程,已经启动mha-manager了
root      71830  46897  0 18:54 pts/0    00:00:00 perl /usr/bin/masterha_manager --conf=/etc/mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover
[root@nginx mha]# 
#问题:发现上面的启动命令启动的manager,在关闭窗口之后居然manager进程被中断了,不知是否与pts/0有关,按道理来讲使用nohup和& 应该是把程序放到后台了呀,怎么关闭窗口是退出进程呢?后来发现通过脚本启动的可以实现关闭窗口不退出进程,如下:
[root@nginx ~]# cat startup_masterha_manager.sh 
#!/bin/bash
/usr/bin/nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mysql_mha/manager.log 2>&1 &
[root@nginx ~]# chmod u+x startup_masterha_manager.sh 
[root@nginx ~]# bash startup_masterha_manager.sh
[root@nginx ~]# ps -ef |grep  master
root     116163      1  0 20:44 ?        00:00:00 perl /usr/bin/masterha_manager --conf=/etc/mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover
[root@nginx ~]# 
#官方还有一种后台运行的办法,请查看官方文档

查看mha状态

[root@nginx mha]# masterha_check_status --conf=/etc/mha/mysql_mha.cnf
mysql_mha (pid:91751) is running(0:PING_OK), master:192.168.118.140
[root@nginx mha]# 

mha-manager命令介绍

[root@nginx mha]# rpm -ql mha4mysql-manager-0.58-0.el7.centos.noarch
/usr/bin/masterha_manager			#启动mha-manager
/usr/bin/masterha_stop				#停止hma-manager
/usr/bin/masterha_check_repl		#检查mysql的主从复制状况是否ok
/usr/bin/masterha_check_ssh			#检查mysql的ssh配置是否正常
/usr/bin/masterha_check_status		#检查当前mha-manager的运行状态
/usr/bin/masterha_conf_host			#添加或删除配置文件的server信息
/usr/bin/masterha_master_monitor	#检测master是否宕机
/usr/bin/masterha_master_switch		#控制故障转移(自动或手动)
/usr/bin/masterha_secondary_check	#检查多路由配置

mha-node命令介绍

[root@matser bin]# rpm -ql mha4mysql-node-0.58-0.el7.centos.noarch
/usr/bin/apply_diff_relay_logs	#识别差异的中继日志事件并应用于其它Slave
/usr/bin/purge_relay_logs		#清除中继日志(不会阻塞SQL线程)
/usr/bin/save_binary_logs		#保存和复制master的二进制日志
/usr/bin/filter_mysqlbinlog		#去除不必要的Rollback事件(MHA已不再使用该工具)

备注:Node端工具通常由MHA Manager的脚本触发调用,无需DBA操作。

问题

mha 实现了master故障,自动切换master,但是这对于应用而言,数据库IP变了,这怎么能行呢,所以mha 自身提供了vip 来实现漂移机制。

vip故障漂移

mha 实现vip漂移也是使用脚本实现的,脚本可以在官网的源码包里面找到:

wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
tar -zxvf mha4mysql-manager-0.58.tar.gz
mv mha4mysql-manager-0.58/samples/scripts/* /etc/mha/
ll /etc/mha/
总用量 40
-rwxr-xr-x 1 root   root    3805 1114 03:52 master_ip_failover	
-rwxr-xr-x 1 root   root    2691 1114 04:10 master_ip_failover_1
-rwxr-xr-x 1 root   root    9870 323 2018 master_ip_online_change
-rw-r--r-- 1 root   root     373 1114 03:07 mysql_mha.cnf
-rwxr-xr-x 1 mysqly mysqly 11867 323 2018 power_manager
-rwxr-xr-x 1 mysqly mysqly  1360 323 2018 send_report
[root@nginx scripts]# 
#编辑vip故障转移脚本
my (						#原来的内容,保持不变
  $command,        $ssh_user,         $orig_master_host,
  $orig_master_ip, $orig_master_port, $new_master_host,
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password
);

my $vip = '192.168.118.100/24';			#vip,等下会在master节点定义
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";	#注意网卡名称
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";	#注意网卡名称

GetOptions(					#原来的内容,保持不变
  'command=s'             => \$command,
  'ssh_user=s'            => \$ssh_user,
  'orig_master_host=s'    => \$orig_master_host,
  'orig_master_ip=s'      => \$orig_master_ip,
  'orig_master_port=i'    => \$orig_master_port,
  'new_master_host=s'     => \$new_master_host,
  'new_master_ip=s'       => \$new_master_ip,
  'new_master_port=i'     => \$new_master_port,
  'new_master_user=s'     => \$new_master_user,
  'new_master_password=s' => \$new_master_password,
);
#     FIXME_xxx;			#找到这一行注释掉,不然下面启动manager时会报错的
#第一次配置,需要在master上创建vip
ifconfig ens33:1 192.168.118.100/24
#修改mha-manager的配置文件
[server default]
.............
master_ip_failover_script=/etc/mha/master_ip_failover	#添加vip脚本
# 启动mha
bash  /root/startup_masterha_manager.sh  #查看日志启动成功
service mysqld stop				#停止主库,但是发现vip没有漂移,解决不了,脚本有问题
#换个脚本,从网上找了个脚本,经测试能正常实现vip漂移
[root@nginx mha]# mv  master_ip_failover  master_ip_failover_bad
[root@nginx mha]# vim master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
 
use Getopt::Long;
 
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
my $vip = '192.168.118.100';          #指定vip的地址
my $brdc = '192.168.118.255';         #指定vip的广播地址
my $ifdev = 'ens33';                  #指定vip绑定的网卡
my $key = '1';                        #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #代表此变量值为ifconfig ens33:1 192.168.118.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";    #代表此变量值为ifconfig ens33:1 192.168.118.100 down
my $exit_code = 0;                      #指定退出状态码为0
##################################################################################
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
 
exit &main();
 
sub main {
    
    
 
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
 
if ( $command eq "stop" || $command eq "stopssh" ) {
    
    
 
my $exit_code = 1;
eval {
    
    
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
    
    
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
    
    
 
my $exit_code = 10;
eval {
    
    
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
    
    
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
    
    
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
    
    
&usage();
exit 1;
}
}
sub start_vip() {
    
    
my $ssh_user = 'root';	   #这里指定ssh的用户时root,因为发现不指定会报错的
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
    
    
my $ssh_user = 'root';		#这里指定ssh的用户时root,因为发现不指定会报错的
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
 
sub usage {
    
    
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

#经过测试,使用该脚本模拟master故障,vip能正常漂移到新的master节点上

故障恢复步骤

当master故障之后,mha实现了master故障切换,应用只需要连接vip即可,但是我们恢复故障节点却有点麻烦,首先,当故障发生后,mha会删除配置文件的故障节点信息,如下所示:

[server default]
manager_log=/var/log/mha/mysql_mha/manager.log
manager_workdir=/var/log/mha/mysql_mha
master_binlog_dir=/opt/mysql/data
master_ip_failover_script=/etc/mha/master_ip_failover
password=123456
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root
user=mha

[server1]
hostname=192.168.118.140
port=3306
						#看,这原来有个[[server2]的,因为我们当时手动关闭了141的mysql 
[server3]
hostname=192.168.118.142
port=3306
[root@nginx mha]# 

同时,故障发生后,masterha_manager进程还会自动退出。所以,现在我们需要做这么几件事:
1、修复原来崩掉的mysql;
2、登陆mysql,让其重新加入现在的主从集群,而如何加入现在的主从集群呢?这可以在manager的日志找到相关信息:

Mon Nov 14 04:43:16 2022 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.118.140', MASTER_PORT=3306, MASTER_LOG_FILE='binlog.000011', MASTER_LOG_POS=154, MASTER_USER='rep', MASTER_PASSWORD='xxx';
Mon Nov 14 04:43:16 2022 - [info] Executing master IP activate script:

即登陆mysql,执行CHANGE MASTER语句,注意修改密码;
然后 start slave;show slave status\G;即可让节点重新加入主从了。
3、把节点信息增加回配置文件 vim /etc/mha/mysql_mha.cnf
4、重启mha即可。

猜你喜欢

转载自blog.csdn.net/MssGuo/article/details/127848497