Mysql-MHA高可用实验测试

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

说明:

centos 6.5  mysql 5.5.37  mha4mysql-manager-0.55  mha4mysql-node-0.54

manager 192.168.1.1   mha-manager管理端
db1 192.168.1.2           现有主库
db2 192.168.1.3           即将做双主的数据库
db3 192.168.1.4           现有从库


配置mysql主从
db1主库:

server-id = 1
log-bin=mysql-bin
binlog_format=mixed

db2主库:

server-id = 2
log-bin=mysql-bin
binlog_format=mixed

relay_log_purge=0

db3从库:
server_id   = 3

log_bin    = mysql-bin

relay_log    = mysql-relay-bin

max_relay_log_size = 2G

log_slave_updates = 1
read_only   = 1

relay_log_purge=0

db1主    (现有的主库)

1
2
3
4
5
6
7
grant replication slave on *.* to mharep@ '192.168.1.%'  identified by  'passwd' ;
flush privileges;
stop slave;
#设置复制权限帐号
GRANT ALL PRIVILEGES ON *.* TO  'mha_manager' @ '192.168.1.%'  IDENTIFIED BY  '123456' ;
reset master;
show master status\G

db2备  (即将做双主的这台机)

1
2
3
4
5
6
7
8
grant replication slave on *.* to mharep@ '192.168.1.%'  identified by  'passwd' ;
GRANT ALL PRIVILEGES ON *.* TO  'mha_manager' @ '192.168.1.%'  IDENTIFIED BY  '123456' ;
flush privileges;
reset master;
slave stop;
change master to MASTER_HOST= '192.168.1.2' , MASTER_PORT=3306,MASTER_USER= 'mharep' , MASTER_PASSWORD= 'passwd' ,master_log_file= 'mysql-bin.000001' , master_log_pos=107;
slave start;
show slave status\G;

db3从  (现有的从库)

1
2
3
4
5
6
7
reset master;
slave stop;
GRANT ALL PRIVILEGES ON *.* TO  'mha_manager' @ '192.168.1.%'  IDENTIFIED BY  '123456' ;
flush privileges;
change master to MASTER_HOST= '192.168.1.2' , MASTER_PORT=3306,MASTER_USER= 'mharep' , MASTER_PASSWORD= 'passwd' ,master_log_file= 'mysql-bin.000001' , master_log_pos=107;
slave start;
show slave status\G;


配置双机互信
manager

1
2
ssh -keygen -t rsa
for  in  db1 db2 db3; do  ssh -copy- id  -i ~/. ssh /id_rsa .pub root@$i; done

db1主

1
2
ssh -keygen -t rsa 
for  in  manager db2 db3; do  ssh -copy- id  -i ~/. ssh /id_rsa .pub root@$i; done

db2备 和 db3从 配置略

/usr/sbin/ntpdate 132.163.4.101   请把时间同步


安装mysql-MHA
https://downloads.mariadb.com/files/MHA

1
2
wget https: //downloads .mariadb.com /files/MHA/mha4mysql-manager-0 .55-0.el6.noarch.rpm
wget https: //downloads .mariadb.com /files/MHA/mha4mysql-node-0 .54-0.el6.noarch.rpm

db1主 db2备 db3从
yum install perl-DBD-MySQL 
yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm

 

manager

1
2
yum  install  perl cpan
yum  install  perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager

#这两个yum没有安装上 perl-Log-Dispatch perl-Parallel-ForkManager 

1
2
3
4
wget http: //rpmfind .net /linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Log-Dispatch-2 .26-1.el6.rf.noarch.rpm
wget  ftp : //rpmfind .net /linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Parallel-ForkManager-0 .7.5-2.2.el6.rf.noarch.rpm
wget  ftp : //rpmfind .net /linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Mail-Sender-0 .8.16-1.el6.rf.noarch.rpm
wget  ftp : //rpmfind .net /linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Mail-Sendmail-0 .79-1.2.el6.rf.noarch.rpm
1
2
3
4
5
6
rpm -ivh perl-Mail-Sender-0.8.16-1.el6.rf.noarch.rpm 
rpm -ivh perl-Mail-Sendmail-0.79-1.2.el6.rf.noarch.rpm
yum localinstall perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
yum localinstall perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm
yum localinstall mha4mysql-manager-0.55-0.el6.noarch.rpm

配置mysql-MHA

1
2
3
4
5
6
7
8
9
[root@manager ~] # masterha_<Tab>
masterha_check_repl       masterha_conf_host        masterha_master_switch
masterha_check_ssh        masterha_manager          masterha_secondary_check
masterha_check_status     masterha_master_monitor   masterha_stop
tar  -xzf mha4mysql-manager-0.55. tar .gz   #
ls  mha4mysql-manager-0.55 /samples/conf   #大家了解mha自带的配置文件,可忽略
masterha_default.cnf    app1.cnf
mkdir  -p  /usr/local/mha/scripts
cp  mha4mysql-manager-0.55 /samples/scripts/ /usr/local/mha/scripts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@manager ~] # vim /usr/local/mha/mha.conf #根据自己的mysql配置改动
[server default]
user=mha_manager                               #mha管理的用户名
password=123456
manager_workdir= /usr/local/mha
manager_log= /usr/local/mha/manager .log
remote_workdir= /usr/local/mha
ssh_user=root                                 #上面双机互信的用户
repl_user=mharep                              #mysql复制(同步)的用户名
repl_password= passwd
ping_interval=1
  
