Mysql数据库:MHA高可用架构

目录

前言

一、MHA概述

1、什么是MHA

2、MHA的特点

3、MHA的组成

4、MHA的工作原理

5、故障切换备选主库的算法

二、部署MHA高可用架构

1、环境部署

2、部署主从同步

2.1 修改主配置文件并创建软链接

2.1.1 master 修改主配置文件并创建软连接

2.1.2 slave1 修改主配置文件并创建软连接 

2.1.3 slave2 修改主配置文件并创建软连接

2.2 配置一主两从机制

2.2.1 所有mysql服务器进行授权

2.2.2  在master主服务器上查看状态

2.2.3 在两个从服务器上执行同步操作

2.2.4 配置读写分离操作

2.3 测试主从同步效果

3、部署 MHA 架构

3.1 安装 MHA 所有组件

3.1.1 所有设备都需安装 node 组件

3.1.2 在 MHA-manager 服务器上安装 manager 组件

3.1.3 manager 组件安装完后其工具详解

3.2 所有设备配置无密码认证

3.3 在manager服务器上配置MHA

3.3.1 复制相关脚本到/usr/local/bin 目录

3.3.2 复制VIP 管理的脚本到规定目录并修改

3.3.3 创建 MHA 软件目录并拷贝配置文件

3.3.4 修改app1.cnf配置文件

3.4 第一次配置需在 master 上手动开启虚拟IP

3.5 在 manager 上测试 ssh 免密登录

3.6 在 manager 上测试 mysql 主从连接情况

3.7 在 manager 服务器上启动 MHA

3.8 查看 MHA 状态 

4、模拟单点故障

5、单点故障修复

5.1 修复master

5.2 修复主从

5.3 在 manager 上修改配置文件app1.cnf

5.4 在manager上重启MHA

5.5 测试主从复制

三、总结

1、MHA的作用

2、 MHA的核心组成

3、 MHA需要配置的文件

4、故障切换MHA会做哪些动作

5、MHA故障问题


前言

在传统的mysql主从复制架构中,存在主服务器的单点故障的问题。由于所有的写操作(包括数据更新、删除和插入)都是在主服务器上进行的,如果主服务器出现故障,整个数据库系统将无法处理任何写请求,直到主服务器恢复或者手动或自动切换到一个新的主服务器为止。这种对单一主服务器的依赖使得它成为整个复制架构中的单点故障

所以MHA(MySQL High Availability)是一个专为MySQL数据库设计的高可用性解决方案。它通过自动化处理故障切换和主从复制管理,旨在最大限度地减少数据库的停机时间,并确保数据的一致性和可用性

一、MHA概述

1、什么是MHA

  • MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件
  • MHA 的出现就是解决MySQL 单点的问题
  • MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作
  • MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用

2、MHA的特点

  • 自动故障切换:在主服务器发生故障时,能够自动选择一个最合适的从服务器提升为新的主服务器
  • 快速恢复: MHA能够快速地实现主从切换,减少数据库不可用的时间,提高系统的可用性
  • 最小化数据丢失:MHA通过复制日志和其他机制来确保在故障切换过程中最小化数据丢失
  • 灵活的配置:支持多种配置选项,可以根据具体需求调整
  • SSH连接保障安全: MHA利用SSH连接来进行节点间的通信和操作,确保通信的安全性。
  • 监控与报警: MHA提供了监控和报警功能,能够实时监测数据库的状态并及时响应故障情况
  • 易于部署和管理:提供了命令行工具和简单的配置文件,使得部署和管理变得简单
  • 架构:目前MHA支持一主多从架构,最少三台服务,即一主两从

3、MHA的组成

  • MHA Node(数据节点)

安装了MHA管理器的所有Mysql服务器节点,运行MHA工具包,参与主从节点的监视与管理

  • MHA Manager(管理节点)

MHA Manager 可单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上
MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明

4、MHA的工作原理

