MHA部署实现高可用(3)

一、启动MHA

[root@c733 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover < /dev/null >  /var/log/mha/app1/manager.log  2>&1 &

查看MHA状态

[root@c733 ~]# masterha_check_status --conf=/etc/mha/app1.cnf 

关闭MHA

[root@c733 ~]# masterha_stop --conf=/etc/mha/app1.cnf

从库重新加入主库

[root@c733 ~]# grep "CHANGE MASTER TO MASTER" /var/log/mha/app1/manager.log | tail -1

二、测试MHA故障转移

1、停掉c731主库192.168.37.31

[root@c731 ~]# systemctl stop mysql

查看c733的slave状态,发现master_host变成了192.168.37.32

[root@c733 ~]# mysql -uroot -p123456 -e 'start slave;'
Warning: Using a password on the command line interface can be insecure.
[root@c731 ~]# mysql -uroot -p123456 -e 'show slave status \G'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.32
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 231
               Relay_Log_File: mysqld-relay-bin.000003
                Relay_Log_Pos: 401
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

查看c732的master状态

[root@c732 ~]# mysql -p123456 -e 'show master status;'

 

 三、MHA故障还原

[root@c733 ~]# grep "CHANGE MASTER TO MASTER" /var/log/mha/app1/manager.log | tail -1
Fri Feb 14 02:57:59 2020 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.37.31', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='xxx';

重启数据库,重新change_master

[root@c731 ~]# systemctl restart mysql

[root@c731 ~]# mysql -uroot -p123456 -e "CHANGE MASTER TO MASTER_HOST='192.168.37.32',MASTER_PORT=3306, MASTER_AUTO_POSITION=1,MASTER_USER='rep',MASTER_PASSWORD='123456';"
Warning: Using a password on the command line interface can be insecure.

[root@c731 ~]# mysql -uroot -p123456 -e 'start slave;'
Warning: Using a password on the command line interface can be insecure.

[root@c731 ~]# mysql -uroot -p123456 -e 'show slave status \G'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.37.32
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 231
               Relay_Log_File: mysqld-relay-bin.000003
                Relay_Log_Pos: 401
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

此时,重新在将【server1】标签添加到MHA配置文件,并且重新启动MHA

[root@c733 bin]# sed -i -e '/server2/i \                                                                [server1] \                                                    
hostname=192.168.37.31 \
port=3306 \
' /etc/mha/app1.cnf

 

[root@c733 ~]# ps -ef | grep mha
root      13478  11518  0 03:50 pts/1    00:00:00 grep --color=auto mha
[root@c733 ~]# cat /etc/mha/app1.cnf 
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/bin/master_ip_failover
password=mha
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root
user=mha

[server1]
hostname=192.168.37.32
port=3306

[server3]
hostname=192.168.37.33
ignore_fail=1
no_master=1
port=3306

发生故障时, MHA做了什么?
①当作为主库的c731.上的MySQL宕机以后, mha通过检测发现c731的mysq|宕机了, 那么会将binlog日志最全的从库
( c732 )立刻提升为主库,而其他的从库会指向新的主库进行再次同步。
②MHA会自己结束自己的进程,还会将/etc/mha/app1.cnf配置文件中,坏掉的那台机器剔除。

四、 配置vip飘逸

1、ip漂移的两种方式:

①通过keepalived的方式,管理虚拟ip的漂移

②通过mha自带脚本的方式,管理虚拟ip的漂移 ,用mha自带的vip漂移脚本,那个提升为主,就漂移到那个上面

要根据binlog最新的slave提升

2、MHA脚本方式

修改MHA配置文件

[root@c733 ~]# cat /etc/mha/app1.cnf 
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/bin/master_ip_failover   //添加此处代码
password=mha
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root
user=mha

编写漂移脚本

vim /usr/bin/master_ip_failover
 1 [root@c733 bin]# cat master_ip_failover 
 2 #!/usr/bin/env perl
 3 
 4 use strict;
 5 use warnings FATAL => 'all';
 6 
 7 use Getopt::Long;
 8 
 9 my (
10     $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
11     $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
12 );
13 
14 my $vip = '192.168.37.100/24';
15 my $key = '1';
16 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
17 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
18 
19 GetOptions(
20     'command=s'          => \$command,
21     'ssh_user=s'         => \$ssh_user,
22     'orig_master_host=s' => \$orig_master_host,
23     'orig_master_ip=s'   => \$orig_master_ip,
24     'orig_master_port=i' => \$orig_master_port,
25     'new_master_host=s'  => \$new_master_host,
26     'new_master_ip=s'    => \$new_master_ip,
27     'new_master_port=i'  => \$new_master_port,
28 );
29 
30 exit &main();
31 
32 sub main {
33 
34     print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
35 
36     if ( $command eq "stop" || $command eq "stopssh" ) {
37 
38         my $exit_code = 1;
39         eval {
40             print "Disabling the VIP on old master: $orig_master_host \n";
41             &stop_vip();
42             $exit_code = 0;
43         };
44         if ($@) {
45             warn "Got Error: $@\n";
46             exit $exit_code;
47         }
48         exit $exit_code;
49     }
50     elsif ( $command eq "start" ) {
51 
52         my $exit_code = 10;
53         eval {
54             print "Enabling the VIP - $vip on the new master - $new_master_host \n";
55             &start_vip();
56             $exit_code = 0;
57         };
58         if ($@) {
59             warn $@;
60             exit $exit_code;
61         }
62         exit $exit_code;
63     }
64     elsif ( $command eq "status" ) {
65         print "Checking the Status of the script.. OK \n";
66         exit 0;
67     }
68     else {
69         &usage();
70         exit 1;
71     }
72 }
73 
74 sub start_vip() {
75     `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
76 }
77 sub stop_vip() {
78      return 0  unless  ($ssh_user);
79     `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
80 }
81 
82 sub usage {
83     print
84     "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";
85 }
View Code

注意修改脚本中的网卡名和ip地址

192.168.37.100    ens33

添加执行权限

chmod +x /usr/bin/master_ip_failover

3、重启MHA

[root@c733 ~]# masterha_stop --conf=/etc/mha/app1.cnf 
Stopped app1 successfully.
[1]+  退出 1                nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1
[root@c733 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover < /dev/null >  /var/log/mha/app1/manager.log  2>&1 &
[1] 12132
[root@c733 ~]# masterha_check_status --conf=/etc/mha/app1.cnf 
app1 (pid:12132) is running(0:PING_OK), master:192.168.37.32

五、模拟主库宕机vip漂移

1、关闭c732上的主库mysql

[root@c732 ~]# ifconfig ens33:1 192.168.37.100/24
[root@c732 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:84:52:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.37.32/24 brd 192.168.37.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.37.100/24 brd 192.168.37.255 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::ea02:b804:fa8f:a8bb/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::cefd:32cb:6b50:23c3/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::5aae:78b0:a3e4:e112/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

这里的vip漂移有几秒的延迟

[root@c732 ~]# systemctl stop mysql
[root@c732 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:84:52:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.37.32/24 brd 192.168.37.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::ea02:b804:fa8f:a8bb/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::cefd:32cb:6b50:23c3/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::5aae:78b0:a3e4:e112/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

2、现在查看c731上的mysql的master状态和vip

[root@c731 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:18:e4:7a brd ff:ff:ff:ff:ff:ff
    inet 192.168.37.31/24 brd 192.168.37.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.37.100/24 brd 192.168.37.255 scope global secondary ens33:1
       valid_lft forever preferred_lft forever
    inet6 fe80::ea02:b804:fa8f:a8bb/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::cefd:32cb:6b50:23c3/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@c731 ~]# mysql -p123456 -e 'show master status\G'
Warning: Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 1256
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 986a9807-4e56-11ea-a705-000c29845212:1-6,
f27d0522-4e44-11ea-a692-000c2918e47a:1-4

 

posted @ 2020-02-21 17:29  Security  阅读(316)  评论(0编辑  收藏  举报