Linux——MySQL MHA高可用配置及故障切换以及修复

MHA应用场景及概述

传统的MySQL主从架构存在单点故障的问题
试想?如果主从架构中MySQL的master挂了呢?

  • MHA概述
    一套优秀的MySQL高可用环境下故障切换和主从复制的软件
    MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换有效解决单点故障
  • MHA的组成
    MHA Manager(管理节点):可以单独部署 在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上
    MHA Node(数据节点):MHA Node运行在每台 MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新 数据的slave提升为新的master,然后将所有其他的slave重新指向新的master
  • MHA特点
    自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
    使用半同步复制,可以大大降低数据丢失的风险
    目前MHA支持一主多从架构,最少三台服务,即一主两从

数据库MHA高可用方案

  • 服务器配置
主机名 IP地址 角色 所需安装软件包
manager 192.168.150.20 manager管理节点 manager组件,node组件
master 192.168.150.30 MySQL主数据库 node组件
slave1 192.168.150.40 MySQL从数据库 node组件
slave2 192.168.150.50 MySQL从数据库 node组件
  • 部署思路
    1.安装 MySQL 数据库
    2.配置 MySQL 一主两从
    3.安装 MHA 软件
    4.配置无密码认证
    5.配置 MySQL MHA 高可用
    6.模拟 master 故障切换

部署方法

安装MySQL数据库配置+主从同步

第一步MySQL安装
安装完毕后需要给master、slave1、slave2分别做两个软链接
第一个是mysql命令文件
第二个是mysqlbinlog可用于断点恢复
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

第二步配置MySQL一主两从只需要配置该链接中的主从复制部分
在所有数据库节点上授权两个用户,一个是从库同步使用,另一个是manager使用

第四个账户manager 管理mysql集群使用(监控)三台都做
grant replication slave on *.* to 'myslave'@'192.168.150.%' identified by '123456';
grant all privileges on *.* to 'mha'@'192.168.150.%' identified by 'manager';

flush privileges;刷新权限列表
在这里插入图片描述

下面三条授权,理论上不用添加,但是实验环境通过MHA检查MySQL主从报错,报两个从库通过主机名连接不上主库,所有数据库都需要添加以下授权
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';
flush privileges;

必须设置两个从库为只读模式
set global read_only=1;
flush privileges;
在这里插入图片描述

配置MHA依赖环境

所有节点配置
vim /etc/sysconfig/selinux
SELINUX=disabled

在所有服务器上安装MHA依赖环境,首先安装epel源,只有安装了源perl才会有
安装epel源,并且不进行gph检查
yum install -y epel-release --nogpgcheck

perl针对于mysql数据库
从配置文件中提拿其中的值
log-日志
多线程管理
扩展工具CBuilder MakeMaker
cpan perl中的数据库
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

配置MHA node组件和manager组件

MHA软件包对于每个操作系统版本不一样,这里Centos7.4必须选择0.57版本
在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件因为manager依赖node组件

所有节点安装node组件
cd /opt
tar zxvf /opt/mha4mysql-node-0.57.tar.gz -C /root/
cd /root/mha4mysql-node-0.57/
perl Makefile.PL
make && make install

在MHA(manager)节点上安装manager组件(必须先安装node才能安装manager组件)
cd /opt
tar zxvf /opt/mha4mysql-manager-0.57.tar.gz -C /root
cd /root/mha4mysql-manager-0.57/
perl Makefile.PL
make && make install

manager安装后再/usr/local/bin目录下会生成几个工具,主要包括以下:
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安装后也会在/usr/local/bin目录下生产几个脚本,需要进行检查,主要包括以下
save_binary_logs保存和复制master的二进制日志
apply_diff_relay_logs识别差异的中继日志时间,并将其差异的时间应用于其他的slave
filter_mysqlbinlog去除不必要的ROLLBACK回滚时间(MHA已不适用这个工具)
purge_relay_logs清除中继日志(不会阻塞 SQL线程)

配置无密码认证

在manager上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa这条一直回车
ssh-copy-id 192.168.150.30这里执行后输入yes再输入密码
ssh-copy-id 192.168.150.40
ssh-copy-id 192.168.150.50

在master上配置到slave1和salve2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.150.40
ssh-copy-id 192.168.150.50

在slave1上配置到master和save2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.150.30
ssh-copy-id 192.168.150.50

在slave2上配置到master和save1的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.150.30
ssh-copy-id 192.168.150.40

配置MHA故障转移脚本

在MHA节点上复制相关脚本到/usr/local/bin目录
cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin/
拷贝后会有四个执行文件
ll /usr/local/bin/scripts

master_ip_failover自动切换时VIP管理的脚本(故障转移)
master_ip_online_change在线切换时VIP的管理
power_manager故障发生后关闭主机的脚本
send_report因故障切换后发送报警的脚本

复制上述的master_ip_failover(自动切换时VIP管理的脚本)到/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.150.200';								
my $brdc = '192.168.150.255';								
my $ifdev = 'ens33';										
my $key = '1';												
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key 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";
}

