MHA你难道不了解一下?mysql数据库MHA高可用配置及故障切换!

Posted 龙少。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MHA你难道不了解一下?mysql数据库MHA高可用配置及故障切换!相关的知识,希望对你有一定的参考价值。

一.MHA概述

一套优秀的mysql高可用环境下故障切换和主从复制的软件

mysql故障过程中,MHA能做法哦0~30秒内自动完成故障切换

mha是为了解决故障切换数据尽可能的保存,以及所有节点日志的一致性

二.MHA的组成

1.MHA Manger 管理节点

可以借助于node组件实现健康检查(ssh、主从复制)、故障切换功能

2.MHA Node 数据节点

作用是定时汇报给主manager节点,mysql服务的状态,有监控本地mysql服务的功能

三.MHA的特点

(1)自动故障切换(本质是VIP漂移)过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失

(2)使用办同步复制,可以大大降低数据丢失的风险

(3)目前MHA支持一主多从架构,最少三台服务器,即一主两从

四.MHA的搭建

1.实验环境

服务器准备4台
MHA-mananger:192.168.206.99,管理节点,安装manager组件与node组件

mysql服务器3台,一组两从
master 192.168.206.88
slave1 192.168.206.188
slave2 192.168.206.177
3台服务器均要安装node组件

实验建立在mysql主从复制的基础上
此处3台mysql的编译安装和主从复制不详细叙述,具体见前面博客

2.三台mysql主要配置(主从复制为基础)

主要的配置
(1)时间同步

(2)每一台服务器安装node组件

(3)每个服务器做2个软链接
第一个是mysql命令
第二个mysqlbinlog是节点恢复
ln -s /usr/local/mysql/bin/mysql /usr/sbin
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin

(4)一主两从,授权设置
grant replication slave on . to ‘myslave’@‘192.168.206.%’ identified by ‘123456’;
grant all privileges on . to ‘mha’@‘192.168.206.%’ identified by ‘manager’;

下面三条授权理论上不用添加,但是实验环境通过MHA检查MySQL主从报错,
报两个从库通过主机名连接不上主库,所以所有数据库都需要添加以下授权
通过mha检查的时候,是通过主机名的形式进行监控,这种情况会容易报错
grant all privileges on . to ‘mha’@‘master’ identified by ‘manager’;
grant all privileges on . to ‘mha’@‘slave1’ identified by ‘manager’;
grant all privileges on . to ‘mha’@‘slave2’ identified by ‘manager’;

(5)从服务器开启只读功能后刷新
set global read_only=1;
flush privileges;

(6)查看二进制日志文件和同步点,在节点服务器上进行同步
show master status;

change master to master_host=‘192.168.206.88’,master_user=‘myslave’,master_password=‘123456’,master_log_file=‘master-bin.000001’,master_log_pos=1012;

start slave;

3.mha配置

(1)安装依赖环境

[root@manager ~]# yum -y install epel-release --nogpgcheck

[root@manager ~]# yum install -y perl-DBD-MySQL \\
> perl-Config-Tiny \\
> perl-Log-Dispatch \\
> perl-Parallel-ForkManager \\
> perl-ExtUtils-CBuilder \\
> perl-ExtUtils-MakeMaker \\
> perl-CPAN


(2)时间同步

[root@manager ~]# ntpdate ntp.aliyun.com
31 Jul 00:56:40 ntpdate[18663]: adjust time server 203.107.6.88 offset -0.000078                   sec

(3)安装node组件

