目录
一:MHA概述1.1:什么是MHA1.2:MHA的组成1.3:MHA有什么特点1.4:MHA形成的原因
二:MHA实验2.1:实验目的2.2:实验过程2.2.1:搭建mysql主从复制2.2.2:所有节点安装环境和Node组件和Manager组件2.2.3:配置节点间免交互登录2.2.4:配置MHA-Manager组件2.2.5:测试SSH与MySQL中从连接2.2.6:配置虚拟IP,启动MHA2.2.7:故障模拟
2.3:实验验证2.3.1:主服务器变更成功2.3.2:尝试从客户端通过虚拟IP连接数据库
一:MHA概述
1.1:什么是MHA
日本DeNA公司 youshimaton(现就职于 Facebook公司)开发一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件支持故障切换在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成
1.2:MHA的组成
MHA Manager(管理节点)
用来接收外部信号
MHA Node(数据节点)
工作的单位,负责具体的工作
1.3:MHA有什么特点
自动故障切换过程,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不会丢失使用MySQL55的半同步复制,可以大大降低数据丢失的风险
1.4:MHA形成的原因
传统mysql主从架构存在单点故障的风险 传统架构中,只有一个MySQL主服务器,所以当出现单点故障的时候,整个服务器群集就会瘫痪为了解决这种情况,我们需要在主服务器宕机的时候,重新建立一台主服务器,负责监控工作
二:MHA实验
2.1:实验目的
通过MHA监控MySQL数据库,在故障时自动切换,不影响业务当主库失效时,备选主库自动成为主库
2.2:实验过程
centos7使用的MHA版本为0.57,centos6使用的MHA版本则为0.56
2.2.1:搭建mysql主从复制
链接: https://blog.csdn.net/weixin_48190860/article/details/109190822
所有数据库授权mha用户对数据库的操作权限,每一个mysql数据库都要设置
'//下面三条授权按理论是不用添加的,但是做案例实验环境时候诵过MHA检查MySQL主从有报错,报两个从库通过主机名连接不上主库,所以所有数据库加上下面的授权;'
mysql
> grant all privileges on *.* to
'mha'@
'master' identified by
'manager';
mysql
> grant all privileges on *.* to
'mha'@
'slave1' identified by
'manager';
mysql
> grant all privileges on *.* to
'mha'@
'slave2' identified by
'manager';
'//三台mysql服务器的授权增加一个给mha管理'
mysql
> grant all privileges on *.* to
'mha'@
'192.168.79.%' identified by
'manager';
'//主备mysql服务器添加用户和权限'
'//192.168.79.0段的从服务器拥有复制权限,可以使用myslave身份123456密码复制所有的库和表'
mysql
> GRANT REPLICATION SLAVE ON *.* TO
'myslave'@
'192.168.79.%' IDENTIFIED BY
'123456';
slave1和slave2两个从数据库设置为只读
mysql
> set global read_only
=1
;
所有slave节点配置二进制日志,注释掉client段的默认字符集
[root@slave1 ~
]
[mysqld
]段落添加
log-bin
=slave1-bin
'//添加二进制日志'
所以slave节点都要配置,我就不一一展示了
'//从服务器上都注释掉client段的默认字符集'
[root@slave1 ~
]
[client
]
创建软连接(便于系统识别管理)
所有节点创建软连接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/
创建mysql软连接
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/
2.2.2:所有节点安装环境和Node组件和Manager组件
所有服务器上都要安装mha依赖的环境
[root@mha_manager ~
]
[root@mha_manager ~
]
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
所有服务器都安装安装node组件
[root@master ~
]
[root@master ~
]
[root@master mha4mysql-node-0.57
]
[root@master mha4mysql-node-0.57
]
==> Auto-install the 1 mandatory module
(s
) from CPAN?
[y
] y
'//输入y'
[root@master mha4mysql-node-0.57
]
[root@master mha4mysql-node-0.57
]
仅mha_manager服务器安装manager组件 这里需要注意:安装Manager之前要安装好Node组件
[root@mha_manager ~
]
[root@mha_manager ~
]
[root@mha_manager mha4mysql-manager-0.57
]
[root@mha_manager mha4mysql-manager-0.57
]
[root@mha_manager mha4mysql-manager-0.57
]
2.2.3:配置节点间免交互登录
mha_manager主机配置到所有数据库节点的密钥对验证
[root@mha_manager ~
]
'//创建非对称密钥对'
'//因为想要免密登陆,所以三个都直接回车就行,不需要设置密码'
Enter
file in which to save the key
(/root/.ssh/id_rsa
):
Enter passphrase
(empty
for no passphrase
):
Enter same passphrase again:
'//上传秘钥到节点服务器'
[root@mha_manager ~
]
Are you sure you want to
continue connecting
(yes/no
)?
yes
root@192.168.79.134
's password: //输入密码'
'//相同方法建立其他服务器'
[root@mha_manager ~
]
[root@mha_manager ~
]
在master上配置到数据库节点slave1和slave2的免密验证
[root@master mha4mysql-node-0.57
]
'//用上述方法建立其他服务器'
[root@master mha4mysql-node-0.57
]
[root@master mha4mysql-node-0.57
]
在slave1上配置到数据库节点master和slave2的免密验证
[root@slave1 ~
]
[root@slave1 ~
]
[root@slave1 ~
]
在slave2上配置到数据库节点master和slave1的免密验证
[root@slave2 ~
]
[root@slave2 ~
]
[root@slave2 ~
]
2.2.4:配置MHA-Manager组件
复制相关脚本到/usr/local/bin目录
[root@mha_manager ~
]
[root@mha_manager samples
]
-rwxr-xr-x. 1 1001 1001 3648 5月 31 2015 master_ip_failover 自动切换时 VIP管理的脚本
-rwxr-xr-x. 1 1001 1001 9870 5月 31 2015 master_ip_online_change 在线切换VIP的管理
-rwxr-xr-x. 1 1001 1001 11867 5月 31 2015 power_manager 故障发生后关闭主机的脚本
-rwxr-xr-x. 1 1001 1001 1360 5月 31 2015 send_report 因故障切换后发送报警的脚本
[root@mha_manager ~
]
修改master_ip_failover脚本
[root@mha_manager ~
]
'//删除内容,重新编写脚本'
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.79.100';
my
$brdc = '192.168.79.255';
my
$ifdev = 'ens33';
my
$key = '1';
my
$ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my
$ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my
$exit_code = 0
;
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
() {
`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";
}
创建MHA软件目录并拷贝配置文件
[root@mha_manager ~
]
[root@mha_manager ~
]
[root@mha_manager ~
]
'//删除内容,重新编写脚本'
[server default
]
manager_log
=/var/log/masterha/app1/manager.log
manager_workdir
=/var/log/masterha/app1
master_binlog_dir
=/usr/local/mysql/data
master_ip_failover_script
=/usr/local/bin/master_ip_failover
master_ip_online_change_script
=/usr/local/bin/master_ip_online_change
password
=manager
ping_interval
=1
remote_workdir
=/tmp
repl_password
=123456
repl_user
=myslave
secondary_check_script
=/usr/local/bin/masterha_secondary_check -s 192.168.79.135 -s 192.168.79.136
shutdown_script
=""
ssh_user
=root
user
=mha
[server1
]
hostname
=192.168.79.134
port
=3306
[server2
]
candidate_master
=1
hostname
=192.168.79.135
check_repl_delay
=0
port
=3306
[server3
]
hostname
=192.168.79.136
port
=3306
2.2.5:测试SSH与MySQL中从连接
验证密钥对
[root@mha_manager ~
]
Fri Jan 10 01:14:10 2020 -
[warning
] Global configuration
file /etc/masterha_default.cnf not found. Skipping.
Fri Jan 10 01:14:10 2020 -
[info
] Reading application default configuration from /etc/masterha/app1.cnf
..
Fri Jan 10 01:14:10 2020 -
[info
] Reading server configuration from /etc/masterha/app1.cnf
..
Fri Jan 10 01:14:10 2020 -
[info
] Starting SSH connection tests
..
Fri Jan 10 01:14:11 2020 -
[debug
]
Fri Jan 10 01:14:10 2020 -
[debug
] Connecting via SSH from root@192.168.79.135
(192.168.79.135:22
) to root@192.168.79.136
(192.168.79.136:22
)..
Fri Jan 10 01:14:11 2020 -
[debug
] ok.
Fri Jan 10 01:14:12 2020 -
[debug
]
Fri Jan 10 01:14:10 2020 -
[debug
] Connecting via SSH from root@192.168.79.136
(192.168.79.136:22
) to root@192.168.79.135
(192.168.79.135:22
)..
Fri Jan 10 01:14:11 2020 -
[debug
] ok.
Fri Jan 10 01:14:12 2020 -
[info
] All SSH connection tests passed successfully.
测试MySQL主从连接
[root@mha_manager ~
]
2.2.6:配置虚拟IP,启动MHA
添加虚拟IP
[root@master ~
]
启动MHA
[root@mha_manager ~
]
[root@mha_manager ~
]
'//查看到当前的master节点是谁'
[root@mha_manager ~
]
'//查看当前日志信息'
[root@mha_manager ~
]
2.2.7:故障模拟
启动监控观察日志记录
[root@mha_manager ~
]
关闭master数据库
[root@master ~
]
2.3:实验验证
2.3.1:主服务器变更成功
此时发现主服务器已经变更成功
slave查看
[root@slave1 ~
]
ens33: flags
=4163
<UP,BROADCAST,RUNNING,MULTICAST
> mtu 1500
inet 192.168.79.135 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 fe80::159a:a8d1:5769:74d0 prefixlen 64 scopeid 0x20
<link
>
ether 00:0c:29:34:57:c1 txqueuelen 1000
(Ethernet
)
RX packets 347068 bytes 28229347
(26.9 MiB
)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 528201 bytes 67755670
(64.6 MiB
)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags
=4163
<UP,BROADCAST,RUNNING,MULTICAST
> mtu 1500
inet 192.168.79.100 netmask 255.255.255.0 broadcast 192.168.79.255
ether 00:0c:29:34:57:c1 txqueuelen 1000
(Ethernet
)
mha_manager查看
'//会动态显示后续信息'
Generating relay
diff files from the latest slave succeeded.
192.168.79.136
(192.168.79.136:3306
): OK: Applying all logs succeeded. Slave started, replicating from 192.168.79.135
(192.168.79.135:3306
)
192.168.79.135
(192.168.79.135:3306
): Resetting slave info succeeded.
Master failover to 192.168.79.135
(192.168.79.135:3306
) completed successfully.
2.3.2:尝试从客户端通过虚拟IP连接数据库
直接在mha_manager上安装mysql
[root@mha_manager ~
]
在vip的数据库服务器上提取
[root@slave1 ~
]
Enter password:
mysql
> grant all on *.* to
'root'@
'%' identified by
'abc123';