当前位置: 首页 > news >正文

Mysql集群——MHA高可用架构

MHA高可用架构

  • 一、介绍
    • 1、概念
    • 2、工作原理在这里插入图片描述
  • 二、实现过程
    • 1、环境说明
    • 2、环境配置
      • 2.1 初始化master配置
      • 2.2 初始化slave配置
      • 2.3 配置一主多从复制
      • 2.4 配置MHA
    • 3、MHA的故障切换
      • 3.1 master故障手动切换
      • 3.2 自动切换(配置VIP)

一、介绍

1、概念

MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的slave 节点成为新的master 节点,在此期间,MHA 会通过其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。
MHA 是由日本人 yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的 MySQL 高可用方案。MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。

MHA 服务有两种角色, MHA Manager(管理节点)和 MHA Node(数据节点):
**MHA Manager:**通常在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
**MHA node:**MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

在这里插入图片描述

2、工作原理在这里插入图片描述

  • 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,一台充当从库。

  • MHA Node 运行在每台 MySQL 服务器上。

  • MHAManager 会定时探测集群中的master 节点。

  • 当master 出现故障时,它可以自动将最新数据的slave 提升为新的master

  • 然后将所有其他的slave 重新指向新的master,VIP自动漂移到新的master。

  • 整个故障转移过程对应用程序完全透明。

二、实现过程

1、环境说明

机器名称IP配置操作系统版本/数据库版本说明
mha-manager192.168.83.200rhel7.9manager控制器
master192.168.83.138rhel7.9/mysql8.0.40数据库主服务器
rep1192.168.83.139rhel7.9/mysql8.0.40数据库从服务器
rep2192.168.83.140rhel7.9/mysql8.0.40数据库从服务器

2、环境配置

2.1 初始化master配置

[root@master mysql]#  vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=138   # 集群中的各节点的id必须唯一
gtid-mode=on  # 启用gtid类型
enforce-gtid-consistency=true  # 强制GTID一致性
log-bin=binlog  # 开启二进制日志
relay-log=relay-log  # 开启中继日志
relay_log_purge=0  # 是否自动清空不再需要的中继日志
log-slave-updates=true  # slave更新的信息是否记入二进制日志中# 删除注释
[root@master ~]# sed -i 's/#.*//' /etc/my.cnf# 重启mysql
[root@master mysql]# /etc/init.d/mysqld restart

2.2 初始化slave配置

rep1配置

[root@rep1 mysql]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=139
gtid-mode=on  
enforce-gtid-consistency=true  
log-bin=binlog
relay-log=relay-log
relay_log_purge=0
log-slave-updates=true[root@rep1 mysql]# /etc/init.d/mysqld restart

rep2配置

