目录
MySQL Master High Availability(MHA)是一个开源的高可用性解决方案,专为MySQL数据库设计。它由Percona公司开发,旨在帮助确保MySQL数据库的高可用性和自动化故障转移。让我们详细了解一下MySQL MHA的工作原理、优势以及如何配置和管理。
工作原理
Node(节点)
在MHA中,Node指的是MySQL数据库服务器的实例,包括主节点(Master)和备用节点(Slave)。每个Node都需要安装MySQL实例,并参与主从复制的架构。以下是Node的一些关键功能和特点:
-
主节点(Master):主节点是负责处理写操作的MySQL实例。它接收来自应用程序的写入请求,并将这些变更传播到备用节点。
-
备用节点(Slave):备用节点是从主节点复制数据的MySQL实例。它们负责处理读操作,并且在主节点发生故障时可以被提升为新的主节点。
-
数据同步:Node之间通过MySQL的主从复制功能进行数据同步。主节点上的更改会被传播到备用节点,保持数据一致性。
-
检查节点健康:MHA中的Node会定期向Manager报告自己的状态,包括健康状态、复制延迟等信息。
-
故障转移候选者:在主节点发生故障时,备用节点会竞争成为新的主节点。Node之间的配置会影响到MHA在选择新主节点时的优先级。
Manager(管理器)
Manager是MHA中的中央控制器,负责监控和管理整个MySQL高可用性集群。它的主要功能包括:
-
故障检测:Manager定期检查Node的状态,包括主节点和备用节点。当检测到主节点故障时,Manager会触发故障转移过程。
-
故障转移决策:一旦检测到主节点故障,Manager会根据预设的策略和配置,选择合适的备用节点提升为新的主节点。它会考虑到复制延迟、节点健康状态等因素做出决策。
-
管理复制:Manager负责管理主从复制的配置。它可以自动更新备用节点的复制配置,以便它们连接到新的主节点。
-
SSH连接:Manager使用SSH连接到Node,执行必要的操作,如关闭旧的主节点等。
-
通知和日志:Manager会记录故障转移的过程和结果,并且可以向管理员发送通知,包括故障转移的开始、结束等信息。
Node和Manager的协作
在MHA中,Node和Manager之间通过SSH和MySQL复制协议进行通信和协作。Node定期向Manager报告自己的状态,Manager根据这些状态信息和预设的策略来做出故障转移的决策。一旦Manager触发了故障转移,它会与Node一起协作,完成故障转移过程,并确保新的主节点正常运行。
故障转移流程
当MHA监测到MySQL主节点出现故障时,它会自动启动故障转移流程。下面是简化的故障转移流程:
-
检测故障:管理节点(manager node)定期检查主节点的状态。当发现主节点不可用时,会触发故障转移。
-
选举新主节点:MHA会从备用节点中选举一个新的主节点。选举过程考虑了各个备用节点的复制延迟和可用性,选择最适合的节点作为新的主节点。
-
停止旧主节点:MHA使用SSH连接到旧的主节点,并在新主节点上线后,停止旧主节点上的MySQL服务。
-
重新配置其他节点:MHA会自动更新其他节点的配置文件,将它们的主节点指向新的主节点。
-
完成故障转移:一旦新的主节点上线并正常运行,MHA会通知应用程序可以重新连接到新的主节点上。
优势
使用MySQL MHA的主要优势包括:
-
自动化故障转移:MHA能够自动检测主节点故障并执行故障转移流程,无需人工干预,减少了服务中断的时间。
-
快速恢复:MHA的故障转移过程非常迅速,可以快速将备用节点提升为新的主节点,降低了系统不可用的风险。
-
高可靠性:MHA经过了广泛的生产环境验证,被认为是一个稳定可靠的解决方案。
-
灵活性:MHA支持多种故障转移策略和配置选项,可以根据实际需求进行定制。
配置和管理
要配置和管理MySQL MHA,通常需要以下步骤:
-
安装MHA工具包:从Percona的官方网站下载MHA工具包,并按照说明进行安装。
-
配置MHA:编辑MHA的配置文件,指定MySQL主从复制的拓扑、监控节点、故障转移的参数等。
-
初始化MHA :运行
masterha_check_ssh
和masterha_check_repl
命令来检查SSH和复制的配置。 -
启动MHA管理节点 :运行
masterha_manager
命令启动MHA的管理节点,开始监控MySQL集群的状态。 -
测试故障转移:模拟主节点故障,观察MHA是否能够自动进行故障转移并恢复。
配置主从复制
配置master
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
systemctl restart mysqld.service
配置slave
vim /etc/my.cnf
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
在master和所有slave上创建软连接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
-
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
这个命令创建了一个名为
mysql
的软链接,指向了/usr/local/mysql/bin/mysql
这个MySQL客户端的可执行文件。这样做的目的是为了让系统在/usr/sbin/
目录下也有一个mysql
命令的快捷方式,这样系统中的任何用户都可以直接在命令行中输入mysql
来启动MySQL客户端。 -
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
这个命令创建了一个名为
mysqlbinlog
的软链接,指向了/usr/local/mysql/bin/mysqlbinlog
这个MySQL二进制日志查看工具的可执行文件。同样的,这样做的目的是让系统中的任何用户都可以直接在命令行中输入mysqlbinlog
来启动MySQL二进制日志查看工具。
对所有数据库进行互相授权
grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';
grant all privileges on *.* to 'mha'@'192.168.1.%' identified by 'manager';
grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
flush privileges;
查看二进制日志同步点
show master status;
在所有slave上指定主服务器(不要直接复制,注意ip和同步点)
change master to master_host='192.168.1.22',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1743;
start slave;
查看同步状态
show slave status\G;
在主服务器创建数据库和表并在从服务器验证
MHA实现高可用
安装MHA依赖环境
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
在所有服务器安装node
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
安装manager
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
配置ssh无密码登录
在 manager 节点上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.1.22
ssh-copy-id 192.168.1.33
ssh-copy-id 192.168.1.44
在 master 上配置到数据库节点 slave1 和 slave2 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.1.33
ssh-copy-id 192.168.1.44
在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.1.22
ssh-copy-id 192.168.1.44
在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.1.22
ssh-copy-id 192.168.1.33
在 manager 上配置 MHA(注意要设置set paste)
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
vim /usr/local/bin/master_ip_failover
:set paste
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';
my $brdc = '192.168.1.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;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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 \"`;
}
## A simple system call that disable the VIP on the old_master
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的master_ip_failover
配置文件是用于MySQL高可用性(HA)架构中的一个重要组件。当MySQL主服务器发生故障时,master_ip_failover
脚本负责将虚拟IP(VIP)从故障的主服务器迁移到新的主服务器,以确保服务的连续性和可用性。这个过程通常涉及到以下几个步骤:
- 停止旧主服务器上的VIP:这确保了没有新的连接会到达已经故障的服务器。
- 在新的主服务器上启动VIP:这使得新的主服务器可以开始接受客户端的连接。
- 更新DNS记录(如果使用DNS来管理VIP):这确保了所有新的连接都会被指向新的主服务器。
创建 MHA 软件目录并复制配置文件
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
[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=myslavesecondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.1.33 -s 192.168.1.44
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.1.22
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.1.33
port=3306
[server3]
hostname=192.168.1.44
port=3306
在MHA中,app1是MHA的配置文件之一,用于配置MHA对MySQL主从复制集群的监控和管理。以下是app1配置文件的一些常见作用和配置项:
-
定义MySQL的主从结构:在app1配置文件中,你可以定义MySQL主服务器和从服务器的IP地址、端口号等信息。这样MHA就知道哪些服务器是主服务器,哪些是从服务器。
-
监控参数:你可以配置MHA如何监控MySQL服务器的健康状态。例如,可以配置检查MySQL进程是否存活、检查复制延迟等。
-
故障检测和切换:定义在哪些情况下MHA应该进行故障检测,并在检测到故障时如何自动切换到备用服务器。
-
SSH连接参数:配置MHA连接到MySQL服务器所需的SSH参数,包括SSH用户、SSH端口等。
-
自定义脚本和命令:你可以指定在故障发生或切换发生时执行的自定义脚本和命令,以便在自动切换过程中执行特定的操作。
-
Failover优先级:定义了故障发生时应该优先选择哪个备用服务器作为新的主服务器。
在master上手动开启虚拟ip
/sbin/ifconfig ens33:1 192.168.1.100/24
在manager上测试无密码登录
masterha_check_ssh -conf=/etc/masterha/app1.cnf
在manager上测试连接情况
masterha_check_repl -conf=/etc/masterha/app1.cnf
启动MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
-
nohup
: 这是一个 Linux 命令,用于让命令在后台运行,并且不受终端关闭的影响。即使用户注销或者关闭终端,命令也会继续运行。 -
masterha_manager
: 这是 MySQL MHA 工具包中的一个命令,用于启动 MHA 的管理器(manager)。masterha_manager
负责监控 MySQL 主从复制集群的状态,并在主节点故障时执行自动故障转移。 -
--conf=/etc/masterha/app1.cnf
: 这个参数指定了 MHA 的配置文件路径。在这里,/etc/masterha/app1.cnf
是您的 MHA 配置文件的路径。 -
--remove_dead_master_conf
: 这个参数告诉masterha_manager
在发现主节点(master)死掉后,将主节点的配置信息从 MHA 配置文件中删除。 -
--ignore_last_failover
: 这个参数告诉masterha_manager
忽略上一次故障转移的信息,以避免重复执行故障转移。 -
< /dev/null
: 这个部分将输入重定向到/dev/null
,表示不从标准输入中读取任何内容。 -
> /var/log/masterha/app1/manager.log 2>&1
: 这个部分将标准输出和标准错误输出重定向到指定的日志文件中。即将masterha_manager
的输出写入到/var/log/masterha/app1/manager.log
日志文件中。 -
&
: 这个符号表示将命令放到后台执行,这样当前终端可以继续输入其他命令。
最后,[1] 18318
是命令的输出,表示 masterha_manager
进程已经在后台启动,并且它的进程 ID 是 18318
。这样,masterha_manager
就会在后台运行,不受终端关闭的影响,并且将输出写入到指定的日志文件中,用于查看 MHA 的运行日志和状态。
查看MHA状态
masterha_check_status --conf=/etc/masterha/app1.cnf