基于MHA的MYSQL高可用架构搭建(大神篇)

注意:后面由于填上来了脚本所有内容篇幅优点乱,读者可以参考复制
MHA的优势:

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司
youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的
高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故
障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

Manager工具包主要包括以下几个工具:

masterha_check_ssh              检查MHA的SSH配置状况
masterha_check_repl             检查MySQL复制状况
masterha_manger                 启动MHA
masterha_check_status           检测当前MHA运行状态
masterha_master_monitor         检测master是否宕机
masterha_master_switch          控制故障转移(自动或者手动)
masterha_conf_host              添加或删除配置的server信息
Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs                保存和复制master的二进制日志
apply_diff_relay_logs           识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog              去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs                清除中继日志(不会阻塞SQL线程)

实验环境:
**大家可以参考https://blog.csdn.net/aaaaaab_/article/details/81515111里面对实验环境的搭建
很具体,这里就不重复多唠叨了**

主:server1:172.25.38.1   MHA Manager(管理节点)
从:server2:172.25.38.2   MHA Node(数据节点)
从:server3:172.25.38.3   MHA Node(数据节点)

在主端server1还原数据库重新进行初始化:

[root@server1 ~]# /etc/init.d/mysqld stop
Stopping mysqld:                                         OK 
[root@server1 ~]# chkconfig mysqld off
[root@server1 ~]# ls
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm
[root@server1 ~]# rm -fr *
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
auto.cnf         ib_buffer_pool  mysql-bin.000001    private_key.pem  test
ca-key.pem       ibdata1         mysql-bin.000002    public_key.pem
ca.pem           ib_logfile0     mysql-bin.000003    server-cert.pem
client-cert.pem  ib_logfile1     mysql-bin.index     server-key.pem
client-key.pem   mysql           performance_schema  sys
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# ls

这里写图片描述
由于从的配置文件只需要保证server-id不同即可:

[root@server1 mysql]# vim /etc/my.cnf   写入主配置文件GTID方式日志存放目录等
server-id=1
gtid_mode=ON
enforce-gtid-consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
[root@server1 mysql]# scp /etc/my.cnf server2:/etc/
[root@server1 mysql]# scp /etc/my.cnf server3:/etc/

这里写图片描述
进行主端节点server1的配置:

[root@server1 mysql]# /etc/init.d/mysqld start
Initializing MySQL database:                               [  OK  ]
Installing validate password plugin:                       [  OK  ]
Starting mysqld:                                           [  OK  ]
[root@server1 mysql]# grep password /var/log/mysqld.log   过滤密码
[root@server1 mysql]# mysql_secure_installation   初始化安装
[root@server1 mysql]# mysql -p
mysql> show master status;
+---------------+----------+--------------+------------------+------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000003 |      750 |              |                  | 7f6de4ab-9d07-11e8-adc4-525400a2bcb9:1-4 |
+---------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

mysql> grant replication slave on *.* to repl@'172.25.38.%' identified by 'Yakexi+007';  给予slave端授权
Query OK, 0 rows affected, 1 warning (0.04 sec)

这里写图片描述
进行从端server2的配置还原数据库:

[root@server2 ~]# /etc/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@server2 ~]# chkconfig mysqld off
[root@server2 ~]# cd /var/log/mysqld.log 
-bash: cd: /var/log/mysqld.log: Not a directory
[root@server2 ~]# cd /var/lib/mysql
[root@server2 mysql]# ls
auto.cnf        mysql             mysql-bin.index           sys
ib_buffer_pool  mysql-bin.000001  performance_schema        test
ibdata1         mysql-bin.000002  server2-relay-bin.000010
ib_logfile0     mysql-bin.000003  server2-relay-bin.000011
ib_logfile1     mysql-bin.000004  server2-relay-bin.index
[root@server2 mysql]# rm -fr *

这里写图片描述
初始化数据库安装:

