mysql 5.5 + mha 安裝配置+vip ip 漂移

1、概述

   MHA是一位日本人用Perl寫的一套MySQL故障切換方案,來保證數據庫統的高可用.在宕機的時間內(一般10—60秒內),完成故障切換,部署MHA,可避免主從一致性問題,節約購買新服務器的費用,不影響服務器性能,易安裝,不改變現有部署。node

   還支持在線切換,從當前運行master切換到一個新的master上面,只須要很短的時間(0.5-2秒內),此時僅僅阻塞寫操做,並不影響讀操做,便於主機硬件維護。mysql

2、mha 管理節點的安裝

yum install perl-DBD-MySQL  \
perl-Config-Tiny perl-Log-Dispatch \
perl-Parallel-ForkManager  -y
yum  install perl-Time-HiRes perl-Parallel-ForkManager -y
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.55-0.el6.noarch.rpm
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-0.el6.noarch.rpm
rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
rpm -ivh mha4mysql-manager-0.55-0.el6.noarch.rpm


mkdir /etc/masterha
vi /etc/masterha_default.cnf 
[server default]
user=manager
password=test_2014
ping_interval=1
repl_user=rep
repl_password=rep_2014


ssh 證書安裝:redis

root 用戶下執行:sql

ssh-keygen -t rsa


拷貝 id_rsa.pub 到數據庫節點機器上的/tmp 目錄下,在數據庫節點機器上執行:shell

cd /root/.ssh
cat /tmp/id_rsa.put >>authorized_keys
chmod 600 authorized_keys


3、mha 數據庫節點的安裝 

wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54-0.el6.noarch.rpm
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm

在數據庫節點上以root 用戶執行:數據庫

ssh-keygen -t rsa

分別拷貝id_rsa.pub 到對方機器的/tmp 目錄下,而後分別執行:服務器

cd /root/.ssh
cat /tmp/id_rsa.put >>authorized_keys
chmod 600 authorized_keys

4、vip add 配置

在master 上執行下面命令(第一次啓用必須配置手動配置vip address):
ssh

ifconfig eth1:2 10.10.0.102/16

5、mha 配置文件與故障轉移腳本

在 mha 管理節點上編輯配置文件:ide

vi /etc/masterha/test.conf 
[server default]
ssh_user=root
ping_interval=1
report_script=/usr/local/bin/send_report
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_failover
[server1]
hostname=10.10.0.101
master_binlog_dir=/log/mysql_test
candidate_master=1
port=3306
ssh_port=22
[server2]
hostname=10.10.0.100
master_binlog_dir=/log/mysql_test
candidate_master=1
port=3306
ssh_port=22

6、mysql 主從配置

主從執行:性能

mysql>grant replication slave on *.* to rep@'10.10.%' identified by 'rep_2014' ;
mysql>grant all on *.* to manager@'10.10.%' identified by 'test_2014' ;
mysql>flush privileges;


主上執行:

mysql>show master status;

從上執行:

mysql>change master to master_host='10.10.0.101',master_port=3306,master_user='rep',master_password='rep_2014', master_log_file='mysql-bin.000004',master_log_pos=402; 
mysql> start slave;
mysql> stop slave;
mysql> reset slave;
mysql> show slave status\G;

7、mha 操做命令

測試ssh 配置

/usr/bin/masterha_check_ssh --conf=/etc/masterha/test.conf

測試複製:

/usr/bin/masterha_check_repl  --conf=/etc/masterha/test.conf

啓用 mha 

masterha_manager --conf=/etc/masterha/test.conf

master 切換:

masterha_master_switch --master_state=alive --conf=/etc/masterha/test.conf


8、腳本

master_ip_failover 腳本:

cat /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 = '10.10.0.102/16';  # Virtual IP
my $key = "2";
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$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;
        };
        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\@cluster1 \" $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";
}

cat send_report 
#!/usr/bin/perl
# Copyright (C) 2011 DeNA Co.,Ltd.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
## Note: This is a sample script and is not complete. Modify the script based on your environment.
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
#new_master_host and new_slave_hosts are set only when recovering master succeeded
my ( $dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body );
GetOptions(
  'orig_master_host=s' => \$dead_master_host,
  'new_master_host=s' => \$new_master_host,
  'new_slave_hosts=s' => \$new_slave_hosts,
  'subject=s' => \$subject,
  'body=s' => \$body,
);
# Do whatever you want here
exit 0;
相關文章
相關標籤/搜索