MHA-快速开始

本文适用于初次使用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

 

MHA安装:

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

 

MHA配置:

在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

 

 

MHA启动

使用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.

 

 

启动MHA manager

[manager:201]

shell> nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &

shell> tail -f /masterha/app1/manager.log

查看masterha状态

shell>  masterha_check_status  --conf=/etc/masterha/app1.cnf

app1 (pid:21158) is running(0:PING_OK), master:192.168.7.133

 

 

 

部署从库的手动回收中继日志脚本

relay_purge.sh脚本内容:

 

#!/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设置为从库。

 

1、关闭masterha_manager

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

2、以交互模式切换

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 {

    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";

}

 

 

# 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 {  

print  

"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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值