深入浅出MHA(MySQL Master High Availability)集群:原理、部署与实践

目录

引言

一、MHA集群介绍

(一)什么是MHA

(二)MHA集群原理

(三)同步方式

(四)管理节点与数据节点

二、实现MHA

(一)搭建主从复制环境

1.搭建时间同步

2.配置master服务器

3.配置slave服务器

4.主从共同操作

5.从服务操作

(二)安装MHA所有组件

1.安装依赖环境

2.安装node软件包

3.安装manager组件

4.配置ssh免密登录

5.在manager节点上配置MHA

6.创建MHA软件目录

7.设置虚拟VIP

8.进行环境测试

9.启动MHA

10.查看信息

11.模拟故障

12.故障恢复

总结


引言

在当今高度依赖数据库的应用场景中,MySQL数据库的高可用性显得尤为重要。MHA(MySQL Master High Availability Manager)作为一种开源的MySQL高可用解决方案,以其自动化故障转移和恢复能力广受业界认可。本文将深入探讨MHA集群的原理、部署步骤及实践要点。

一、MHA集群介绍

(一)什么是MHA

MHA(Master High Availability)是一款专为MySQL设计的开源高可用解决方案,主要用于实现MySQL数据库的故障转移和主从复制管理,从而提高数据库服务的可靠性与可用性。MHA由日本人Yoshinori Matsunobu(后来加入Facebook)开发,特别适用于那些需要在主数据库发生故障时迅速切换到备用节点,同时保持数据一致性的场景。

(二)MHA集群原理

MHA由两部分构成:MHA Manager(管理节点)和MHA Node(数据节点)。在主从复制的MySQL集群中,MHA Manager负责监控主节点的健康状况,当主节点出现故障时,MHA Manager会自动选举出一个从节点升级为主节点,并协调其余从节点重新连接至新的主节点,实现无缝的故障转移。

监控与故障检测:MHA Manager通过心跳检测机制实时监控主节点状态,一旦检测到主节点失效,立即触发故障转移流程。

自动故障转移:基于预定义的故障转移策略,如优先级、数据延迟等指标,MHA会选择一个符合条件的从节点晋升为主节点。

数据一致性保证:MHA支持半同步复制和全局事务ID(GTID)复制,以确保故障转移前后数据的一致性。

(三)同步方式

同步复制:主库在接收到写请求后,会等待所有的从服务器同步完毕之后,才会返回给客户端

异步复制:MySQL主从复制默认采用异步复制方式,主库在接收到写请求后立即返回,无需等待从库确认,这种方式响应速度快,但可能存在一定的数据延迟

半同步复制:至少有一个从库接收到并执行完写操作后,主库才返回成功,提高了数据一致性。

(四)管理节点与数据节点

MHA Manager(管理节点)

MHA Manager是一个中心化的管理组件,通常部署在独立的服务器上,不直接处理数据库的读写请求。

它的主要职责是监控整个MySQL主从集群的健康状态,包括检测主节点是否在线、从节点的复制延迟等。

当主节点出现故障时,MHA Manager会自动执行故障转移流程,选择一个从节点升级为主节点,同时通知其他从节点改变复制源至新的主节点,并确保数据一致性。

MHA Manager还负责处理各种高级特性,比如半同步复制的管理、全局事务标识符(GTID)的支持、以及故障转移过程中的SQL线程暂停和恢复等。

MHA Node(数据节点)

MHA Node指的是参与MySQL主从复制集群中的所有数据库服务器,包括原来的主节点和从节点。

每个MHA Node都运行着MHA的Node Agent,用于与MHA Manager通信,报告自身状态和接收管理指令。

主节点主要负责处理写入请求和生成二进制日志,而从节点则通过复制主节点的二进制日志来保持数据同步,并在必要时准备晋升为主节点。

二、实现MHA

实现MHA高可用,首先是在实现主从复制的基础之上

环境准备

IP地址类型安装软件安装目录
192.168.83.20MySQL主服务器mysql5.7、MHA node 组件/usr/local/mysql
192.168.83.40MySQL从服务器1mysql5.7、MHA node 组件/usr/local/mysql
192.168.83.60MySQL从服务器2mysql5.7、MHA node 组件/usr/local/mysql
192.168.83.100MHA节点服务器MHA node 和 manager 组件/usr/bin
192.168.83.200VIP地址