[root@slave2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=140
gtid-mode=on  
enforce-gtid-consistency=true
log-bin=mysql-bin
relay-log=relay-log
relay_log_purge=0
log-slave-updates=true[root@rep2 mysql]# /etc/init.d/mysqld restart

2.3 配置一主多从复制

# master,mha只支持mysql_native_password密码认证插件
mysql> create user 'rep'@'%' identified WITH mysql_native_password  by '123';
grant  replication slave on *.* to 'rep'@'%';# rep1和rep2节点上
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.83.138',
SOURCE_USER='rep',
SOURCE_PASSWORD='123',
master_auto_position=1,
SOURCE_SSL=1; 
mysql> start replica;
mysql> show replica status \G
Replica_IO_Running: Yes
Replica_SQL_Running: Yes

2.4 配置MHA

安装MHA包,下载地址:

https://code.google.com/archive/p/mysql-master-ha/

github下载地址:

https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

# mha-manager上安装软件包
[root@mha-manager ~]# wget  https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
[root@mha-manager ~]# wget  https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm# 如果使用上面的命令下载不下来可以使用上传的包
[root@mha-manager ~]# ls MHA-7.zip
MHA-7.zip
[root@mha-manager ~]# yum install unzip -y
[root@mha-manager ~]# unzip MHA-7.zip
[root@mha-manager ~]# cd MHA-7/
[root@mha-manager MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@mha-manager MHA-7]# yum localinstall ./*.rpm# 所有主机上配置自解析域名
vim /etc/hosts
192.168.83.138 master
192.168.83.139 rep1
192.168.83.140 rep2
192.168.83.200 mha-manager# 尝试登录所有主机
[root@mha-manager MHA-7]#  for i in {master,rep1,rep2};do ssh root@$i hostname ;done# 其他三个mysql服务器上安装mha4mysql-node即可,复制mha4mysql-node到所有数据库服务器
[root@mha-manager MHA-7]#  for i in {master,rep1,rep2};do scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@$i:/root;done# 所有数据库上安装mha4mysql-node
[root@master ~]# yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# 设置可以远程访问mysql的用户,并设置管理员权限。
# 只需要在master上运行即可
create user 'mhaadm'@'%' identified WITH mysql_native_password  by '123';
grant all on *.* to 'mhaadm'@'%';

配置所有主机免密登录

MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。

# 所有节点生成公私钥
ssh-keygen -f /root/.ssh/id_rsa -P '' -q
# 将所有节点的公钥上传至manager节点
[root@master ~]# ssh-copy-id  root@mha-manager
[root@rep1 ~]# ssh-copy-id  root@mha-manager
[root@rep2 ~]# ssh-copy-id  root@mha-manager# 将manager节点的authorized_keys分发到其他节点
[root@mha-manager ~]# for i in {master,rep1,rep2};do scp /root/.ssh/authorized_keys  root@$i:/root/.ssh;done# 验证
[root@mha-manager ~]# for i in {master,rep1,rep2};do ssh $i hostname ;done
master
rep1
rep2
[root@mha-manager ~]# ssh-keygen -f /root/.ssh/id_rsa -P '' -q
[root@mha-manager ~]# for i in {master,rep1,rep2} ;do ssh-copy-id root@$i;done
[root@mha-manager ~]# for i in {master,rep1,rep2} ;do scp /root/.ssh/id_rsa root@$i:/root/.ssh;done

Manager 节点需要为每个监控的 master/slave 集群提供一个专用的配置文件,而所有的master/slave 集群也可共享全局配置。全局配置文件默认为 /etc/masterha_default.cnf ,其为可选配置。如果仅监控一组 master/slave 集群,也可直接通过 application 的配置来提供各服务器的默认配置信息。而每个 application 的配置文件路径为自定义。

# 在manager上创建配置文件目录
[root@mha-manager ~]# mkdir   -p  /etc/mha  /var/log/mha/app1
[root@mha-manager ~]# vim  /etc/mha/app1.cnf
[server default]   #适用于server1,2,3个server的配置
user=mhaadm    #mha管理用户
password=123  #mha管理用户密码
manager_workdir=/var/log/mha/app1  #mha的工作路径
manager_log=/var/log/mha/app1/manager.log  #mha的日志文件
ssh_user=root  #基于ssh的秘钥认证
repl_user=rep  #主从复制的账号
repl_password=123
ping_interval=1  #ping间隔时长
[server1]   #mysql主机信息
hostname=192.168.83.138
ssh_port=22 
candidate_master=1  #设置该主机将来可能成为master候选节点
[server2]
hostname=192.168.83.139
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.83.140
ssh_port=22
no_master=1# 删除注释内容
[root@mha-manager ~]# sed -i 's/#.*//' /etc/mha/app1.cnf

输入如下命令检测各节点间ssh互信通信配置是否ok

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

在这里插入图片描述

检查mysql复制集群的连接配置参数是否ok

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

在这里插入图片描述

3、MHA的故障切换

3.1 master故障手动切换

# 模拟master故障
[root@master mysql]# /etc/init.d/mysqld stop# 在mha-manager中做故障切换
[root@mha-manager ~]# masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf --dead_master_host=192.168.83.138  --dead_master_port=3306  --new_master_host=192.168.83.139 --new_master_port=3306 --ignore_last_failover
....省略部分输出....
Master failover to 192.168.83.139(192.168.83.139:3306) completed successfully.# --ignore_last_failover 表示忽略在/var/log/mha/app1/目录中在切换过程中生成的锁文件# 在rep1和rep2上查看
mysql>  show replicas;          # rep1
mysql>  show replica status\G   # rep2# 可以在主库rep1上创建数据进行测试

恢复故障mysql节点

[root@master ~]# /etc/init.d/mysqld start# 将该主机重新加入集群中
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.83.139',
SOURCE_USER='rep',
SOURCE_PASSWORD='123',
master_auto_position=1,
SOURCE_SSL=1;
mysql> start replica;
mysql> show replica status\G

启动mha,使msyql故障后自动切换

# 删除锁文件,如果不删除的话mha无法故障转移成功
[root@mha-manager ~]# rm -rf  /var/log/mha/app1/app1.failover.complete
# 启动mha。可以使用--ignore_last_failover选项选择忽略锁文件
[root@mha-manager ~]# masterha_manager --conf=/etc/mha/app1.cnf# 查看mha的状态
[root@mha-manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:3866) is running(0:PING_OK), master:192.168.83.139# 模拟主mysql宕机
[root@rep1 ~]# /etc/init.d/mysqld  stop
#注意:故障转移完成后,mha-manager将会自动停止运行
#查看转移日志
[root@mha-manager ~]# cat /var/log/mha/app1/manager.log
----- Failover Report -----app1: MySQL Master failover 192.168.83.139(192.168.83.139:3306) to 192.168.83.138(192.168.83.138:3306) succeededMaster 192.168.83.139(192.168.83.139:3306) is down!Check MHA Manager logs at mha-manager:/var/log/mha/app1/manager.log for details.Started automated(non-interactive) failover.
Selected 192.168.83.138(192.168.83.138:3306) as a new master.
192.168.83.138(192.168.83.138:3306): OK: Applying all logs succeeded.
192.168.83.140(192.168.83.140:3306): OK: Slave started, replicating from 192.168.83.138(192.168.83.138:3306)
192.168.83.138(192.168.83.138:3306): Resetting slave info succeeded.
Master failover to 192.168.83.138(192.168.83.138:3306) completed successfully.#在从192.168.83.140上查看当前的主是谁,已经成功切换到192.168.83.138
mysql> show replica status \G
*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.83.138Source_User: repSource_Port: 3306Connect_Retry: 60Source_Log_File: binlog.000014Read_Source_Log_Pos: 237Relay_Log_File: relay-log.000002Relay_Log_Pos: 367Relay_Source_Log_File: binlog.000014Replica_IO_Running: YesReplica_SQL_Running: Yes
# 删除锁文件
[root@mha-manager ~]# rm -rf  /var/log/mha/app1/app1.failover.complete# 恢复故障的从
[root@rep1 ~]# /etc/init.d/mysqld  start
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.83.138',
SOURCE_USER='rep',
SOURCE_PASSWORD='123',
master_auto_position=1,
SOURCE_SSL=1;
mysql> start replica;

3.2 自动切换(配置VIP)

vip配置可以采用两种方式,一种通过keepalived的方式管理虚拟ip的浮动;另外一种通过脚本方式启动虚拟ip的方式 (即不需要keepalived或者heartbeat类似的软件)。为了防止脑裂发生,推荐生产环境采用脚本的方式来管理虚拟ip,而不是使用keepalived来完成。

编写脚本

[root@mha-manager ~]# 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
);
#注意此处配置的ip地址和网卡名称
my $vip = '192.168.83.88/24';
my $ssh_start_vip = "/sbin/ip a add $vip dev ens32";
my $ssh_stop_vip = "/sbin/ip a del $vip dev ens32";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() {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";
}[root@mha-manager ~]# chmod +x /usr/local/bin/master_ip_failover