详细过程:

  • 监控主节点状态: MHA通过定期检查主节点的健康状态来监控数据库集群。这包括检查主节点是否正常运行、主从复制是否同步等

  • 故障检测: 当MHA检测到主节点发生故障(例如主节点宕机或不可达),它会立即采取行动以确保数据库的高可用性

  • 自动主从切换: 一旦主节点故障被确认,MHA会自动执行主从切换操作。它会选择一个健康的从节点,将其提升为新的主节点,以继续提供数据库服务

  • 数据同步: 在主从切换后,MHA会确保新的主节点和其他从节点之间的数据同步。它会协调数据复制过程,以确保所有节点都有最新的数据副本

  • 恢复主节点: 一旦原主节点恢复正常,MHA会协助将其重新加入数据库集群,并根据需要重新配置节点角色,以恢复正常的主从架构

  • 自动化管理: MHA通过自动化的流程和决策来管理数据库集群的高可用性,减少了人工干预的需求,提高了系统的稳定性和可靠性

简单过程: 

  • 从宕机崩溃的master 保存二进制日志事件(binlog  events)
  • 识别含有最新的更新 slave 日志
  • 应用差异的中继日志(relay log)到其他的slave
  • 应用从master保存的二进制日志事件
  • 提升一个 salve 为新的master
  • 使其他的slave连接行的master 进行复制

5、故障切换备选主库的算法

  • 一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主
  • 数据一致的情况下,按照配置文件顺序,选择备选主库
  • 设定有权重(candidate_master=1),按照权重强制指定备选主

默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效

如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主

二、部署MHA高可用架构

1、环境部署

MHA架构:一主两从

设备操作系统IP地址所需工具/软件/安装包
MHA manager 服务器CentOS7172.16.12.11MHA node、manager 组件
Master 主点服务器CentOS7172.16.12.10mysql5.7、MHA node 组件
Slave1 从点服务器CentOS7172.16.12.12mysql5.7、MHA node 组件
Slave2 从点服务器CentOS7172.16.12.13mysql5.7、MHA node 组件

 关闭所有设备的防火墙和核心防护

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

修改四台服务器的主机名,方便区分

[root@localhost ~]#hostnamectl set-hostname master
[root@localhost ~]#bash      #修改master服务器主机名[root@localhost ~]#hostnamectl set-hostname slave1
[root@localhost ~]#bash      #修改slave1服务器主机名[root@localhost ~]#hostnamectl set-hostname slaver2
[root@localhost ~]#bash      #修改slave2服务器主机名[root@localhost ~]#hostnamectl set-hostname manager
[root@localhost ~]#bash      #修改MHA-manager服务器主机名

安装master主服务器、slave1从服务器、slave2从服务器的mysql5.7软件 

#master主服务器、slave1从服务器、slave2从服务器都需编译安装的mysql软件
可参考《Mysql数据库概念与安装》:http://t.csdnimg.cn/wkJLr

2、部署主从同步

2.1 修改主配置文件并创建软链接

2.1.1 master 修改主配置文件并创建软连接
[root@master ~]#vim /etc/my.cnf
[mysqld]
server-id = 1
#三台服务器 server-id 不能一样
log_bin = master-bin
#添加,主服务器开启二进制日志
log-slave-updates = true
#添加,允许slave从master复制数据时可以写入到自己的二进制日志
[root@master ~]#systemctl restart mysqld[root@master ~]#ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@master ~]#ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
#创建软链接

2.1.2 slave1 修改主配置文件并创建软连接 
[root@slave1 ~]#vim /etc/my.cnf
vim /etc/my.cnf
server-id = 2 
#三台服务器 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@slave1 ~]#systemctl restart mysqld[root@slave1 ~]#ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@slave1 ~]#ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
#创建软链接

2.1.3 slave2 修改主配置文件并创建软连接
[root@slave2 ~]#vim /etc/my.cnf
vim /etc/my.cnf
server-id = 3 
#三台服务器 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@slave2 ~]#systemctl restart mysqld[root@slave2 ~]#ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@slave2 ~]#ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
#创建软链接

2.2 配置一主两从机制