(一)搭建主从复制环境

1.搭建时间同步

在构建MySQL主从复制架构时,确保主从服务器之间的系统时间同步是非常重要的。这是因为MySQL在处理事务和记录二进制日志时依赖于系统时间戳,时间不一致可能会导致主从复制出现问题,如数据不一致或复制中断

##主服务器设置##
yum install ntp -y
#下载ntp服务vim /etc/ntp.conf
--末尾添加--
server 127.127.10.0                            #设置本地是时钟源,注意修改网段
fudge 127.127.10.0 stratum 8                #设置时间层级为8(限制在15内)systemctl start ntpd
#启动服务##从服务器设置##
yum install ntp ntpdate -ysystemctl start ntpd
#启动服务/usr/sbin/ntpdate 192.168.83.20
#进行时间同步,192.168.83.20为master服务器ip地址crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.83.20

2.配置master服务器

2.1 修改配置文件

在/etc/my.cnf文件中添加下图字段,开启二进制日志


server-id = 1
#这个参数是为MySQL服务器分配的一个唯一标识号。在主从复制环境中,无论是主服务器还
#是从服务器,都必须设置一个唯一的server-id。log-bin=master-bin
#log-bin用于开启二进制日志,这是实现MySQL主从复制的关键特性。这里的master-bin是指定
#二进制日志的前缀名称,二进制日志文件将以master-bin.000001,master-bin.000002等格式生成。binlog_format = MIXED
#binlog_format 参数用于设置二进制日志记录格式。可能的值包括 STATEMENT、ROW 和 MIXED。
#MIXED 是一种混合模式,根据实际情况自动在STATEMENT和ROW模式之间切换。log-slave-updates=true
#当设置 log-slave-updates参数为true时,从服务器在执行主服务器传过来的更新时,也会把这些
#更新记录到自己的二进制日志中。这样一来,如果从服务器又被其他从服务器复制,那么这个从服务
#器也可以成为新的主服务器,形成级联复制链。

修改完毕之后重新启动服务:systemctl restart mysqld

grant #SQL命令,用于授予用户特定的权限。replication slave #指定要授予的权限类型,这里是与主从复制相关的权限on *.* #指定了授权范围,*分别代表所有数据库和所有表即此用户在任何数据库的所有表上都有复制权限。'myslave'@'192.168.83.%'
#定义了用户名及其允许连接的IP地址范围。这里创建了一个名为 'myslave' 的用户,并且允许来自
#192.168.83.0/24网段内的任何IP地址连接。百分号 % 表示任意主机名或IP地址。IDENTIFIED BY '123456' 
#设置用户的密码为'123456',当从服务器尝试连接主服务器进行同步时,需要使用该密码进行身份验证。

使用:show master status; 指令查询主服务器二进制日志状态的命令

File:当前二进制日志(Binary Log)文件的名称

Position:在当前二进制日志文件中的下一个事件(event)的位置。这个位置值对于从服务器而言至关重要,因为它需要从这个位置开始读取和执行主服务器上的事件,从而保持数据同步。

3.配置slave服务器

配置从服务器接收

在/etc/my.cnf文件中添加以下字段

server-id = 2
#该从服务器唯一标识符2log_bin = master-bin
#开启二进制日志文件,作为从服务器,同时为备用主服务器,当主服务器宕机时,本服务器替代为
#主服务器,生成二进制日志文件,供其它从服务器同步relay-log=relay-log-bin
#relay-log用于设置中继日志(Relay Log)的文件名前缀。
#接收到主服务器的二进制日志事件后,这些事件会先写入到中继日志中,然后再从中继日志中读取并执行
#这里设置为relay-log-bin,那么生成的中继日志文件会是类似于relay-log-bin.000001这样的格式。relay-log-index=slave-relay-bin.index
#relay-log-index用于设置中继日志索引文件的名称。中继日志索引文件记录了每个中继日志文件及其
#对应的第一条和最后一条事件的位置信息,便于从服务器快速定位到需要执行的事件。relay_log_recovery = 1
#relay_log_recovery用于决定在从服务器启动时是否自动从最后一个完整的事务处恢复中继日志的执行。
#当设置为1时,从服务器在启动时如果检测到中继日志中有未完成的事务,它会尝试从最后一个完成的事务
#开始继续执行,以保证数据的一致性和完整性。

