MHA你难道不了解一下?mysql数据库MHA高可用配置及故障切换!
Posted 龙少。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MHA你难道不了解一下?mysql数据库MHA高可用配置及故障切换!相关的知识,希望对你有一定的参考价值。
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高可用配置及故障切换!的主要内容,如果未能解决你的问题,请参考以下文章