MySQL高可用方案之MHA

目录

一、简介

二、MHA特点

三、搭建MySQL MHA

1、安装MHA

2、在所有服务器上配置无密码认证

3、在manager节点上配置MHA

4、 manager节点编辑配置文件,管理 mysql 节点服务器

5、在Master服务器上手动开启vip

6、在 manager 节点上测试 ssh 无密码认证

7、故障模拟


一、简介

       MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。
  MHA 是由日本人 yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的 MySQL 高可用方案。MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从。                                             MHA架构由三台mysql服务器(一主两从)和一台manager节点组成,当主库发生故障时,manager能自动从众多从库中选择一台slave log最新的从库转变成主库,然后将其它所有节点重新指向新的主库。将丢失数据的概率降至最低。

写库故障发生前:

写库故障发生后: 

二、MHA特点

       自动故障切换过程中,MHA总会试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。                                                                                                                                             但这并不总是可行,例如如果主服务器硬件故障或者无法通过ssh访问,MHA则无法保存二进制日志,只能进行故障转移而丢失了最新的数据。此时,使用MySQL的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性,有时候可故意设置从节点慢于主节点,当发生意外删除数据库倒是数据丢失时可从从节点二进制日志中恢复。

三、搭建MySQL MHA

MHA一主两从高可用集群示意图:

 实验环境:

MHA manager 服务器:192.168.80.7

Master 服务器:192.168.80.8

Slave1 服务器:192.168.80.3

Slave2 服务器:192.168.80.5

1、安装MHA

部署之前需要配置好主从复制,我这边已经部署好了,详情看我上上篇博客

1)所有服务器上安装MHA依赖的环境

yum install epel-release --nogpgcheck -y  #首先安装epel源

yum install -y perl-DBD-MySQL \     #安装MHA依赖环境
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

2)安装MHA软件包

在所有服务器上必须先安装node组件,最后在MHA manager节点上安装manager组件,因为manager依赖node组件

cd /opt/
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

 

 #manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:

masterha_check_ssh          #检查 MHA 的 SSH 配置状况  

masterha_check_repl          #检查 MySQL 复制状况  

masterha_manger               #启动 manager的脚本  

masterha_check_status       #检测当前 MHA 运行状态  

masterha_master_monitor   #检测 master 是否宕机  

masterha_master_switch     #控制故障转移(自动或者手动)  

masterha_conf_host            #添加或删除配置的 server 信息  

masterha_stop                     #关闭manager

 

#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:

save_binary_logs                  #保存和复制 master 的二进制日志  

apply_diff_relay_logs            #识别差异的中继日志事件并将其差异的事件应用于其他的

slave  filter_mysqlbinlog       #去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具) purge_relay_logs                 #清除中继日志(不会阻塞 SQL 线程)

2、在所有服务器上配置无密码认证

1)在manager节点上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa             #一路按回车键,生成密钥。"-t rsa"指定密钥的类型。
ssh-copy-id 192.168.80.8    #将公钥传给所有数据库节点,形成免密码连接登录
ssh-copy-id 192.168.80.3
ssh-copy-id 192.168.80.5

2)在master节点上配置到数据库节点slave1和slave2的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.80.3    #将公钥传给两个从节点,形成免密码连接登录
ssh-copy-id 192.168.80.5

3)在slave1上配置到数据库节点master和slave2的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.80.8
ssh-copy-id 192.168.80.5

4)在slave2上配置到数据库节点master和slave1的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.80.8
ssh-copy-id 192.168.80.3

3、在manager节点上配置MHA

1)在manager节点上复制相关脚本到/usr/local/bin目录

#在 manager 节点上复制相关脚本到/usr/local/bin 目录
cp -rp /opt/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                 #因故障切换后发送报警的脚本

2)复制自动切换时VIP管理的脚本到/usr/local/bin目录

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

3)修改master_ip_failover脚本

vim /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.80.100';                             #指定vip的地址
my $brdc = '192.168.80.255';                            #指定vip的广播地址
my $ifdev = 'ens33';                                    #指定vip绑定的网卡
my $key = '1';                                          #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #代表此变量值为ifconfig ens33:1 192.168.80.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";    #代表此变量值为ifconfig ens33:1 192.168.80.100 down
my $exit_code = 0;                                      #指定退出状态码为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";
}

4、 manager节点编辑配置文件,管理 mysql 节点服务器

1)创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/   #复制配置文件
 ​
vim /etc/masterha/app1.cnf   #删除原有内容,直接复制并修改节点服务器的IP地址
[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
user=mha
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.3 -s 192.168.80.5
shutdown_script=""
ssh_user=root
 ​
[server1]
hostname=192.168.80.8
port=3306
 ​
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.80.3
port=3306
 ​
[server3]
hostname=192.168.80.5
port=3306

5、在Master服务器上手动开启vip

/sbin/ifconfig ens33:1 192.168.80.100/24

6、在 manager 节点上测试 ssh 无密码认证

在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出successfully

masterha_check_ssh -conf=/etc/masterha/app1.cnf

7、故障模拟

在master上停止mysql服务,MHA 会自动修改 app1.cnf 文件内容,将宕机的master节点删除。 slave1会自动接管 VIP,成为新的master

systemctl stop mysqld    #在Master节点上停止mysql服务

tail -f /var/log/masterha/app1/manager.log    #在manager节点上监控观察日志记录

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值