MHA Manager(管理節點)
MHA Node(數據節點)
Manager工具:
1
2
3
4
5
6
7
|
#masterha_check_ssh : 檢查MHA的SSH配置。
#masterha_check_repl : 檢查MySQL複製。
#masterha_manager : 啓動MHA。
#masterha_check_status : 檢測當前MHA運行狀態。
#masterha_master_monitor : 監測master是否宕機。
#masterha_master_switch : 控制故障轉移(自動或手動)。
#masterha_conf_host : 添加或刪除配置的server信息。
|
1
2
3
4
|
#save_binary_logs : 保存和複製master的二進制日誌。
#apply_diff_relay_logs : 識別差別的中繼日誌事件並應用於其它slave。
#filter_mysqlbinlog : 去除沒必要要的ROLLBACK事件(MHA已再也不使用這個工具)。
#purge_relay_logs : 清除中繼日誌(不會阻塞SQL線程)。
|
1
2
3
4
|
192.168.56.100 master node
192.168.56.101 slave1 node
192.168.56.102 slave2(manager,node)
vip 192.168.56.123
|
1
2
3
4
|
ssh
-keygen -t dsa -P
''
-f id_dsa
Id_dsa.pub爲公鑰,id_dsa爲私鑰,緊接着將公鑰文件複製成authorized_keys文件,
這個步驟是必須的,過程以下:
cat
id_dsa.pub >> authorized_keys
|
1
2
|
ssh
-keygen -t dsa -P
''
-f id_dsa
cat
id_dsa.pub >> authorized_keys
|
1
2
|
ssh
-keygen -t dsa -P
''
-f id_dsa
cat
id_dsa.pub >> authorized_keys
|
1
2
|
scp
192.168.56.101:
/root/
.
ssh
/id_dsa
.pub .
/id_dsa
.pub.101
scp
192.168.56.102:
/root/
.
ssh
/id_dsa
.pub .
/id_dsa
.pub.102
|
1
2
3
|
合併密鑰:
cat
id_dsa.pub.101 >> authorized_keys
cat
id_dsa.pub.102 >> authorized_keys
|
1
2
|
scp
authorized_keys 192.168.56.101:
/root/
.
ssh
/
scp
authorized_keys 192.168.56.102:
/root/
.
ssh
/
|
1
2
3
4
|
vim
/etc/hosts
node1 192.168.56.100
node2 192.168.56.101
node3 192.168.56.102
|
1
2
3
4
5
6
7
8
9
|
在192.168.56.100執行
ssh
node2
ssh
node3
在192.168.56.101執行
ssh
node1
ssh
node3
在192.168.56.102執行
ssh
node1
ssh
node2
|
1
2
3
|
建立主從帳號:
grant replication slave on *.* to
'repl'
@
'192.168.56.%'
identified by
'repl'
;
flush privileges;
|
1
2
3
|
建立管理帳號:
grant all privileges on *.* to
'zs'
@
'192.168.56.%'
identified by
'123456'
;
flush privileges;
|
1
|
yum
install
perl-DBD-MySQL
|
1
|
tar
-zxvf mha4mysql-node-0.57.
tar
.gz
|
1
2
3
4
|
cd
mha4mysql-node-0.57
yum -y
install
perl-CPAN*
perl Makefile.PL
make
&&
make
install
|
1
2
3
4
5
|
yum
install
-y perl-DBD-MySQL*
rpm -ivh perl-Params-Validate-0.92-3.el6.x86_64.rpm
rpm -ivh perl-Config-Tiny-2.12-1.el6.rfx.noarch.rpm
rpm -ivh perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
rpm -ivh perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
|
1
2
3
4
5
|
tar
-zxvf mha4mysql-node-0.57.
tar
.gz
cd
mha4mysql-node-0.57
yum -y
install
perl-CPAN*
perl Makefile.PL
make
&&
make
install
|
1
2
3
4
|
tar
-zxvf mha4mysql-manager-0.57.
tar
.gz
perl Makefile.PL
make
make
install
|
1
2
|
mkdir
-p
/usr/local/mha
mkdir
-p
/etc/mhacd
/etc/mha/
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
編輯MHA配置文件
vim
/etc/mha/mha
.conf
[server default]
user=zs
password=123456
manager_workdir=
/usr/local/mha
manager_log=
/usr/local/mha/manager
.log
remote_workdir=
/usr/local/mha
ssh_user=root
repl_user=repl
repl_password=repl
ping_interval=1
master_ip_failover_script=
/usr/local/scripts/master_ip_failover
master_ip_online_change_script=
/usr/local/scripts/master_ip_online_change
|
1
2
3
4
5
6
|
[server1]
hostname
=192.168.56.100
ssh_port=22
master_binlog_dir=
/data/mysql
candidate_master=1
port=3306
|
1
2
3
4
5
6
|
[server2]
hostname
=192.168.56.101
ssh_port=22
master_binlog_dir=
/data/mysql
candidate_master=1
port=3306
|
1
2
3
4
5
6
|
[server3]
hostname
=192.168.56.102
ssh_port=22
master_binlog_dir=
/data/mysql
no_master=1
port=3306
|
1
|
mkdir
-p
/usr/local/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
|
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 =
'192.168.56.123/24'
;
my $key =
'0'
;
my $ssh_start_vip =
"/sbin/ifconfig eth0:$key $vip"
;
my $ssh_stop_vip =
"/sbin/ifconfig eth0:$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'
=> \$new_master_port,
);
exit
&main();
|
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
|
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;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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";
}
|
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
|
vim master_ip_online_change
#!/usr/bin/env perl
use strict;
use warnings FATAL =>
'all'
;
use Getopt::Long;
my $vip =
'192.168.1.123/24'
;
# Virtual IP
my $key =
"0"
;
my $ssh_start_vip =
"/sbin/ifconfig eth0:$key $vip"
;
my $ssh_stop_vip =
"/sbin/ifconfig eth0:$key down"
;
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();
|
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
|
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;
}
|
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
|
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=po
rt –new_master_host=host –new_master_ip=ip –new_master_port=port\n";
}
|
1
|
yum -y
install
perl-Time-HiRes
|
1
|
/usr/local/bin/masterha_check_ssh
--conf=
/etc/mha/mha
.conf
|
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
|
Sun Jul 23 09:39:09 2017 - [warning] Global configuration
file
/etc/masterha_default
.cnf not found. Skipping.
Sun Jul 23 09:39:09 2017 - [info] Reading application default configuration from
/etc/mha/mha
.conf..
Sun Jul 23 09:39:09 2017 - [info] Reading server configuration from
/etc/mha/mha
.conf..
Sun Jul 23 09:39:09 2017 - [info] Starting SSH connection tests..
Sun Jul 23 09:39:11 2017 - [debug]
Sun Jul 23 09:39:09 2017 - [debug] Connecting via SSH from root@192.168.56.100(192.168.56.100:22) to root@192.168.56.101(192.168.56.101:22)..
Sun Jul 23 09:39:10 2017 - [debug] ok.
|