MySQL MHA 集群
[toc]
MHA 简介
MHA ( Master High Availability )
- youshimaton 开发 https://github.com/yoshinorim
- 一套优秀的实现 MySQL 高可用的解决方案
- 数据库的自动故障切换操作能做到在 0~30 秒之内
- MHA 能确保在故障切换过程中保证数据的一致性,以达到真正意义上的高可用
MHA 组成
-
MHA Manager ( 管理节点 )
可以单独部署在一台独立的机器上,管理其他节点
也可以部署在一台slave节点上
-
MHA Node ( 数据节点 )
运行在每台MySQL服务器上
MHA 工作过程
- 由 Manager 定时探测集群中的 master 节点
- 当 master 故障时,Manager 自动将拥有最新数据的 slave 提升为新的 master
- 关键点
- 从宕机崩溃的 master 保存二进制日志事件
- 识别含有最新更新的 slave
- 应用差异的中继日志 ( relay log ) 到其他的 slave
- 应用从 master 保存的二进制日志事件
- 提升一个slave为新的master
- 使其他的slave 连接新的 master 进行复制
部署 MHA 集群
部署MySQL 高可用集群 ( MHA + 主从同步 )
1549818084936拓扑结构
拓扑图
1549817915989IP 规划
角色 | IP地址 | 主机名 |
---|---|---|
Master主节点 | 192.168.1.101 | test1 |
备用1主节点 | 192.168.1.102 | test2 |
备用2主节点 | 192.168.1.103 | test3 |
第一台slave | 192.168.1.104 | test4 |
第二台slave | 192.168.1.105 | test5 |
MHA_manager (无mysqld) | 192.168.1.106 | test6 |
VIP地址 | 192.168.1.100 |
开始部署
部署 数据主机
101 ~ 105
-
配置一主多从
主机 角色 数据主机 192.168.1.101 master 数据主机 192.168.1.102 slave 备用1主节点 数据主机 192.168.1.103 slave 备用2主节点 数据主机 192.168.1.104 slave 数据主机 192.168.1.105 slave 管理主机 192.168.1.106 manager -
安装依赖的 perl 软件包
#配置好 epel 源,yum node节点时,可自动安装以下 perl 依赖包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
- 安装软件 mha-node
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
- 配置数据节点 ssh 认证,彼此之间 root 用户无密码登陆
#配置好后可测试, mha_check_ssh 脚本也可测试.
ssh host hostname;
- 授权监控用户
# 为所有数据主机授权 root用户 管理主机访问监控使用
grant all on *.* to 'root'@'%' identified by '123456';
- 所有数据主机服务器启用不自动删除本机的中继日志文件
# 101~105
set global relay_log_purge=off;
# 永久配置
[mysqld]
relay_log_purge=off
- 主库 及 备用主库 特殊配置
# 为主库 和 备用主库 创建主从复制用户 repl
# 此拓扑中 为 192.168.1.102 和 103 添加 repl 用户,当默认主库宕机,接管主库的机器需要此用户用作新的主从同步.
grant replication slave on *.* to 'repl'@'%' identified by '123456'
# 为主库 和 备用主库 半同步复制 101~103
# 高可用架构下,master和slave需同时启动,以便在主从切换后能继续使用半同步复制
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
配置 管理主机
- 安装依赖的 perl 软件包
#配置好 epel 源,yum node节点时,可自动安装以下 perl 依赖包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
- 安装 node 和 manager 软件包
#先安装 node 节点包,manager 依赖 node
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
-
配置 ssh 认证, manager 主机,可以 使用 root 用户访问所有数据主机
-
修改配置文件
MHA 配置文件 app1.cnf
mkdir -p /etc/mha/
cat > /etc/mha/app1.cnf <<EOF
#默认配置 可单独写入 /etc/masterha_default.cnf
[server default]
manager_workdir=/etc/mha
manager_log=/etc/mha/manager.log
master_ip_failover_script=/etc/mha/master_ip_failover
# ssh 认证用户 端口
ssh_user=root
ssh_port=22
#主从用户 密码
repl_user=repl
repl_password=123123
# manager 主机监控用户 密码 访问所有 数据主机
user=root
password=123456
[server1]
hostname=192.168.1.101
#默认3306,可省略
port=3306
candidate_master=1
[server2]
hostname=192.168.1.102
#设置为候选master
candidate_master=1
[server3]
hostname=192.168.1.103
candidate_master=1
[server4]
hostname=192.168.1.104
#不竞选master
no_master=1
[server5]
hostname=192.168.1.105
no_master=1
EOF
master_ip_failover 脚本
脚本修改 25 - 28
my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
完整脚本,默认脚本无法正常执行
cat > /etc/mha/master_ip_failover << EOF
#!/usr/bin/env perl
# Copyright (C) 2011 DeNA Co.,Ltd.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
## Note: This is a sample script and is not complete. Modify the script based on your environment.
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
use MHA::DBHelper;
my (
$command, $ssh_user, $orig_master_host,
$orig_master_ip, $orig_master_port, $new_master_host,
$new_master_ip, $new_master_port, $new_master_user,
$new_master_password
);
my $vip = '192.168.1.100/24';
my $key = '1';
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,
'new_master_user=s' => \$new_master_user,
'new_master_password=s' => \$new_master_password,
);
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";
}
测试配置文件
测试 ssh 认证
masterha_check_ssh --conf=/etc/mha/app1.cnf
测试 主从 状态
masterha_check_repl --conf=/etc/mha/app1.cnf
启动服务
手动部署 vip 至 当前主库上
ifconfig eth0:1 192.168.1.100/24
常用参数
- 删除宕机主库配置
--remove_dead_master_conf
- 忽略xxx.health文件 ( 即8小时内 连续切换主库 )
--ignore_last_failover
启动命令
masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover
查看MHA运行状态
masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:8842) is running(0:PING_OK), master:192.168.1.101
测试高可用集群
- 客户端连接vip地址访问数据库
mysql -uweb -p123123 -h192.168.1.100
- 测试高可用
把主机 101 数据库服务停止,自动切换主库,和vip
mysql -uweb -p123123 -h192.168.1.100
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test1 |
+------------+
# 停止mysql 当前主库
systemctl stop mysqld
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test2 |
+------------+
恢复 MHA 集群
-
把宕机的数据库 A 服务器修复.
-
重新设置已修复 A 服务器 为当前主库的从库,保证数据主从同步.
生产环境,需要保证 A 数据先和 当前主库数据保持一致.
-
重新添加服务器 A 配置文件.至
app1.cnf
-
重新启动MHA,测试
网友评论