修改完毕之后重新启动服务:systemctl restart mysqld

另一台从服务器同样操作

slave2配置

注意server-id的值不能与其它MySQL服务器相同,且本服务器不需要开启二进制日志

[root@slave2 ~]#vim  /etc/my.cnf
[root@slave2 ~]#sed -n '18,21p' /etc/my.cnf
server-id = 3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery = 1
[root@slave2 ~]#systemctl restart mysqld

4.主从共同操作

在主服务器与从服务器上进行的操作

4.1 创建软链接

将/usr/local/mysql/bin/下的mysql命令与mysqlbinlog命令创建软链接到/usr/sbin目录下,

4.2 用户授权

登录MySQL主服务器,给用户授权

5.从服务操作

5.1 连接主服务器

两台从服务器连接主服务器

通过执行SQL语句,连接到主服务器

master_host='192.168.83.20'
#指定主服务器的IP地址或主机名,这里设置为主服务器的IP地址192.168.83.20。master_user='myslave'
#设置主服务器上用于复制的用户账号名称,这里使用的是名为'myslave'的账户。master_password='123456'
#提供主服务器上的复制用户对应的密码,此处仅为示例,实际环境中请使用安全强度更高的密码。master_log_file='master-bin.000001'
#指定主服务器上从哪里开始复制二进制日志,这里的值'master-bin.000001'是主服务器的一个具
#体的二进制日志文件名。master_log_pos=603
#与master_log_file配合使用,指定从主服务器二进制日志文件的哪个位置开始读取和执行事件,
#这里的值603代表从该文件的第603个字节位置开始。

查看状态时需要确认 IO 和 SQL 线程都是 Yes,代表同步正常

Slave_IO_Running: Yes                   #负责与主机的I/O通信
Slave_SQL_Running: Yes                #负责自己的slave mysql进程

测试同步情况

5.2 设置MHA用户权限

在主服务器上给mha用户授权,使mha节点服务器能够检测到主从服务器

因为现在已经做到主从同步,在主服务上授权,两台从服务器会同步授权

5.3 设置只读模式

将两台从服务器设置为只读模式:set global read_only=1;

(二)安装MHA所有组件

1.安装依赖环境

所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源,而后安装依赖环境

yum  install epel-release.noarch -y 
#下载epel源yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel
-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN#下载MHA依赖环境


2.安装node软件包

先在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装manager组件,因为 manager依赖node组件

#主服务器
[root@master opt]#ls
mha4mysql-node-0.57.tar.gz  rh
[root@master opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@master opt]#ls
mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@master opt]#cd  mha4mysql-node-0.57/
[root@master mha4mysql-node-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@master mha4mysql-node-0.57]#make && make install#从服务器1
[root@slave1 opt]#ls
mha4mysql-node-0.57.tar.gz  rh
[root@slave1 opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@slave1 opt]#ls
mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@slave1 opt]#cd  mha4mysql-node-0.57/
[root@slave1 mha4mysql-node-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@slave1 mha4mysql-node-0.57]#make -j 4 && make install#从服务器2
[root@slave1 opt]#ls
mha4mysql-node-0.57.tar.gz  rh
[root@slave2 opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@slave2 opt]#ls
mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@slave2 opt]#cd  mha4mysql-node-0.57/
[root@slave2 mha4mysql-node-0.57]#ls
AUTHORS  bin  COPYING  debian  inc  lib  Makefile.PL  MANIFEST  META.yml  README  rpm  t
[root@slave2 mha4mysql-node-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@slave2 mha4mysql-node-0.57]#make -j 4 && make install#MHA manager节点服务器
[root@mha opt]#ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57.tar.gz  rh
[root@mha opt]#tar xf mha4mysql-node-0.57.tar.gz 
[root@mha opt]#cd  mha4mysql-node-0.57/
[root@mha mha4mysql-node-0.57]#perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@mha mha4mysql-node-0.57]#make -j 4 &&make install

3.安装manager组件

