Mysql实现高可用及vip迁移

  • 实验配置
主机名(ip) 用途
server1(172.25.42.1) 节点 1master
server2(172.25.42.2) 节点2 备master
server3(172.25.42.3) 节点3 slave
server4(172.25.42.4) 调度器
  • 配置server1,server2,server3基于gtid的主从复制
  • 配置文件(server1-3)
    值修改server_id即可
    vim /etc/my.cnf
    Mysql实现高可用及vip迁移_第1张图片
    Mysql实现高可用及vip迁移_第2张图片
    在这里插入图片描述
    2.在server1-server3安装主从设备的插件
    server1
    mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
    mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
    mysql> set global rpl_semi_sync_master_enabled=1;
    mysql> set global rpl_semi_sync_master_timeout=100000000000000000;
    Mysql实现高可用及vip迁移_第3张图片
    mysql> show variables like ‘%rpl%’;
    Mysql实现高可用及vip迁移_第4张图片
    server2
    mysql> change master to master_host=‘172.25.42.1’,master_user=‘repl’,master_password=‘Wsp+123ld’,master_auto_position=1;
    mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
    mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
    mysql> set global rpl_semi_sync_master_enabled=1;
    mysql> stop slave io_thread;
    mysql> start slave io_thread;mysql> start slave;
    mysql> show slave status\G;
    Mysql实现高可用及vip迁移_第5张图片
    server3
    mysql> change master to master_host=‘172.25.42.1’,master_user=‘repl’,master_password=‘Wsp+123ld’,master_auto_position=1;
    mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
    mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
    mysql> set global rpl_semi_sync_master_enabled=1;
    mysql> stop slave io_thread;
    mysql> start slave io_thread;mysql> start slave;
    mysql> show slave status\G;
    Mysql实现高可用及vip迁移_第6张图片
  • 检测连通性
    server1查看
    Mysql实现高可用及vip迁移_第7张图片
    server2查看
    Mysql实现高可用及vip迁移_第8张图片
    server3查看

Mysql实现高可用及vip迁移_第9张图片

  • server4进行MHA的配置
    1.下载安装所需安装包
    Mysql实现高可用及vip迁移_第10张图片
    2.安装(并非全部安装)
    [root@server4 ~]# yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm perl-* -y
    在这里插入图片描述
    3.MHA是通过ssh服务来保存master与slave之间的二进制文件的,所以要保证server1-server4之间实行免秘登陆
    在server4上生成钥匙和锁并将钥匙分发给server1-server3
    [root@server4 ~]# ssh-copy-id server1
    [root@server4 ~]# ssh-copy-id server2
    [root@server4 ~]# ssh-copy-id server3

这只保证了server4能够与server1-server3之间互相连接,并不能让server1-server3之间互相通信,所以需要将公钥与私钥都分发给server1-server3
Mysql实现高可用及vip迁移_第11张图片
4.將MHAnode包发送给server1-server3并安装
在这里插入图片描述
[root@server1 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
[root@server2 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
[root@server3 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

  • 在server4上编辑高可用的配置文件并检测是否成功
    创建高可用的配置文件目录
    编辑mha的配置文件
    [root@server4 ~]# cat /etc/masterha/app1.cnf
    [server default]
    manager_log=/var/log/masterha.log
    manager_workdir=/etc/masterha
    master_binlog_dir=/etc/masterha
    password=Wsp+123ld
    ping_interval=1
    remote_workdir=/tmp
    repl_password=Wsp+123ld
    repl_user=repl
    ssh_user=root
    user=root

[server1]
hostname=172.25.42.1
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=172.25.42.2
port=3306

[server3]
hostname=172.25.42.3
no_master=1
port=3306

  • 开启主库对root用户赋予远程登陆权限
    mysql> grant all on . to root@’%’ identified by ‘Wsp+123ld’;

  • 在server2与server3上设置只读
    mysql> set global read_only=1;

  • 检测ssh的配置是否成功

[root@server4 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

Mysql实现高可用及vip迁移_第12张图片

  • 检测mysql的复制情况

在这里插入图片描述
Mysql实现高可用及vip迁移_第13张图片

  • 测试
    手动测试
    1.关闭server1(master),然后在server4上手动切换master到server2
    [root@server1 ~]# systemctl stop mysqld
    在这里插入图片描述

[root@server4 ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_ip=172.25.42.1 --dead_master_host=172.25.42.1 --dead_master_port=3306 --new_master_host=172.25.42.2 --new_master_port=3306

执行该命令后,需要进行两次输入确定,两次都选择yes。
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
2.分别在server2与server3上进行查看状态
server2查看
Mysql实现高可用及vip迁移_第14张图片
server2在server1down掉后提供master的角色,所以无备份状态。
server3查看
Mysql实现高可用及vip迁移_第15张图片可以看到server2成为了新的master

再次开启server1将server1作为slave开始备份
Mysql实现高可用及vip迁移_第16张图片

  • 恢复server1为主备
  • 删除/etc/masterha/app1.failover.complete(每次执行手动切换后都会生成该文件,若不删除则无法进行手动切换)
    [root@server4 ~]# cd /etc/masterha/
    [root@server4 masterha]# ls
    app1.cnf app1.failover.complete
    [root@server4 masterha]# rm -fr app1.failover.complete
    [root@server4 masterha]# ls
    app1.cnf
    Mysql实现高可用及vip迁移_第17张图片
  • 在server4上手动切换新的master为server1
    [root@server4 masterha]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.42.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
    该切换也需要输入选项,也都输入yes即可
    在这里插入图片描述

server1查看
在这里插入图片描述
server2查看
Mysql实现高可用及vip迁移_第18张图片
server3查看
Mysql实现高可用及vip迁移_第19张图片

  • 自动切换
    1.值ixng下列命令
    [root@server4 masterha]# nohup master_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha.log 2>&1 &

2.关闭master
[root@server1 ~]# systemctl stop mysqld
在这里插入图片描述
3.查看server2与server3备份状态
server2
Mysql实现高可用及vip迁移_第20张图片
server3
Mysql实现高可用及vip迁移_第21张图片
vip配置
1.修改配置文件
[root@server4 masterha]# vim app1.cnf

在配置文件中加入下列两条命令

master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

Mysql实现高可用及vip迁移_第22张图片
2.在/usr/local/bin下添加master_ip_failover与master_ip_online_change者两个文件
在这里插入图片描述
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.25.42.100/24';##将该部分改为自身网段即可
my $key = '1';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";##修改这两行为网卡方式修改vip
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0;

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

master_ip_online_change部分如下所示

#!/usr/bin/env perl
use strict;
use warnings FATAL =>'all';

use Getopt::Long;

my $vip = '172.25.0.100/24';  # Virtual IP  
my $key = "1";
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0;  
my $exit_code = 0;

my (
  $command,              $orig_master_is_new_slave, $orig_master_host,
  $orig_master_ip,       $orig_master_port,         $orig_master_user,
  $orig_master_password, $orig_master_ssh_user,     $new_master_host,
  $new_master_ip,        $new_master_port,          $new_master_user,
  $new_master_password,  $new_master_ssh_user,
);
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;
        }
}
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=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

两文件都做如下修改
在这里插入图片描述

3.给脚本添加可执行权限
Mysql实现高可用及vip迁移_第23张图片

  • 测试
    1.切换master为server1(记得删除手动切换的文件)

[root@server4 masterha]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.42.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
2.查看vip
Mysql实现高可用及vip迁移_第24张图片

你可能感兴趣的:(linux高级应用)