#下面是mysql检测设置
secondary_check_script= masterha_secondary_check -s 192.168.1.2 -s 192.168.1.3 -s 192.168.1.4
#master_ip_failover_script=/usr/local/mha/scripts/master_ip_failover
#shutdown_script= /usr/local/mha/scripts/power_manager
report_script=  /usr/local/mha/scripts/send_report
master_ip_online_change_script=  /usr/local/mha/scripts/master_ip_online_change
  
[server1]
hostname =192.168.1.2      #写ip或者主机名都可以
ssh_port=22
master_binlog_dir= /var/mysql/log
candidate_master=1
[server2]
hostname =192.168.1.3
ssh_port=22
master_binlog_dir= /var/mysql/log
candidate_master=1
[server3]
hostname =192.168.1.4
ssh_port=22
master_binlog_dir= /var/mysql/log
no_master=1


#验证ssh通讯
masterha_check_ssh  --conf=/usr/local/mha/mha.conf

wKioL1SueDOSfVm9AAZR6Nm0jAQ282.jpg

 

#验证mysql复制

1
2
wget  ftp : //rpmfind .net /linux/dag/redhat/el6/en/x86_64/extras/RPMS/perl-Net-Telnet-3 .03-2.el6.rfx.noarch.rpm
yum localinstall perl-Net-Telnet-3.03-2.el6.rfx.noarch.rpm

   

#mysql必须都启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
[root@manager ~] # masterha_check_repl --conf=/usr/local/mha/mha.conf 
Thu Jan  8 18:05:40 2015 - [warning] Global configuration  file  /etc/masterha_default .cnf not found. Skipping.
Thu Jan  8 18:05:40 2015 - [info] Reading application default configurations from  /usr/local/mha/mha .conf..
Thu Jan  8 18:05:40 2015 - [info] Reading server configurations from  /usr/local/mha/mha .conf..
Thu Jan  8 18:05:40 2015 - [info] MHA::MasterMonitor version 0.55.
Thu Jan  8 18:05:40 2015 - [info] Dead Servers:
Thu Jan  8 18:05:40 2015 - [info] Alive Servers:
Thu Jan  8 18:05:40 2015 - [info]   192.168.1.2(192.168.1.2:3306)
Thu Jan  8 18:05:40 2015 - [info]   192.168.1.3(192.168.1.3:3306)
Thu Jan  8 18:05:40 2015 - [info]   192.168.1.4(192.168.1.4:3306)
Thu Jan  8 18:05:40 2015 - [info] Alive Slaves:
Thu Jan  8 18:05:40 2015 - [info]   192.168.1.3(192.168.1.3:3306)  Version=5.5.37-log (oldest major version between slaves) log-bin:enabled
Thu Jan  8 18:05:40 2015 - [info]     Replicating from 192.168.1.2(192.168.1.2:3306)
Thu Jan  8 18:05:40 2015 - [info]     Primary candidate  for  the new Master (candidate_master is  set )
Thu
  Jan  8 18:05:40 2015 - [info]   192.168.1.4(192.168.1.4:3306)  
Version=5.5.37-log (oldest major version between slaves) log-bin:enabled
Thu Jan  8 18:05:40 2015 - [info]     Replicating from 192.168.1.2(192.168.1.2:3306)
Thu Jan  8 18:05:40 2015 - [info]     Not candidate  for  the new Master (no_master is  set )
Thu Jan  8 18:05:40 2015 - [info] Current Alive Master: 192.168.1.2(192.168.1.2:3306)
Thu Jan  8 18:05:40 2015 - [info] Checking slave configurations..
Thu Jan  8 18:05:40 2015 - [info] Checking replication filtering settings..
Thu Jan  8 18:05:40 2015 - [info]  binlog_do_db= , binlog_ignore_db= 
Thu Jan  8 18:05:40 2015 - [info]  Replication filtering check ok.
Thu Jan  8 18:05:40 2015 - [info] Starting SSH connection tests..
Thu Jan  8 18:05:41 2015 - [info] All SSH connection tests passed successfully.
Thu Jan  8 18:05:41 2015 - [info] Checking MHA Node version..
Thu Jan  8 18:05:42 2015 - [info]  Version check ok.
Thu Jan  8 18:05:42 2015 - [info] Checking SSH publickey authentication settings on the current master..
Thu Jan  8 18:05:42 2015 - [info] HealthCheck: SSH to 192.168.1.2 is reachable.
Thu Jan  8 18:05:42 2015 - [info] Master MHA Node version is 0.54.
Thu Jan  8 18:05:42 2015 - [info] Checking recovery script configurations on the current master..
Thu
  Jan  8 18:05:42 2015 - [info]   Executing  command : save_binary_logs 