在 MHA manage 节点服务器上安装 manager 组件,操作方法与安装node节点一样

[root@mha opt]#ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57  mha4mysql-node-0.57.tar.gz  rh
[root@mha opt]#tar xf  mha4mysql-manager-0.57.tar.gz 
[root@mha opt]#cd  mha4mysql-manager-0.57/
[root@mha mha4mysql-manager-0.57]#ls
AUTHORS  bin  COPYING  debian  inc  lib  Makefile.PL  MANIFEST  META.yml  README  rpm  samples  t  tests
[root@mha mha4mysql-manager-0.57]#perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.627)
- DBD::mysql            ...loaded. (4.023)
- Time::HiRes           ...loaded. (1.9725)
- Config::Tiny          ...loaded. (2.14)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst        ...loaded. (0.57)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager
[root@mha mha4mysql-manager-0.57]#make  -j 4 && make install

#manager组件安装后在/usr/local/bin 下生成的工具:
masterha_check_ssh            #检查 MHA 的 SSH 配置状况
masterha_check_repl           #检查 MySQL 复制状况
masterha_manger               #启动 manager的脚本
masterha_check_status         #检测当前 MHA 运行状态
masterha_master_monitor       #检测 master 是否宕机
masterha_master_switch        #控制故障转移(自动或者 手动)
masterha_conf_host            #添加或删除配置的 server 信息
masterha_stop                 #关闭manager#node组件安装后在/usr/local/bin下生成的脚本脚本文件:
save_binary_logs              #保存和复制 master 的二进制日志
apply_diff_relay_logs         #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog            #去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs              #清除中继日志(不会阻塞 SQL 线程)#安装node组件生成的工具通常由MHAManager的脚本触发,无需人为操作

4.配置ssh免密登录

需要在所有的服务器上配置ssh免密登录,用于快速进行文件交互以及互相替换等操作

4.1 配置manager

在 manager 节点上配置到所有数据库节点的无密码认证

[root@mha ~]#ssh-copy-id 192.168.83.20
#向master服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.40
#向slave1服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.60
#向slave2服务器传输密钥,达到免密效果

远程连接测试是否成功

4.2 配置master服务器

master服务器上配置到salve1服务器、salve2服务器的无密码认证

[root@mha ~]#ssh-keygen -t rsa
#生成密钥文件
[root@mha ~]#ssh-copy-id 192.168.83.40
#向slave1服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.60
#向slave2服务器传输密钥,达到免密效果

4.3 配置salve1服务器

salve1服务器上配置到master服务器、salve2服务器的无密码认证

[root@mha ~]#ssh-keygen -t rsa
#生成密钥文件
[root@mha ~]#ssh-copy-id 192.168.83.20
#向master服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.60
#向slave2服务器传输密钥,达到免密效果

4.4 配置salve2服务器

salve2服务器上配置到master服务器、salve1服务器的无密码认证

[root@mha ~]#ssh-keygen -t rsa
#生成密钥文件
[root@mha ~]#ssh-copy-id 192.168.83.20
#向master服务器传输密钥,达到免密效果
[root@mha ~]#ssh-copy-id 192.168.83.40
#向slave1服务器传输密钥,达到免密效果

5.在manager节点上配置MHA

5.1 复制脚本

在manager节点上复制相关脚本到/usr/local/bin 目录

cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

master_ip_failover  		#自动切换时 VIP 管理的脚本
master_ip_online_change 	#在线切换时 vip 的管理
power_manager 				#故障发生后关闭主机的脚本
send_report 				#因故障切换后发送报警的脚本

复制master_ip_failover脚本到/usr/local/bin 目录

修改该脚本文件

[root@mha local]#vim /usr/local/bin/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.80.200';									#指定vip的地址
my $brdc = '192.168.83.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.83.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.83.200 down
my $exit_code = 0;											#指定退出状态码为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";
}

6.创建MHA软件目录

将源码包中的配置文件app1.cnf复制到新建的MHA软件目录,这个文件包含了MHA集群中各个MySQL服务器的详细信息,包括主机名、端口、SSH连接信息等。并将文件中的内容替换为以下内容