2.2.1 所有mysql服务器进行授权

master主服务器、slave1从服务器、slave2从服务器都需配置授权操作

#允许从数据库同步使用
grant replication slave on *.* to 'myslave'@'172.16.12.%' identified by '123456';#允许manager使用
grant all privileges on *.* to 'mha'@'172.16.12.%' 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;    #刷新权限

2.2.2  在master主服务器上查看状态
show master status;
#查询到当前master主服务器二进制日志是master-bin.000001,偏移量是1743

2.2.3 在两个从服务器上执行同步操作
change master to master_host='172.16.12.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1743;#master_host='172.16.12.10':设置主服务器的IP地址为192.168.44.60。
#master_user='myslave':设置用于复制的用户为'myslave',这个用户在主服务器上必须拥有replication slave权限
#master_password='123456':设置复制用户的密码为'123456'。在实际生产环境中,务必使用强密码
#master_log_file='master-bin.000001':指定从哪个二进制日志文件开始复制,这里是从'master-bin.000001'文件开始
#master_log_pos=1743:指定在上述二进制日志文件中的起始位置为1743#执行这个命令之后,从服务器将开始尝试连接主服务器,并从指定的日志文件和位置开始接收并执行主服务器上的数据变更事件,以实现主从复制的功能。在执行此命令前,请确保主服务器的二进制日志配置正确,且从服务器有权访问主服务器。此外,执行完该命令后通常还需要执行START SLAVE命令来启动复制进程start slave;  #开启主从同步
show slave status\G    #查看从服务器当前状态,必须保证IO和SQL线程工作正常即Yes

注:

一般 Slave_IO_Running: No 的可能性(一步步排查):

  • 网络不通
  • my.cnf配置有问题
  • 设置主从同步时:密码、file文件名、pos偏移量不对
  • 防火墙、核心防护没有关闭 
2.2.4 配置读写分离操作

将两个从服务器设置为只读模式,那么两个从服务器只提供客户端的读操作,而客户端的写操作则只有主服务器可主持,这样就实现了读写分离的简单操作

set global read_only=1;
#两个从服务器上配置只读模式

2.3 测试主从同步效果

在 master主服务器 上创建库和表,并插入数据,测试两个从服务器是否同步数据

create database xgy;
use xgy;
create table class(id int(3) primary key,name varchar(15) not null,address varchar(50));
insert into class values(1,'cjdv','江苏南京');
select * from class;

在两个从服务器slave1和slave2上查看是否同步到master主服务器的数据 

3、部署 MHA 架构

3.1 安装 MHA 所有组件

3.1.1 所有设备都需安装 node 组件
#所有服务器设备都需安装epel额外源和依赖包
yum install epel-release.noarch -yyum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

对于每个操作系统版本不一样,这里 CentOS7.6选择 0.57 版本。
在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。

#所有设备服务器都需要安装 node 组件
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

3.1.2 在 MHA-manager 服务器上安装 manager 组件
[root@manager ~]#cd /opt
[root@manager opt]#tar zxvf mha4mysql-manager-0.57.tar.gz
[root@manager opt]#cd mha4mysql-manager-0.57
[root@manager mha4mysql-manager-0.57]#perl Makefile.PL
[root@manager mha4mysql-manager-0.57]#make && make install

3.1.3 manager 组件安装完后其工具详解

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 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:

save_binary_logs       #保存和复制 master 的二进制日志
apply_diff_relay_logs  #识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog     #去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs       #清除中继日志(不会阻塞 SQL 线程)

3.2 所有设备配置无密码认证

(1)在 MHA-manager 服务器上配置到所有主从mysql数据库的无密码认证

[root@manager ~]#ssh-keygen -t rsa
#一路回车到底
[root@manager ~]#ssh-copy-id 172.16.12.10
#输入yes和登录密码
[root@manager ~]#ssh-copy-id 172.16.12.12
[root@manager ~]#ssh-copy-id 172.16.12.13

(2)在 master 主服务器上配置到从服务器 slave1 和 slave2 的免密登录