-- command = test  --start_pos=4 --binlog_dir= /var/mysql/log 
--output_file= /usr/local/mha/save_binary_logs_test 
--manager_version=0.55 --start_file=mysql-bin.000002 
Thu Jan  8 18:05:42 2015 - [info]   Connecting to root@192.168.1.2(192.168.1.2).. 
   Creating  /usr/local/mha  if  not exists..    ok.
   Checking output directory is accessible or not..
    ok.
   Binlog found at  /var/mysql/log , up to mysql-bin.000002
Thu Jan  8 18:05:42 2015 - [info] Master setting check  done .
Thu
  Jan  8 18:05:42 2015 - [info] Checking SSH publickey authentication and
  checking recovery script configurations on all alive slave servers..
Thu
  Jan  8 18:05:42 2015 - [info]   Executing  command 
apply_diff_relay_logs -- command = test  --slave_user= 'mha_manager' 
--slave_host=192.168.1.3 --slave_ip=192.168.1.3 --slave_port=3306 
--workdir= /usr/local/mha  --target_version=5.5.37-log 
--manager_version=0.55 --relay_log_info= /var/mysql/data/relay-log .info  
--relay_dir= /var/mysql/data/   --slave_pass=xxx
Thu Jan  8 18:05:42 2015 - [info]   Connecting to root@192.168.1.3(192.168.1.3:22).. 
   Checking slave recovery environment settings..
     Opening  /var/mysql/data/relay-log .info ... ok.
     Relay log found at  /var/mysql/data , up to mysql-relay-bin.000007
     Temporary relay log  file  is  /var/mysql/data/mysql-relay-bin .000007
     Testing mysql connection and privileges..  done .
     Testing mysqlbinlog output..  done .
     Cleaning up  test  file (s)..  done .
Thu
  Jan  8 18:05:42 2015 - [info]   Executing  command 
apply_diff_relay_logs -- command = test  --slave_user= 'mha_manager' 
--slave_host=192.168.1.4 --slave_ip=192.168.1.4 --slave_port=3306 
--workdir= /usr/local/mha  --target_version=5.5.37-log 
--manager_version=0.55 --relay_log_info= /var/mysql/data/relay-log .info  
--relay_dir= /var/mysql/data/   --slave_pass=xxx
Thu Jan  8 18:05:42 2015 - [info]   Connecting to root@192.168.1.4(192.168.1.4:22).. 
   Checking slave recovery environment settings..
     Opening  /var/mysql/data/relay-log .info ... ok.
     Relay log found at  /var/mysql/data , up to mysql-relay-bin.000006
     Temporary relay log  file  is  /var/mysql/data/mysql-relay-bin .000006
     Testing mysql connection and privileges..  done .
     Testing mysqlbinlog output..  done .
     Cleaning up  test  file (s)..  done .
Thu Jan  8 18:05:43 2015 - [info] Slaves settings check  done .
Thu Jan  8 18:05:43 2015 - [info] 
192.168.1.2 (current master)
  +--192.168.1.3
  +--192.168.1.4
Thu Jan  8 18:05:43 2015 - [info] Checking replication health on 192.168.1.3..
Thu Jan  8 18:05:43 2015 - [info]  ok.
Thu Jan  8 18:05:43 2015 - [info] Checking replication health on 192.168.1.4..
Thu Jan  8 18:05:43 2015 - [info]  ok.
Thu Jan  8 18:05:43 2015 - [info] Checking master_ip_failover_script status:
Thu
  Jan  8 18:05:43 2015 - [info]   
/usr/local/mha/scripts/master_ip_failover  -- command =status 
--ssh_user=root --orig_master_host=192.168.1.2 
--orig_master_ip=192.168.1.2 --orig_master_port=3306
 
IN
  SCRIPT TEST==== /sbin/ifconfig  eth0:1 down== /sbin/ifconfig  eth0:1 
192.168.1.100; /sbin/arping  -I eth0 -c 3 -s 192.168.1.100 192.168.1.1 
> /dev/null  2>&1===
Checking the Status of the script.. OK 
Thu Jan  8 18:05:46 2015 - [info]  OK.
Thu Jan  8 18:05:46 2015 - [warning] shutdown_script is not defined.
Thu Jan  8 18:05:46 2015 - [info] Got  exit  code 0 (Not master dead).
MySQL Replication Health is OK.

 

启动MHA

mv /usr/local/mha/scripts/master_ip_failover /usr/local/mha/scripts/master_ip_failover.def

vim /usr/local/mha/scripts/master_ip_failover 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/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 =  '192.168.1.100' # Virtual IP
my $gateway =  '192.168.1.1' #Gateway IP
my $interface =  'eth0' ;
my $key =  "1" ;
my $ssh_start_vip =  "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1" ;
my $ssh_stop_vip =  "/sbin/ifconfig $interface:$key down" ;
  
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'