[server default]
manager_log=/var/log/masterha/app1/manager.log
#manager日志
manager_workdir=/var/log/masterha/app1  
#manager工作目录
master_binlog_dir=/usr/local/mysql/data/         
#master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便MHA能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover  
#设置自动failover时候的切换脚本,也就是上面的那个脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change  
#设置手动切换时候的切换脚本
password=manager			
#设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1				
#设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp			
#设置远端mysql在发生切换时binlog的保存位置
repl_password=123		    
#设置复制用户的密码
repl_user=myslave			
#设置复制用户的用户
report_script=/usr/local/send_report     
#设置发生切换后发送的报警的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.83.40 -s 192.168.83.60
#指定检查的从服务器IP地址
shutdown_script=""			
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root				
#设置ssh的登录用户名
user=mha					
#设置监控用户root[server1]
hostname=192.168.83.20
port=3306
#指定master服务器的IP地址与端口号[server2]
candidate_master=1  #表示此节点可作为候选主库。
check_repl_delay=0   
#设置在故障转移前检查复制延迟的最大限制(单位:秒),
#这里设置为0,表示不检查复制延迟,立即进行故障转移。
hostname=192.168.83.40
port=3306
#指定salve1服务器的IP地址与端口号[server3]
hostname=192.168.83.60
port=3306
#指定salve2服务器的IP地址与端口号

7.设置虚拟VIP

在MHA节点服务器上设置虚拟VIP,客户端通过该地址访问数据库,当master服务器宕机后,会将该地址转移到备用主服务器上(slave1服务器),不会影响客户体验

8.进行环境测试

8.1 测试ssh免密认证

执行:masterha_check_ssh -conf=/etc/masterha/app1.cnf 命令


 

masterha_check_ssh 
#是MHA工具集中的一个命令,用于检查在MHA配置文件中定义的各个服务器之间的SSH连接是否
#正常,确保在故障转移时,MHA Manager能够通过SSH无密码登录到各个MySQL服务器进行管理和操作。-conf=/etc/masterha/app1.cnf 
#参数指定了要使用的MHA配置文件路径

执行此命令时,MHA会读取该配置文件并尝试通过SSH连接到每个服务器,如果所有连接都能成功建立,会显示successfully 。则说明SSH连接配置正确,为后续的主从切换和故障转移操作做好了前提准备。如果出现连接失败的情况,MHA会输出相应的错误信息,帮助管理员排查问题。

8.2 测试主从复制情况

在测试之前,确保你的MySQL配置文件(/etc/my.cnf)的  [client] 字段没有default-character-set=utf8这个参数,因为这个参数在较早版本的MySQL或mysqlbinlog工具中,可能并不支持在命令行中直接设置字符集变量。

执行:masterha_check_repl -conf=/etc/masterha/app1.cnf 命令

masterha_check_repl:
#这是一个MHA提供的命令行工具,用于检查MySQL主从复制集群的健康状态-conf=/etc/masterha/app1.cnf:
#指定了MHA的配置文件路径。

9.启动MHA

在manager节点上启动 MHA

nohup:
#Linux命令,用于让命令在后台运行,并忽略所有挂断信号即使用户退出登录,命令也继续执行。masterha_manager
#是MHA工具集中用于管理MySQL主从复制集群的命令,它负责监控主从复制状态,处理故障转移等任务。--conf=/etc/masterha/app1.cnf:
#指定MHA使用的配置文件--remove_dead_master_conf
#这是一个MHA Manager的参数,表示在故障转移后自动移除原主库的相关配置,
#以便在未来的故障转移中不再考虑已失效的主库。--ignore_last_failover
#告诉MHA Manager在启动时忽略上次的故障转移状态,即使上次的故障转移未完成或失败,
#也要尝试启动新的故障转移监控。< /dev/null
#标准输入重定向到/dev/null,意味着命令运行时不接收任何键盘输入。> /var/log/masterha/app1/manager.log
#标准输出重定向到指定的文件,即MHA Manager的输出信息将被记录到/var/log/masterha/app1/manager.log日志文件中。2>&1
#错误输出(标准错误(stderr))重定向到标准输出(stdout)&        #将整个命令放入后台执行。

10.查看信息

通过命令或者查看日志的方式,查看当前的master是谁

11.模拟故障

关闭master的mysql服务:systemctl  stop mysqld