[root@master ~]#ssh-keygen -t rsa
[root@master ~]#ssh-copy-id 172.16.12.12
[root@master ~]#ssh-copy-id 172.16.12.13

(3)在 slave1从服务器 上配置到 master主服务器 和 slave2从服务器 的免密登录

[root@slave1 ~]#ssh-keygen -t rsa
[root@slave1 ~]#ssh-copy-id 172.16.12.10
[root@slave1 ~]#ssh-copy-id 172.16.12.13

(4)在 slave2从服务器 上配置到 master主服务器 和 slave1从服务器 的免密登录

[root@slave2 ~]#ssh-keygen -t rsa
[root@slave2 ~]#ssh-copy-id 172.16.12.10
[root@slave2 ~]#ssh-copy-id 172.16.12.12

(4)随便验证,查看能否免密登录 

3.3 在manager服务器上配置MHA

3.3.1 复制相关脚本到/usr/local/bin 目录
[root@manager ~]#cp -a /opt/mha4mysql-manager-0.57/samples/scripts/  /usr/local/bin/
[root@manager ~]#ls /usr/local/bin/scripts/master_ip_failover  		#自动切换时 VIP 管理的脚本
master_ip_online_change 	#在线切换时 vip 的管理
power_manager 				#故障发生后关闭主机的脚本
send_report 				#因故障切换后发送报警的脚本

3.3.2 复制VIP 管理的脚本到规定目录并修改

复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换

[root@manager ~]#cd /usr/local/bin
[root@manager bin]#cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

修改内容如下:(删除原有内容,直接复制并修改vip相关参数)

[root@manager bin]#vim /usr/local/bin/master_ip_failover
#全部删除原有的所有内容,并直接复制以下内容并修改vip相关参数
#要在末行模式输入:set paste,再粘贴#!/usr/bin/env perluse 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 = '172.16.12.200';
#指定vip的地址
my $brdc = '172.16.12.255';
#指定vip的广播地址
my $ifdev = 'ens33';
#指定vip绑定的网卡
my $key = '1';
#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; 
#代表此变量值为ifconfig ens33:1 192.168.10.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
#代表此变量值为ifconfig ens33:1 192.168.10.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";
}

3.3.3 创建 MHA 软件目录并拷贝配置文件

创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

[root@manager ~]#mkdir /etc/masterha
[root@manager ~]#cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf  /etc/masterha/

3.3.4 修改app1.cnf配置文件
[root@manager ~]#vim /etc/masterha/app1.cnf						
#删除原有内容,直接复制并修改节点服务器的IP地址[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 172.16.12.12 -s 172.16.12.13
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=172.16.12.10
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=172.16.12.12
port=3306[server3]
hostname=172.16.12.13
port=3306

#app1.cnf配置文件语句详解[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
#设置复制用户的用户
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 172.16.12.12 -s 172.16.12.13
#指定检查的从服务器IP地址
shutdown_script=""
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root
#设置ssh的登录用户名
user=mha
#设置监控用户root[server1]
hostname=172.16.12.10
port=3306[server2]
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个从库不是集群中最新的slave
check_repl_delay=0
#默认情况下如果一个slave落后master 超过100M的relay logs的话,MHA将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
hostname=172.16.12.12
port=3306[server3]
hostname=172.16.12.13
port=3306

3.4 第一次配置需在 master 上手动开启虚拟IP

[root@master ~]#ifconfig ens33:1 172.16.12.200/24
[root@master ~]#ip a

3.5 在 manager 上测试 ssh 免密登录

在 manager服务器上测试 ssh 免密登录,如果正常最后会输出 successfully

[root@manager ~]#masterha_check_ssh -conf=/etc/masterha/app1.cnf

3.6 在 manager 上测试 mysql 主从连接情况

在 manager 服务器上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常

[root@manager ~]#masterha_check_repl -conf=/etc/masterha/app1.cnf

典型错误:未知变量'default-character-set=utf8' 

解决方法: 删除所有mysql主从服务器的主配置文件(/etc/my.cnf)中的[client]模块下的default-character-set=utf8

