服务器信息:
manager: 192.168.28.184
master: 172.16.2.185
node: 172.16.2.186 172.16.0.171 192.168.12.20
主从搭建命令
stop slave;
change master to master_host='172.16.2.185',master_user='repuser',
master_password='repuser123',master_log_file='wm_binlog.000002',master_log_pos=154;
MHA会提供诸多工具程序, 其常见的如下所示:
Manager节点:
masterha_check_ssh:MHA 依赖的 ssh 环境监测工具;
masterha_check_repl:MYSQL 复制环境检测工具;
masterga_manager:MHA 服务主程序;
masterha_check_status:MHA 运行状态探测工具;
masterha_master_monitor:MYSQL master 节点可用性监测工具;
masterha_master_swith:master:节点切换工具;
masterha_conf_host:添加或删除配置的节点;
masterha_stop:关闭 MHA 服务的工具。
Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)
save_binary_logs:保存和复制 master 的二进制日志;
apply_diff_relay_logs:识别差异的中继日志事件并应用于其他 slave;
purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);
自定义扩展:
secondary_check_script:通过多条网络路由检测master的可用性;
master_ip_failover_script:更新application使用的masterip;
report_script:发送报告;
init_conf_load_script:加载初始配置参数;
master_ip_online_change_script;更新master节点ip地址。
2.3工作原理
MHA工作原理总结为以下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差异的中继日志(relay log) 到其他 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 提升一个 slave 为新 master ;
(6) 使用其他的 slave 连接新的 master 进行复制。
其最大特点是 可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致
VIP切换脚本
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 = '172.16.2.187/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
$ssh_user = "root";
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 \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
"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";
}
MHA集群配置文件
vim app1.cnf
[server default]
manager_log=/etc/masterha/manager.log
manager_workdir=/etc/masterha
master_binlog_dir=/mysql/logs/3306/binlog
master_ip_failover_script=/etc/masterha/scripts/master_ip_failover
password=123456
ping_interval=1
repl_password=repuser123
repl_user=repuser
ssh_user=root
user=root
[server1]
hostname=172.16.2.186
port=3306
[server2]
hostname=172.16.0.171
port=3306
[server3]
hostname=192.168.12.20
port=3306
相关命令:
-- 检查ssh连通性
masterha_check_ssh --conf=/etc/masterha/app1.cnf
-- 检查集群配置健康状态
masterha_check_repl --conf=/etc/masterha/app1.cnf
-- 检查MHA集群状态
masterha_check_status --conf=/etc/masterha/app1.cnf
-- 启动MHA集群
masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover &
--ignore_last_failover
默认情况下,如果MHA检查到主库发生宕机,且两次宕机时间间隔不足8小时,则不会发生切换,该参数可以避免上述情况
日志分析
tail -f /etc/masterha/manager.log
特别注意:
1. MHA启动之后自动处理好集群主从读写关系
2.manager节点也需要 node包
3.故障切换后 masterha_manager进程会自动down掉,需重新启动(可脚本实现检测并自动启动)
vim check_manager_status.sh
#!/bin/bash
while :
do
MGECHECK=`ps -ef|grep masterha_manager |egrep -v grep| wc -l`
if [ $MGECHECK -eq 0 ];then
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover > /dev/null 2>&1
else
echo "MHA manager start"
fi
sleep 5
done
写入开机启动: echo /usr/local/bin/check_manager_status.sh >> /etc/rc.d/rc.local
搭建参考: https://www.cnblogs.com/sky-cheng/p/10972424.html
感谢作者.
网友评论