可以在/var/log/masterha/app1/manager.log日志中看到从服务器1成为master的信息

VIP地址也成功转移到slave1服务器上

12.故障恢复

12.1 修改原master服务器

修改配置文件//etc/my.cnf,开启中继日志

重启原master服务器,并将原master服务器设置为slave服务器

重新启动MySQL服务:systemctl start mysqld

12.2 修改manager节点配置文件

修改manager节点的/etc/masterha/app1.cnf  配置文件

重新启动manager节点

进行测试

总结

MHA集群是实现MySQL服务主从复制高可用的重要环节

MySQL作为生产环境中最常用,也是非常重要的服务,它的优化也非常重要。

本章主要了解主从复制的原理,MHA集群原理,以及同步的方式等等,尤其是在配置文件方面,需要配置的信息较多,所以出现的报错信息可能也会比较频繁。

架构

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
MHA Manager负责监控主从复制状态,处理故障转移、主从切换、配置更新等工作。
MHA Node部署在每个MySQL服务器上,用于收集并报告数据库状态信息,执行MHA Manager下发的命令。

故障检测与转移:

MHA Manager通过心跳检测判断主库是否宕机,并根据预设策略选取合适的从库晋升为主库。
使用半同步复制或全局事务标识符(GTID)确保数据一致性。
故障转移过程中,MHA Manager会执行一系列操作,如停止原主库的写入、更新从库复制源、执行主从切换脚本等。

配置文件:

MHA的配置文件(如app1.cnf)中包含了集群中所有MySQL服务器的详细信息,如主机名、端口、复制用户、密码、SSH连接信息等。

命令行工具:

masterha_check_repl:检查主从复制的健康状态和一致性。
masterha_manager:启动MHA Manager守护进程,负责集群的监控和管理。
masterha_check_ssh:检查MHA Manager与各个MySQL服务器之间的SSH连接。

日志与监控:

MHA Manager可以输出详细的日志信息,方便调试和故障排查。
可以通过配置文件指定日志文件路径,记录MHA的运行状态和错误信息。

安全性与权限:

MHA Manager在执行故障转移等操作时需要具备足够的MySQL权限,如SUPER权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍&#xff0c;将它与action自动化流程结合&#xff0c;可以实现一些小游戏 例如&#xff1a;2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

智能网关BL102E采集西门子PLC S7-200 Smart数据上传至Thingsboard