再重新测试 mysql 主从连接情况:出现MySQL Replication Health is OK就成功了

3.7 在 manager 服务器上启动 MHA

[root@manager ~]#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 &#解释
这条命令是在Linux环境下启动MHA(MySQL Master High Availability)管理器并执行特定操作的一个示例。让我们逐部分解析这个命令:nohup: nohup 是一个Unix/Linux命令,用于运行另一个命令并在后台运行,即使用户注销系统,命令也将继续运行。通过nohup启动程序可以使其在终端断开连接后仍然运行。masterha_manager: 这是MHA工具的一部分,用于管理和监控MySQL主从复制集群,以及在主库出现问题时进行故障切换。--conf=/etc/masterha/app1.cnf: 这个参数指定MHA使用的配置文件路径,里面包含了MHA管理的MySQL集群的各项信息,如主库、从库列表、复制用户、SSH连接信息等。--remove_dead_master_conf: 这个参数指示MHA在检测到主库失效后,从配置文件中移除失效主库的相关配置。--ignore_last_failover: 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover< /dev/null: 这表示输入来源是空设备文件/dev/null,也就是说不从标准输入读取任何数据。> /var/log/masterha/app1/manager.log: 这是输出重定向,MHA管理器的所有标准输出(stdout)将被写入到指定的这个日志文件中,方便查看MHA的操作记录和状态信息。2>&1: 这是错误输出重定向,将标准错误输出(stderr)也重定向到标准输出,所以这里的stderr同样会被写入到上面提到的日志文件中。&: 最后的符号表明整个命令将在后台运行,不影响当前终端的交互。总的来说,这条命令的作用是启动MHA管理器,在后台运行,根据给定的配置文件对MySQL集群进行监控,并在检测到主库失效时移除失效主库的配置,同时忽略上一次的故障切换结果,所有输出(包括标准输出和错误输出)都将被记录到指定的日志文件中。

#若要关闭 manager 服务,可以使用如下命令
masterha_stop --conf=/etc/masterha/app1.cnf
#查看当前MHA状态
masterha_check_status --conf=/etc/masterha/app1.cnf

3.8 查看 MHA 状态 

[root@manager ~]#masterha_check_status --conf=/etc/masterha/app1.cnf
#查看 MHA 状态,可以看到当前的 master
[root@manager ~]#cat /var/log/masterha/app1/manager.log | grep "current master"
#查看 MHA 日志,也能看到当前的 master

4、模拟单点故障

(1)模拟旧master故障,查看slave1是否自动替换成新的master

在manager服务器实时监控日志记录,等会模拟master出现故障,相应的记录也会随之出现

[root@manager ~]#tailf /var/log/masterha/app1/manager.log

[root@master ~]#systemctl stop mysqld.service  
#模拟master故障,即关闭master主服务器的mysql服务

当旧master出现故障,manager服务器将自动把slave1从服务器替换成新的master主服务器 

(2)验证旧slave1(新的master)是否接管虚拟VIP

(3)查看app1.cnf配置文件内容,是否将故障的旧master删除

正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将故障的旧master 删除

[root@manager ~]#cat /etc/masterha/app1.cnf

5、单点故障修复

一般旧master的故障修复好,是不会去抢占优先级再次成为master,而是会作为新的slave添加到MHA高可用集群里

5.1 修复master

上次关闭mysql服务导致故障,这次开启mysql服务即可,但在现实环境中,需要根据各个复杂的情况来进行修复

[root@master ~]#systemctl restart mysqld

5.2 修复主从

(1)在现主服务器 slave1(172.16.12.12) 查看二进制日志和偏移量

show master status;

reset slave;change master to master_host='172.16.12.12',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=154;
#旧master服务器变成从服务器,进行同步操作,记得修改二进制日志和偏移量start slave;
show slave status\G

5.3 在 manager 上修改配置文件app1.cnf