[root@manager ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg        公共  视频  文档  音乐
core.17751       mha4mysql-node-0.57.tar.gz  模板  图片  下载  桌面
[root@manager ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@manager ~]# ls
anaconda-ks.cfg       mha4mysql-node-0.57         模板  文档  桌面
core.17751            mha4mysql-node-0.57.tar.gz  视频  下载
initial-setup-ks.cfg  公共                        图片  音乐
[root@manager ~]# cd mha4mysql-node-0.57/
[root@manager mha4mysql-node-0.57]# perl Makefile.PL

(4)安装manager(在安装好node节点的基础上)

[root@manager mha4mysql-node-0.57]# cd
[root@manager ~]# ls
anaconda-ks.cfg       mha4mysql-manager-0.57.tar.gz  公共  图片  音乐
core.17751            mha4mysql-node-0.57            模板  文档  桌面
initial-setup-ks.cfg  mha4mysql-node-0.57.tar.gz     视频  下载
[root@manager ~]# tar zxvf mha4mysql-manager-0.57.tar.gz

(5)查看工具和脚本

[root@manager bin]# cd /usr/local/bin
[root@manager bin]# ls
apply_diff_relay_logs  masterha_check_status    masterha_master_switch    purge_relay_logs
filter_mysqlbinlog     masterha_conf_host       masterha_secondary_check  save_binary_logs
masterha_check_repl    masterha_manager         masterha_stop             scripts
masterha_check_ssh     masterha_master_monitor  master_ip_failover

说明:
manager安装后生成的工具
masterha-check_ssh 检查MHA的SSH配置状况(免交互)
masterha_check_repl 检查MySQL复制状况
masterha_manager 启动manager的脚本
masterha_check_status 检查当前MHA运行状态
masterha_master_monitor 检查master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
masterha_stop 关闭manager

node组件安装后生成的脚本
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志时间,并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK回滚事件(MHA 已不适用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL线程)

(6)配置无密码验证(所有服务器上都设置)

ssh-keygen -t rsa
ssh-copy-id 192.168.206.99
ssh-copy-id 192.168.206.88
ssh-copy-id 192.168.206.188
ssh-copy-id 192.168.206.177

(7)在MHA节点上复制相关脚本到/usr/local/bin目录

cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin

#-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容
#-r: 递归

(8)复制脚本后并修改内容

复制上述的master_ip_failover 到/usr/local/bin目录 这里使用脚本管理VIP

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

修改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.206.100';		#浮动IP
my $brdc = '192.168.206.255';	    #广播地址
my $ifdev = 'ens33';				#使用的网卡为ens33
my $key = '1';						#国际序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";				#使用ifoconfig命令将其启动,同时设置浮动地址
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";				#可以使用ifconfig命令将其down掉(关闭)
my $exit_code = 0;					#正常退出(返回状态码)
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
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() {
`ssh $ssh_user\\@$new_master_host \\" $ssh_start_vip \\"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`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";
}

(9)创建MHA软件目录并拷贝配置文件

mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/

vim /etc/masterha/app1.cnf

[server default]
manager_log=/var/log/masterha/app1/manager.log					#日志文件
manager_workdir=/var/log/masterha/app1							#工作目录
master_binlog_dir=/usr/mysql  #二进制文件
master_ip_failover_script=/usr/local/bin/master_ip_failover   	#故障转移切换的工具
master_ip_online_change_script=/usr/local/bin/master_ip_online_change   #在线切换VIP工具管理
password=manager   												#以下是密码账号的管理配置
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.226.131 -s 192.168.226.132
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.206.88
port=3306

[server2]
candidate_master=1
hostname=192.168.206.188
check_repl_delay=0
port=3306

[server3]
hostname=192.168.206.177
port=3306

(9)测试免密登录

[root@manager bin]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

(10)测试主从复制

[root@manager bin]# masterha_check_repl -conf=/etc/masterha/app1.cnf

五.测试mha故障切换

1.master上设置虚拟ip网卡作为vip

2.后台启动mha

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[1] 34343
[root@manager ~]# jobs
[1]+  运行中               nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

说明:
ohup //选项

masterha_manager //开启

–conf=/etc/masterha/app1.cnf //指定配置文件

–remove_dead_master_conf //当master服务器失效时,发生主从切换后,会把旧的master的ip从主配置文件删

–ignore_last_failover//忽略故障转移,忽略掉总是宕机不够可靠的服务器在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failove之所以这样限制是为了避免ping-pong效应。该参数代表忽略桑次MHA出发切换产生的文件,默认情况 MHA发生切换后会在日志记录下,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件:为了方便,这里设为为–ianore_last_failover

< /dev/null> //生成的所有信息会导到nul1下或者/var/log/masterha/app1/manager.log日志文件中

2>&1& //把2错误性的输山从定向为标准性输山,"&"开启后台运行

3.查看当前master节点

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:34343) is running(0:PING_OK), master:192.168.206.88

4.验证故障切换

(1)模拟master故障

将master服务停止

[root@master ~]# systemctl stop mysqld

(2)实时查看日志信息查看切换过程


查看当前的master节点

[root@manager bin]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:56057) is running(0:PING_OK), master:192.168.206.188

(3)slave1上查看vip是否漂移

(4)检测

① slave上查看

slave1上查看

slave2 上查看

可以发现slave1已经变为新master。vip已经漂移成功到slave1上

② 验证主从,在slave1 插入数据,slave2查询

slave插入

slave2查询

③ 查询/usr/local/mysql/data目录下的二进制日志和中继日志

[root@slave1 bin]# cd /usr/local/mysql/data
[root@slave1 data]# ls
auto.cnf        ibdata1      ib_logfile1  info  master-bin.000001  master-bin.000003  master-bin.index  performance_schema    slave-yelay-bin.index  test
ib_buffer_pool  ib_logfile0  ibtmp1       kkk   master-bin.000002  master-bin.000004  mysql             relay-log-bin.000001  sys                    ttt

[root@slave1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v master-bin.000004

[root@slave1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v relay-log-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#210803  2:13:16 server id 22  end_log_pos 123 CRC32 0xcf5b82e0         Start: binlog v 4, server v 5.7.20-log created 210803  2:13:16 at startup
# This Format_description_event appears in a relay log and was generated by the slave thread.
# at 123
#210803  2:13:16 server id 22  end_log_pos 154 CRC32 0x60abb197         Previous-GTIDs
# [empty]
# at 154
#210803  2:13:16 server id 22  end_log_pos 177 CRC32 0xe8d9dde3         Stop
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@slave1 data]#

④ 查询slave2的中继日志

[root@slave2 ~]# cd /usr/local/mysql/data
[root@slave2 data]# ls
auto.cnf        ib_logfile1  master-bin.000001  master-bin.index    relay-log-bin.000001   sys
ib_buffer_pool  ibtmp1       master-bin.000002  master.info         relay-log-bin.000002   test
ibdata1         info         master-bin.000003  mysql               relay-log.info
ib_logfile0     kkk          master-bin.000004  performance_schema  slave-relay-bin.index
[root@slave2 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v relay-log-bin.000002

六.master故障修复

1.修改配置文件/etc/my.cnf

2.修复主从

查看主192.168.206.188日志起点

修复master



slave2状态

3.修改MHA配置文件

[root@manager bin]# vim /etc/masterha/app1.cnf

添加server1内容,修改server2内容

4.再次测试免密和主从

5.启动MHA并查看新的master节点

以上是关于MHA你难道不了解一下?mysql数据库MHA高可用配置及故障切换!的主要内容,如果未能解决你的问题,请参考以下文章

mysql高可用之MHA--邮件报警

MySQL高可用MHA部署 (一主二从)

mysql高可用MHA架构搭建

MySQL数据库---MHA高可用群集架构

mysql高可用方案MHA介绍

MySQL高可用之MHA