本文适用于初次使用MHA的用户,引导快速部署MHA
部署架构
Master 192.168.7.133
Slave1 192.168.7.237
Slave2/manager 192.168.7.236
系统版本:centos6.8 mysql版本:5.6
- 配置主从同步,创建用户
GRANT ALL ON *.* TO admin@'%' IDENTIFIED BY '123456'; //创建mha管理用户admin
FLUSH PRIVILEGES; //刷新权限
- 配置ssh互信:ssh-keygen -t rsa 、ssh-copy-id
- 配置epel yum源
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
- 主从节点都安装如下依赖包:
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-MIME-Lite
perl-Params-Validate perl-Time-HiRes
manager节点:
rpm –ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
rpm –ivh mha4mysql-node-0.56-0.el6.noarch.rpm
node 节点:
rpm –ivh mha4mysql-node-0.56-0.el6.noarch.rpm
在manager主机上配置MHA文件:
shell> mkdir -p /masterha/app1 //创建目录
shell> mkdir /etc/masterha //创建目录
shell> vi /etc/masterha/app1.cnf //创建配置文件(配置文件中的注释需要去掉)
[server default]
user=admin //用于管理mysql用戶名
password=123456 //用于管理mysql密码
manager_workdir=/masterha/app1
manager_log=/masterha/app1/manager.log
remote_workdir=/masterha/app1
ssh_user=root //ssh免密钥登录的帐号名
repl_user=repl //mysql复制帐号,用来在主从机之间同步二进制日志等
repl_password=123456 //mysql密码
ping_interval=1 //ping间隔,用来检测master是否正常
master_ip_failover_script=/masterha/master_ip_failover //设置自动failover时候的切换脚本
master_ip_online_change_script=/masterha/master_ip_online_change //设置手动切换时候的切换脚本
[server1]
hostname=192.168.7.133
ssh_port=22
master_binlog_dir=/var/lib/mysql //mysql数据库目录
candidate_master=1 //master机宕掉后,优先启用这台作为新master
check_repl_delay=0 //默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
[server2]
hostname=192.168.7.237
ssh_port=22
master_binlog_dir=/var/lib/mysql
candidate_master=1
[server3]
hostname=192.168.7.236
ssh_port=22
master_binlog_dir=/var/lib/mysql
candidate_master=1
使用masterha_check_ssh工具验证ssh信任登录是否成功
shell> masterha_check_ssh --conf=/etc/masterha/app1.cnf
Wed Jun 12 11:10:01 2019 - [debug] ok.
Wed Jun 12 11:10:01 2019 - [info] All SSH connection tests passed successfully.
使用masterha_check_repl工具验证mysql复制是否成功
shell> masterha_check_repl --conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK.
[manager:201]
shell> nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &
shell> tail -f /masterha/app1/manager.log
shell> masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:21158) is running(0:PING_OK), master:192.168.7.133
#!/bin/bash
/usr/bin/purge_relay_logs --user=root --password=123456 --socket=/var/lib/mysql/mysql.sock --host=localhost -disable_relay_log_purge --port=3306 --workdir=/tmp >> /tmp/purge_relay_logs.log 2>&1
部署定时任务
0 4 * * * /bin/sh relay_purge.sh
#手动切换主库(前提不要启动masterha_manager服务),在主192.168.7.133存活情况下进行切换,新主为192.168.7.237 并且把192.168.7.133设置为从库。
masterha_stop --conf=/etc/masterha/app1.cnf
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.7.237 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
#在主库192.168.7.133宕掉情况下进行切换
masterha_master_switch —master_state=dead —conf=/etc/masterha/app1.cnf —dead_master_host=192.168.7.133 —dead_master_ip=192.168.7.133 —dead_master_port=3306 —new_master_host=192.168.7.237
脚本:
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.184.200/24'; # Virtual IP my $key = "wvip"; 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" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed. # If you manage master ip address at global catalog database, # invalidate orig_master_ip here. my $exit_code = 1;
#eval { # print "Disabling the VIP on old master: $orig_master_host \n"; # &stop_vip(); # $exit_code = 0; #};
eval { print "Disabling the VIP on old master: $orig_master_host \n"; #my $ping=`ping -c 1 10.0.0.13 | grep "packet loss" | awk -F',' '{print $3}' | awk '{print $1}'`; #if ( $ping le "90.0%" && $ping gt "0.0%" ){ #$exit_code = 0; #} #else {
&stop_vip();
# updating global catalog, etc $exit_code = 0;
#} };
if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) {
# all arguments are passed. # If you manage master ip address at global catalog database, # activate new_master_ip here. # You can also grant write access (create user, set read_only=0, etc) here. 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"; `ssh $ssh_user\@$orig_master_ip \" $ssh_start_vip \"`; exit 0; } else { &usage(); exit 1; } }
# A simple system call that enable the VIP on the new master 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 { "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"; }
# the end.
|
master_ip_online_change脚本内容:
#!/usr/bin/env perl use strict; use warnings FATAL =>'all';
use Getopt::Long;
my $vip = '192.168.184.200/24'; # Virtual IP my $key = "wvip"; my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; my $exit_code = 0; my $orig_master_ssh_user='root'; my $new_master_ssh_user='root';
my ( $command, $orig_master_is_new_slave, $orig_master_host, $orig_master_ip, $orig_master_port, $orig_master_user, $orig_master_password, $new_master_host, $new_master_ip, $new_master_port, $new_master_user, $new_master_password, ); GetOptions( 'command=s' => \$command, 'orig_master_is_new_slave' => \$orig_master_is_new_slave, 'orig_master_host=s' => \$orig_master_host, 'orig_master_ip=s' => \$orig_master_ip, 'orig_master_port=i' => \$orig_master_port, 'orig_master_user=s' => \$orig_master_user, 'orig_master_password=s' => \$orig_master_password, 'orig_master_ssh_user=s' => \$orig_master_ssh_user, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, 'new_master_user=s' => \$new_master_user, 'new_master_password=s' => \$new_master_password, 'new_master_ssh_user=s' => \$new_master_ssh_user, );
exit &main();
sub main {
#print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed. # If you manage master ip address at global catalog database, # invalidate orig_master_ip here. my $exit_code = 1; eval { print "\n\n\n***************************************************************\n"; print "Disabling the VIP - $vip on old master: $orig_master_host\n"; print "***************************************************************\n\n\n\n"; &stop_vip(); $exit_code = 0; }; if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) {
# all arguments are passed. # If you manage master ip address at global catalog database, # activate new_master_ip here. # You can also grant write access (create user, set read_only=0, etc) here. my $exit_code = 10; eval { print "\n\n\n***************************************************************\n"; print "Enabling the VIP - $vip on new master: $new_master_host \n"; print "***************************************************************\n\n\n\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"; `ssh $orig_master_ssh_user\@$orig_master_host \" $ssh_start_vip \"`; exit 0; } else { &usage(); exit 1; } }
# A simple system call that enable the VIP on the new master sub start_vip() { `ssh $new_master_ssh_user\@$new_master_host \" $ssh_start_vip \"`; } # A simple system call that disable the VIP on the old_master sub stop_vip() { `ssh $orig_master_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=po rt –new_master_host=host –new_master_ip=ip –new_master_port=port\n"; } |
参考:https://www.cnblogs.com/gomysql/p/3675429.html