在 manager 节点上修改配置文件/etc/masterha/app1.cnf(再把这个旧master(新slave)的记录添加进去,因为它检测掉失效时候会自动消失) 

[root@manager ~]#vim /etc/masterha/app1.cnf 
……
[server1]
hostname=172.16.12.10
port=3306
……

5.4 在manager上重启MHA

[root@manager ~]#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 &[root@manager ~]#masterha_check_status --conf=/etc/masterha/app1.cnf

5.5 测试主从复制

在新master(旧slave1)服务器上创建新数据,查看新添加的从服务器(旧master)能否同步数据

use xgy;
insert into class values(2,'sjf','江苏无锡');
select * from class;

测试从服务器能否同步到数据,尤其是新slave(旧master)服务器

三、总结

1、MHA的作用

MySQL的高可用+故障切换

2、 MHA的核心组成

  • MHA Node(数据节点)

安装了MHA管理器的所有Mysql服务器节点;在发生故障的时候,会尽可能的保存二进制日志文件,并且实现故障切换(VIP的漂移)

  • MHA Manager(管理节点)

MHA Manager 可单独部署在一台独立的机器上,管理多个 master-slave 集群,也可以部署在一台 slave 节点上;做MHA的启动、关闭、管理和检测MySQL的各种健康检查

3、 MHA需要配置的文件

  • master_ip_failover

命令工具,定义的是基于VIP漂移的检测和故障转移(VIP从Master---->新的Master)

  • app1.conf

MHA的主要配置文件,主要定义了MHA的工作目录、日志

4、故障切换MHA会做哪些动作

  • MHA会多次尝试连接多测master的存活状态
  • MAH会多次尝试、尽可能地保存Master的二进制日志文件
  • MHA会根据配置文件app1.cnf中的配置部分,从服务器-------->主服务器的位置
  • MHA最后会将Master的VIP地址作为切换到从服务器的位置
  • MHA在选择完新的Master之后会在其余的Slave上执行change master操作,指向新的Master,来保证MySQL的群集的健康性

5、MHA故障问题

①软连接问题
②免交互登录
③五个用户授权(其中3个账号是测试环境需要做的)
④初次运行MHA功能时需要临时添加VIP地址
⑤配置文件-----需要校验
⑥先安装node节点,再安装主节点

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

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

相关文章

【JavaSE】类和对象详解(下)

前言 面向对象程序的三大特性&#xff1a;封装、继承、多态~ 书接上回 类和对象&#xff08;上&#xff09;~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 封装 private public 快速生成可访问封装的方法 包…

rocketmq管理工具rocketmq-console安装

rocketmq-console是一个图形化管理控制台&#xff0c;提供Broker集群状态查看&#xff0c;Topic管理&#xff0c;Producer、Consumer状态展示&#xff0c;消息查询等常用功能&#xff0c;这个功能在安装好RocketMQ后需要额外单独安装、运行。 中文文档地址&#xff1a;https:/…

蓝桥杯习题

https://www.lanqiao.cn/problems/1265/learning/ 第一题---排序 给定一个长度为N的数组A&#xff0c;请你先从小到大输出它的每个元素&#xff0c;再从大到小输出他的每个元素。 输入描述&#xff1a; 第一行包含一个整数N 第二行包含N个整数a1,a2,a3,...an&#xff0c;表…

生成 SSH 公钥

Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型 -C 注释 输出&#xff0c;如&#xff1a; 中间…

蓝桥杯嵌入式学习笔记(6):IIC程序设计

目录 前言 1. IIC基本原理 2. 电路原理 3. 代码编程 3.1 预备工作 3.2 AT24C02写读功能编写 3.2.1 AT24C02写操作实现 3.2.2 AT24C02读操作实现 3.3 MCP4017写读功能编写 3.3.1 MCP4017写操作实现 3.3.2 MCP4017读操作实现 3.4 main.c编写 3.4.1 头文件引用 3.4.…

Spring实战:采用Spring配置文件管理Bean

文章目录 一、Spring框架概述二、实战&#xff1a;采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Jakarta EE项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&…