更改manager配置文件

[root@mha-manager ~]# vim /etc/mha/app1.cnf
[server default]
#添加如下信息
master_ip_failover_script=/usr/local/bin/master_ip_failover

在主库上手动配置第一次的VIP地址

[root@master mysql]# ip a add 192.168.83.88/24 dev ens32
[root@master mysql]# ip a show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:67:6c:c9 brd ff:ff:ff:ff:ff:ffinet 192.168.83.138/24 brd 192.168.83.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet 192.168.83.88/24 scope global secondary ens32

在mha-manager上启动MHA

[root@mha-manager ~]# masterha_manager --conf=/etc/mha/app1.cnf --ignore_last_failover

在master节点关闭mysql服务模拟主节点数据崩溃。

[root@master mysql]# /etc/init.d/mysqld  stop

在rep1上查看VIP

[root@rep1 ~]# ip a show ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:bb:f0:e2 brd ff:ff:ff:ff:ff:ffinet 192.168.83.139/24 brd 192.168.83.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet 192.168.83.88/24 scope global secondary ens32

文章转载自:

http://Kbq5PPUk.ptysj.cn
http://WaWtzh5q.ptysj.cn
http://NHnjgqLA.ptysj.cn
http://yfEEeVgm.ptysj.cn
http://8U5Adqoq.ptysj.cn
http://w6kabeA2.ptysj.cn
http://iUDyDnYI.ptysj.cn
http://dzCeUNId.ptysj.cn
http://vDFSzrfI.ptysj.cn
http://BbDcUGiU.ptysj.cn
http://A6XWxqwv.ptysj.cn
http://kraLE5ho.ptysj.cn
http://60CsdG4V.ptysj.cn
http://vBZgfUoF.ptysj.cn
http://9V5xDG9d.ptysj.cn
http://EBeMFYFl.ptysj.cn
http://uTbyv3Cp.ptysj.cn
http://NC8hBVtl.ptysj.cn
http://TYBdoqDK.ptysj.cn
http://o9hM3OGZ.ptysj.cn
http://rwGa1zog.ptysj.cn
http://gRbxrBBE.ptysj.cn
http://7Yc3jWcz.ptysj.cn
http://5A5AfDEp.ptysj.cn
http://4gOwFB9J.ptysj.cn
http://Y12Hp2g3.ptysj.cn
http://kzMJpc54.ptysj.cn
http://ot0E8SsC.ptysj.cn
http://s9G8sOs5.ptysj.cn
http://5T3fXyfS.ptysj.cn
http://www.dtcms.com/a/375811.html