[root@server2 mysql]# vim /etc/my.cnf  更改了server-id即可
[root@server2 mysql]# /etc/init.d/mysqld start
Initializing MySQL database:                               [  OK  ]
Installing validate password plugin:                       [  OK  ]
Starting mysqld:                                           [  OK  ]
[root@server2 mysql]# grep password /var/log/mysqld.log    过滤密码
[root@server2 mysql]# mysql_secure_installation  初始化安装
[root@server2 mysql]# mysql -p

这里写图片描述

mysql> change master to master_host='172.25.38.1' , master_user='repl' , master_password='Yakexi+007' , master_auto_position=1;  连接
Query OK, 0 rows affected, 2 warnings (0.41 sec
mysql> start slave;  开启slave
Query OK, 0 rows affected (0.11 sec)
mysql> show slave status\G  显示slave状态

这里写图片描述
解决SQL为NO的情况:
在server1:

mysql> reset master;  删除master日志
Query OK, 0 rows affected (0.17 sec)

在server2:

mysql> stop slave; 停止slave
Query OK, 0 rows affected (0.07 sec)

mysql> reset slave; 删除slave日志
Query OK, 0 rows affected (0.20 sec)

mysql> start slave;删除master日志
Query OK, 0 rows affected (0.22 sec)

mysql> show slave status\G  保证数据同步

这里写图片描述
配置从端server3之前已经搭建好环境:

[root@server3 ~]# /etc/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@server3 ~]# chkconfig mysqld off 关闭开机启动
[root@server3 ~]# vim /etc/my.cnf
[root@server3 ~]# /etc/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[root@server3 ~]# mysql -p
Enter password: 

这里写图片描述
搭建server3的数据库环境

mysql> change master to master_host='172.25.38.1' , master_user='repl' , master_password='Yakexi+007' , master_auto_position=1;   连接
Query OK, 0 rows affected, 2 warnings (0.68 sec)

mysql> start slave;
Query OK, 0 rows affected (0.12 sec)

mysql> show slave status\G  保证数据可以同步达成主从复制

这里写图片描述
测试在server1创建数据库:

mysql> create database westos;  
Query OK, 1 row affected (0.04 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westos             |
+--------------------+
5 rows in set (0.00 sec)

这里写图片描述
在两个后端查看效果已经完成了主从复制:
这里写图片描述
这里写图片描述
搭建MHA高可用架构主端安装manager工具包:

[root@server1 ~]# ls
[root@server1 ~]# ls
master_ip_failover
master_ip_online_change
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
perl-Email-Date-Format-1.002-5.el6.noarch.rpm
perl-Log-Dispatch-2.27-1.el6.noarch.rpm
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
perl-MIME-Lite-3.027-2.el6.noarch.rpm
perl-MIME-Types-1.28-2.el6.noarch.rpm
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
send_report
[root@server1 ~]# yum install *.rpm

这里写图片描述
在server2和server3安装node模块:
这里写图片描述
这里写图片描述
在server1创建MHA的工作目录,并且创建相关配置文件:

[root@server1 ~]# mkdir -p /etc/masterha
[root@server1 ~]# cd /etc/masterha/
[root@server1 masterha]# ls
[root@server1 masterha]# vim app1.cnf
[server default]
manager_workdir=/etc/masterha/
manager_log=/etc/masterha/app1.log
master_binlog_dir=/var/lib/mysql
#master_ip_failover_script=/usr/local/bin/master_ip_failover
#master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=root
password=Aa@+123456
ping_interval=1
remote_workdir=/tmp
repl_user=repl
repl_password=Yakexi+007
#report_script=/usr/local/send_report
#secondary_check_script=/usr/local/bin/masterha_secondary_check -s server03 -s server02
#shutdown_script=""
ssh_user=root

[server1]
hostname=172.25.38.1
port=3306

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

[server3]
hostname=172.25.38.3
port=3306
#no_master=1

这里写图片描述
建立免密连接:

[root@server1 masterha]# cd
[root@server1 ~]# ssh-keygen
Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
bf:ab:a3:a7:e2:7e:9f:1e:26:57:86:fa:08:49:0a:7e root@server1
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|         .       |
|.   .   S o      |
|.. o . . +       |
| ..Eo o + .      |
|  . ...*oo .     |
|   ooo+**oo.     |
+-----------------+
[root@server1 ~]# ssh-copy-id server1
[root@server1 ~]# ssh-copy-id 172.25.38.1
[root@server1 ~]# scp -r .ssh/ server2:/root
[root@server1 ~]# scp -r .ssh/ server3:/root

这里写图片描述
检查MHA Manger到所有MHA Node的SSH连接状态:

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

这里写图片描述

[root@server1 ~]# mysql -p  给root授权
mysql> grant all on *.* to root@'%' identified by 'Aa@+123456';
Query OK, 0 rows affected, 1 warning (0.04 sec)

这里写图片描述
通过masterha_check_repl脚本查看整个集群的状态:

[root@server1 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

这里写图片描述

手动切换:

将server1的master切换到server2上面:

[root@server1 ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.38.2 --new_master_port=3306 --orig_master_is_new_slave

这里写图片描述
在server2查看已经变成了master端

mysql> show slave status\G
Empty set (0.00 sec)

mysql> show master status;
+---------------+----------+--------------+------------------+----------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+---------------+----------+--------------+------------------+----------------------------------------+
| binlog.000001 |      434 |              |                  | 7f6de4ab-9d07-11e8-adc4-525400a2bcb9:1 |
+---------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)

这里写图片描述
在server1和server3查看slave状态中主端为server2:
这里写图片描述
这里写图片描述
在server2当前主端建立数据表:

mysql> use westos;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table linux(
    -> username varchar(10) not null,
    -> password varchar(10) not null);
Query OK, 0 rows affected (0.34 sec)

mysql> show tables;
+------------------+
| Tables_in_westos |
+------------------+
| linux            |
+------------------+
1 row in set (0.00 sec)

这里写图片描述
在server1和server3查看数据表,数据已经同步:
这里写图片描述
这里写图片描述

自动切换:

[root@server1 masterha]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_last_failover &
[1] 2743

[root@server1 masterha]# nohup: ignoring input and appending output to `nohup.out'
启动参数介绍:
--remove_dead_master_conf      该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
--manger_log                            日志存放位置
--ignore_last_failover                 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机
间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略
上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生
app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,
除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。

[root@server1 masterha]# ls
app1.cnf  app1.log  app1.master_status.health  nohup.out

这里写图片描述

2616 pts/0    S      0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --s
 2913 pts/0    Sl     0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
 2961 pts/0    R+     0:00 ps ax
[root@server2 ~]# kill -9 2616
[root@server2 ~]# kill -9 2913

这里写图片描述
在server3查看slave状态已经主端切换到了server1:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.38.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 674
               Relay_Log_File: server3-relay-bin.000002
                Relay_Log_Pos: 405
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

这里写图片描述
在server1查看状态:

mysql> show slave status\G
Empty set (0.00 sec)

mysql> show master status\G   server1变回了主端
*************************** 1. row ***************************
             File: binlog.000002
         Position: 674
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 0c3ea365-9d08-11e8-b4fb-525400e4f7b9:1-2,
7f6de4ab-9d07-11e8-adc4-525400a2bcb9:1
1 row in set (0.00 sec)

这里写图片描述
在server2查看master_host已经转换到server1:

mysql> change master to master_host='172.25.38.1' , master_user='repl' , master_password='Yakexi+007' , master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.65 sec)

mysql> start slave;
Query OK, 0 rows affected (0.05 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.38.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 674
               Relay_Log_File: server2-relay-bin.000002
                Relay_Log_Pos: 405
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

这里写图片描述
通过虚拟IP转换:

[root@server1 ~]# ls
master_ip_failover
master_ip_online_change
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
perl-Email-Date-Format-1.002-5.el6.noarch.rpm
perl-Log-Dispatch-2.27-1.el6.noarch.rpm
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
perl-MIME-Lite-3.027-2.el6.noarch.rpm
perl-MIME-Types-1.28-2.el6.noarch.rpm
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
send_report
[root@server1 ~]# vim 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.38.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr add $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";
}

[root@server1 ~]# vim master_ip_online_change 
#!/usr/bin/env perl
use strict;  
use warnings FATAL =>'all';  

use Getopt::Long;  

my $vip = '172.25.38.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 add $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;  
        }  
        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";  
}
[root@server1 ~]# ip addr add 172.25.38.100/24 dev eth0  添加虚拟IP