Chrome浏览器隐藏的截图功能配置及使用

来自实用又方便&#xff0c;轻松打开Chrome浏览器隐藏的截图功能&#xff01;​​​​​​​ 一、通过谷歌Chrome浏览器 现在直接通过谷歌Chrome浏览器内置功能&#xff0c;免安装扩充插件也可以实现Chrome的截图和长截图功能了&#xff01; 也不需要额外安装任何截图工具 &a…

数据链路层之信道:数字通信的桥梁与守护者

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测) 单变量时间序列单步预测。 ELM(Extreme Learning Machine,极限学习机)和AdaBoost(Adaptive Boosting,自适应提升)都是机…

基于 FFmpeg 和 SDL 的音视频同步播放器

基于 FFmpeg 和 SDL 的音视频同步播放器 基于 FFmpeg 和 SDL 的音视频同步播放器前置知识音视频同步简介复习DTS、PTS和时间基 程序框架主线程解复用线程音频解码播放线程视频解码播放线程 音视频同步逻辑源程序结果工程文件下载参考链接 基于 FFmpeg 和 SDL 的音视频同步播放器…

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

24年大一训练一(东北林业大学)

前言&#xff1a; 周五晚上的训练赛&#xff0c;以后应该每两周都会有一次。 正文&#xff1a; Problem:A矩阵翻转&#xff1a; #include<bits/stdc.h> using namespace std; int a[55][55]; int main(){int n,m;while(cin>>n>>m){for(int i1;i<n;i){for…

2024.3.30学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p295-p314 super关键字 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super细节和语法 访问父类的属性&#xff0c;但不能访问父类的private属性 super.属性名 访问父类的…

CubeIDE 下如何将版本号和日期关联。

1. 使用__DATE__ 和__TIME__获取编译日期和时间。 2. 将__DATE__ 和__TIME__转换成UINT 3. 将转换后的数赋值给版本号。 4. 设置工程保证每次都会重新编译对应文件。 对应函数如下&#xff1a; uint8_t VER_MAIN; uint8_t VER_SUB; uint8_t VER_MIN; #include <stdlib.…

蓝桥杯刷题第四天

思路&#xff1a; 这道题很容易即可发现就是简单的暴力即可完成题目&#xff0c;我们只需满足所有数的和为偶数即可保证有满足条件的分法&#xff0c;同时也不需要存下每个输入的数据&#xff0c;只需要知道他是偶数还是奇数即可&#xff0c;因为我们只需要偶数个奇数搭配在一块…

使用通用内部函数对代码进行矢量化

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目标 本教程的目标是提供使用通用内…

[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com) 参考的这个博客&#xff0c;但有一个需要注意的是&#xff0c;最新版本的flask不知道是不是更新了还是怎么了&#xff0c;他的before_first_request不见了&#xff0c;如果继…

《极客时间TonyBai go语言第一课》学习笔记

文章目录 前置篇显式组合 大纲 前置篇 显式 在 C 语言中&#xff0c;下面这段代码可以正常编译并输出正确结果&#xff1a; #include <stdio.h> int main() { short int a 5; int b 8; long c 0; c a b; printf("%ld\n", c); }我们看到在上面这段代码中…

【git】git使用手册

目录 一 初始化 1.1 账号配置 1.2 ssh生成 1.2.1 配置ssh 1.2.2 测试SSH 1.3 初始化本地仓库并关联远程仓库 二 使用 2.1 上传 2.2 拉取 三 问题 3.1 关联失败 一 初始化 git的安装很简单,下载后大部分进行下一步完成即可----->地址: git工具下载 1.1 账号配置…

UE4_碰撞_自定义碰撞检测通道

效果如图&#xff1a; 1、项目设置中新建追踪检测通道weapon&#xff0c;默认值为忽略。 2、新建几个actor作为枪&#xff0c;碰撞预设全部设为自定义&#xff0c;把新建的检测响应weapon设为阻挡。 3、角色进行射线检测 运行效果如下&#xff1a; 发现有些物体碰不到&#xff…