粘贴时注意#号可以:% s/#//g
其中最主要的内容就是
my $vip = '192.168.150.200'; 浮动的ip
my $brdc = '192.168.150.255'; 广播地址
my $ifdev = 'ens33'; 使用的网卡名为ens33
my $key = '1';虚拟接口
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";使用ifconfig命令将其启动
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";可以使用ifconfig命令将其down
my $exit_code = 0;正常退出(返回状态码)

创建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/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
user=mha					
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave	
#report_script /usr/local/send_report
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.150.40 -s 192.168.150.50
shutdown_script=""
ssh_user=root			

[server1]
hostname=192.168.150.30
port=3306

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

[server3]
hostname=192.168.150.50
port=3306

[server default]
manager_log=/var/log/masterha/app1/manager.logmanager工作目录
manager_workdir=/var/log/masterha/app1manager日志
master_binlog_dir=/usr/local/mysql/datamanager保存binlog的位置,这里的路径要于master里配置的binlog(相同?)
master_ip_failover_script=/usr/local/bin/master_ip_failover设置自动failover时候切换脚本,也就是上一个配置的脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change设置手动切换时候的切换脚本
password=manager此处密码为之前创建监控用户的密码
user=mha设置监控用户
ping_interval=1设置监控主库,发送ping包的事件间隔,默认为3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp设置远端的MySQL在发生切换时binlog的(临时)保存位置
repl_password=123456设置复制(slaves)用户的密码
repl_user=myslave设置复制用于的账户
report_script /usr/local/send_report设置发生切换后发送的报警的脚本暂时用不到
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.150.40 -s 192.168.150.50设置检查从服务器的脚本
shutdown_script=""设置故障发生后关闭故障主机脚本
ssh_user=root设置ssh的登录用户名

[server2]
candidate_master=1设置候选master,如果设置了此参数,发送主从切换后,会将此库提升为主库
check_repl_delay=0支持复制的检查,默认情况下如果一个slave落后master 100M的relay logs(中继日志)的话,MHA将不会选择该slave作为新的master,设置为0的话忽略此规则

[server1]设置的是主[server2]设置的是从(主备)[server3]
在这里插入图片描述

第一次配置需要在master节点上手动开启虚拟IP

/sbin/ifconfig ens33:1 192.168.150.200/24
注意要于master_ip_failover文件中my $key = '1';虚拟接口对应
在这里插入图片描述

小结

mha-manager有两个核心的配置文件
故障切换脚本,/usr/local/bin/master_ip_failover
app1.cnf

测试

测试无密码认证

如果正常会输出successfully
masterha_check_ssh -conf=/etc/masterha/app1.cnf
在这里插入图片描述

测试主从复制

masterha_check_repl -conf=/etc/masterha/app1.cnf
在这里插入图片描述
注意:如果软连接不创建的话,无法开启故障检测

启动MHA

启动时会进行日志记录(在后台开启)
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 &
nohup选项:nohup搭配&使用能做到在电源断电的情况下重启后程序还在后台运行单单&的话断电后重启则不在了
masterha_manager:开启
- - remove_dead_master_conf 当master服务器失效时,发生主从切换后,会把旧的master的ip从主配置文件删除
- - ignore_last_failover忽略故障转移,忽略掉总是宕机不够可靠的服务器

在缺省情况下,如果MHA检测到连续发生方剂,且两次宕机间隔不足8小时的话,则不会进行failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略桑次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志记录下,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件;
为了方便,这里设为-ignore_last_failover
< /dev/null >生成的所有信息会导到null下或者/var/log/masterha/app1/manager.log日志文件中
2>&1 &把2错误性的输出从定向为标准性输出,开启后台运行
在这里插入图片描述

查看当前的master节点是谁

masterha_check_status --conf=/etc/masterha/app1.cnf
在这里插入图片描述

查看当前日志信息

cat /var/log/masterha/app1/manager.log
在这里插入图片描述

查看MySQL的VIP地址是否存在

VIP地址不会因为manager节点停止MHA服务而消失
ifconfig
在这里插入图片描述

验证模拟故障查看master变化

manager服务器上启用监控观察日志
tailf /var/log/masterha/app1/manager.log

模拟故障查看master变化
`systemctl stop mysqldr上执行

VIP地址消失、主备服务器查看ifconfig

在这里插入图片描述
在这里插入图片描述

故障修复主服务器重新(slave身份)加入集群

systemctl restart mysqld.service
netstat -natp |grep 3306
mysql -uroot -p123456
stop slave;

change master to master_host='192.168.150.40',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;

start slave;
在这里插入图片描述

这时候之前的master以slave的身份加入集群

重新配置app1.cnf

以防新的master再次挂掉此时需要重新修改一下配置文件规定master的选举
结果故障恢复实验后的app1.cnf文件会有所改变
在这里插入图片描述

server再进行修改即可

在这里插入图片描述
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 &再启动MHA即可

猜你喜欢

转载自blog.csdn.net/weixin_53496398/article/details/116067392