注意:后面由于填上来了脚本所有内容篇幅优点乱,读者可以参考复制
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线程)

实验环境:

很具体,这里就不重复多唠叨了**

主: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

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


由于从的配置文件只需要保证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/

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


进行主端节点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)

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


进行从端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 *

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


初始化数据库安装:

[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

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

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状态

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


解决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 保证数据同步

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


配置从端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:

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


搭建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 保证数据可以同步达成主从复制

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


测试在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的MYSQL高可用架构搭建(大神篇)_perl_10


在两个后端查看效果已经完成了主从复制:

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


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


搭建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

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


在server2和server3安装node模块:

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


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


在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

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


建立免密连接:

[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的MYSQL高可用架构搭建(大神篇)_mysql_17


检查MHA Manger到所有MHA Node的SSH连接状态:

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

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

[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)

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


通过masterha_check_repl脚本查看整个集群的状态:

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

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

手动切换:

将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

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


在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)

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


在server1和server3查看slave状态中主端为server2:

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


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


在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)

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


在server1和server3查看数据表,数据已经同步:

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


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

自动切换:

[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

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

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

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


在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

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


在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)

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


在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

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


通过虚拟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

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

[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

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

[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

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


在主机用虚拟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)

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


在server2和server3登陆查看字段信息已经同步:

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


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


虚拟IP也调转到了server2,server2变成了master:

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


在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)

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