这里写图片描述

[root@server1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:a2:bc:b9 brd ff:ff:ff:ff:ff:ff
    inet 172.25.38.1/24 brd 172.25.38.255 scope global eth0
    inet 172.25.38.100/24 scope global secondary eth0
    inet6 fe80::5054:ff:fea2:bcb9/64 scope link 
       valid_lft forever preferred_lft forever
[root@server1 ~]# mv master_ip_* /usr/local/bin/
[root@server1 ~]# cd /usr/local/bin/
[root@server1 bin]# chmod +x master_ip_*  赋予脚本执行权限
[root@server1 bin]# ll
total 8
-rwxr-xr-x 1 root root 2172 Aug 11 14:56 master_ip_failover
-rwxr-xr-x 1 root root 3847 Aug 11 14:56 master_ip_online_change
[root@server1 bin]# cd /etc/masterha/
[root@server1 masterha]# ls
app1.cnf  app1.failover.complete  app1.log  nohup.out

这里写图片描述

[root@server1 masterha]# vim app1.cnf 打开注释行
[server default]
manager_workdir=/etc/masterha/
manager_log=/etc/masterha/app1.log
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=root
password=Aa@+123456
ping_interval=1
remote_workdir=/tmp
repl_user=repl
repl_password=Yakexi+007
#report_script=/usr/local/send_report
#secondary_check_script=/usr/local/bin/masterha_secondary_check -s server03 -s server02
#shutdown_script=""
ssh_user=root

[server1]
hostname=172.25.38.1
port=3306

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

[server3]
hostname=172.25.38.3
port=3306
#no_master=1
[root@server1 masterha]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_last_failover &
[1] 2841
[root@server1 masterha]# nohup: ignoring input and appending output to `nohup.out'

[root@server1 masterha]# ps ax
 2357 pts/0    S      0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --s
 2654 pts/0    Sl     0:05 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql
 2710 ?        S      0:00 pickup -l -t fifo -u
 2841 pts/0    S      0:00 perl /usr/bin/masterha_manager --conf=/etc/masterha/app1.
 2952 pts/0    R+     0:00 ps ax
[root@server1 masterha]# kill -9 2357   杀死mysql的进程
[root@server1 masterha]# kill -9 2654

这里写图片描述
在主机用虚拟IP登陆:

[root@foundation38 kiosk]# mysql -h 172.25.38.100 -u root -p
MySQL [(none)]> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [westos]> select * from linux;
+----------+----------+
| username | password |
+----------+----------+
| 1        | aa       |
+----------+----------+
1 row in set (0.00 sec)

MySQL [westos]> insert into linux values('2','bb');  插入数据
Query OK, 1 row affected (0.08 sec)

这里写图片描述
在server2和server3登陆查看字段信息已经同步:
这里写图片描述
这里写图片描述
虚拟IP也调转到了server2,server2变成了master:
这里写图片描述
在server1重新连接授权也可以看到字段信息,简单的高可用搭建完成:

[root@server1 masterha]# /etc/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[root@server1 masterha]# mysql -pAa@+123456
mysql> change master to master_host='172.25.38.2' , master_user='repl' , master_password='Yakexi+007' , master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.65 sec)

mysql> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from linux;
+----------+----------+
| username | password |
+----------+----------+
| 1        | aa       |
| 2        | bb       |
+----------+----------+
2 rows in set (0.00 sec)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/81583657
今日推荐