1、WAN口采集西门子PLC的配置 WAN口可以添加很多设备,具体我们用西门子为例来简要配置。 双击WAN,弹出以太网设置,直接把自动获取IP打开,他会根据你的网段自动设置链接! (1)点击`WAN",点击鼠标右键,点击“添加",弹出设备配置框。 (2)设备名称任意填写,如…

《数据结构学习笔记---第七篇》---栈和队列的OJ练习

1. 括号匹配问题。OJ链接 step1:思路分析 &#xff1a; 1.括号匹配&#xff0c;我们首先考虑用栈实现&#xff0c;我们通过符号栈帧的思想知道&#xff0c;求前中后缀表达式的时候用的就是栈帧&#xff0c;操作数栈和符号栈。 2.根据常见的情况 考虑怎么使用栈&#xff0c;首先…

Bun安装与使用

Bun安装与使用。 它目前无法在windows上直接安装使用&#xff0c;必须通过虚拟机安装。 在win10虚拟机中安装 # 查看内核版本 $ uname -srm Linux 6.1.0-10-amd64 x86_64# 安装unzip解压工具 $ sudo apt install unzip# 下载安装脚本并开始安装 curl -fsSL https://bun.sh/ins…

SpringBoot使用Redis

1.Spring是如何集成Redis的&#xff1f; Spring Data Redis 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId&…

互联网轻量级框架整合之JavaEE基础

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件&#xff0c;主要用于企业级互联网系统的框架搭建&#xff0c;同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势&#xff0c;其迅速成为构建企业互联网平台的主流技术&#x…

如何使用Docker搭建WBO在线协作工具并实现无公网IP远程编辑本地白板

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

社交互动:探讨Facebook对用户互动的影响

在当今数字化时代&#xff0c;社交网络已经成为了人们日常生活中不可或缺的一部分。而作为最著名的社交网络平台之一&#xff0c;Facebook不仅连接了全球数十亿用户&#xff0c;还对用户的社交互动产生了深远的影响。本文将深入探讨Facebook对用户互动的影响&#xff0c;以及它…

5、axios请求、动画、组件、路由重定向、UI组件

一、axios请求 Axios是一个基于Promise的HTTP状态库&#xff0c;封装ajax。ajax包含axios安装 npm install axios 引入 import axios form “axios” 1、get请求 <script> // 1.本页面引入 import axios from "axios";data() {return {imgSrc: ""…

R语言实现——网状 Meta 分析

近来年&#xff0c;网状 Meta 分析相关研究不断涌现&#xff0c;此类研究不但能发表在国内各大核心期刊上&#xff0c;还能在SCI期刊甚至医学4大刊上看到其身影。随手在pubmed上面一搜索&#xff0c;就能得到一万多篇相关文献。俨然成为医学文献研究的“大杀器”&#xff01; P…

AMEYA360代理 | 江苏长晶科技FST2.0高性能 IGBT产品介绍

江苏长晶科技股份有限公司是一家专业从事半导体产品研发、生产和销售的企业。自2019年起&#xff0c;连续4年被中国半导体行业协会评为 “功率器件十强企业”。2021年开始自主研发有着“工业CPU”之称的IGBT&#xff0c;截至2023年Q3在家电/工业/新能源等行业实现8款产品市场应…

刷题DAY37 | LeetCode 738-单调递增的数字 968-监控二叉树

738 单调递增的数字&#xff08;medium&#xff09; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 思路&#xff1a;将整数转…

Git版本管理使用手册 - 6 - 将本地项目提交到空白仓库

将本地项目提交到空白仓库 1.首先克隆远程空白仓库到本地目录 2.将要提交到master上的项目代码复制到本地仓库目录下。如果项目代码关联SVN要取消SVN关联。可以使用取消SVN关联脚本。 3.编写.ignore文件&#xff0c;该文件可以提交时&#xff0c;忽略指定文件 4.使用idea打开该…

Docker搭建LNMP环境实战(08):安装php-fpm

1、编写php测试文件 在文件夹&#xff1a;/mnt/hgfs/dockers/test_site/www目录下创建文件&#xff1a;test.php&#xff0c;内容为&#xff1a; <?phpecho "hello world!!!!!! From test.php"; ?>2、编写php-fpm部署配置文件 在文件夹&#xff1a;/mnt/h…

【unity】unity安装及路线图

学习路线图 二、有关unity的下载 由于unity公司是在国外&#xff0c;所以.com版&#xff08;https://developer.unity.cn/&#xff09;不一定稳定&#xff0c;学习时推荐从.cn国内版&#xff08;https://developer.unity.cn/&#xff09;前往下载&#xff0c;但是后期仍需回…

鸿蒙ArkTS基础知识-自定义组件生命周期函数onBackPress的调用。

介绍 本课程使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;使用Builder创建排行列表布局内容&#xff0c;使用装饰器State、Prop、Link来管理组件状态。最后我们点击…

【服务端】node.js详细的配置

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【话题】AI大模型学习:理论、技术与应用探索

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景1. AI大模型学习的基础理论1.1 机器学习1.2 深度学习 2. AI大模型学习的技术要点2.1 模型结构设计2.2 算法优化2.3 大规模数据处理 3. AI大模型学习的应用场景3.1 自…

使用小皮【phpstudy】运行Vue+MySql项目

现在的情况是我扒到了一个开源的项目&#xff0c;现在想要实现一下前端对应的功能&#xff0c;后端是完备的&#xff0c;但是需要调用数据库将数据跑起来&#xff0c;这里可以使用到MySql数据库&#xff0c;这里我还发现了一个比较好用的软件小皮【phpStudy】 官网 一 安装软件…

什么是缓冲区溢出攻击?

缓冲区是内存存储区域&#xff0c;在数据从一个位置传输到另一个位置时临时保存数据。当数据量超过内存缓冲区的存储容量时&#xff0c;就会发生缓冲区溢出&#xff08;或buffer overrun&#xff09;。结果&#xff0c;试图将数据写入缓冲区的程序会覆盖相邻的内存位置。 例如…