相关文章:

  • 【一包通刷】晶晨S905L(B)/S905L2(B)/S905L3(B)-原机安卓4升级安卓7/安卓9-通刷包
  • SYSTEM 提权面板:提升文件运行权限的高效工具
  • 【Python】S1 基础篇 P6 用户交互与循环控制:构建动态交互程序
  • Java 数据类型详解
  • java常见SSL bug解决方案
  • JAVA stream().flatMap()
  • 【C++】string类 - 库中的常见使用
  • Go语言基础---数据类型间的故事
  • 金融量化指标--6InformationRatio信息比率
  • GPT Server 文档
  • CDN加速带来的安全隐患及应对方法
  • HCL Unica+:AI驱动的营销自动化与个性化平台
  • spring事务管理之@Transactional
  • golang之go modules
  • 设计UIUC SE 423机电一体化的机器人
  • 《Vuejs设计与实现》第 15 章(编译器核心技术)上
  • (二)文件管理-文件查看-more命令的使用
  • IntelliJ IDEA双击Ctrl的妙用
  • cfshow-web入门-php特性
  • libvirt 新手指南:从零开始掌握虚拟化管理
  • Oracle打补丁笔记
  • 【JavaEE】(24) Linux 基础使用和程序部署
  • TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接
  • Spring MVC 的常用注解
  • 肺炎检测系统
  • ctfshow-web-SSTI模版注入
  • RHEL 10 更新 rescue kernel
  • Vue3 + Vite + Element Plus web转为 Electron 应用,解决无法登录、隐藏自定义导航栏
  • 记SpringBoot3.x + SpringSecurity6.x之session管理
  • Pinia 两种写法全攻略:Options 写法 vs Setup 写法