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

MHA高可用架构

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

MHA工作原理:

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

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

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

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

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

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

准备工作

机器名称ip版本说明
manager192.168.1.2008.0.40 Source distributionmanager控制器
master192.168.1.1288.0.40 Source distribution数据库主服务器
rep1192.168.1.1298.0.40 Source distribution数据库从服务器
rep2192.168.1.1308.0.40 Source distribution数据库从服务器
  • 配置master,rep1,rep2的/etc/my.cnf文件

  • 然后三台机器重新启动mysql
/etc/init.d/mysqld restart

配置一主多从复

主库配置

master节点上,mha只支持mysql_native_password密码认证插件

在主机上创建认证用户并赋予权限

create user 'rep'@'%' identified WITH mysql_native_password  by '123';
grant  replication slave on *.* to 'rep'@'%';

两台从库的配置

CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.1.128',
SOURCE_USER='rep',
SOURCE_PASSWORD='123',
master_auto_position=1,
SOURCE_SSL=1;

开启从库开关

start replica;

查看从库的主从同步状态

show replica status;

  • 四台主机配置dns解析

配置MHA

首先安装HMA的包

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

github下载地址:

Release mha4mysql-manager-0.58 · yoshinorim/mha4mysql-manager · GitHub

在manager中配置:

  • 上传HMA的压缩文件

  • 解压缩HMA的压缩文件
unzip MHA-7.zip

  • 下载MHA的包
yum install ./*.rpm -y

  • master,rep1,rep2需要下载node节点,都在MHA的压缩包内,可以通过scp的命令,从manager的机器内传到这三台主机内
for i in {master,rep1,rep2};do scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@$i:/root;done

  • 查看文件是否传输成功

  • master,rep1,rep2下载传过来的node节点包

master的用户设置

  • 设置可以远程访问mysql的用户,并设置管理员权限。
  • 只需要在master上运行即可
create user 'mhaadm'@'%' identified WITH mysql_native_password  by '123';
grant all on *.* to 'mhaadm'@'%';

  • MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。配置好四台主机的公私要方便连接
  1. 所有节点生成公私钥(manager,master,rep1,rep2)
ssh-keygen

  • 将所有节点的公钥上传至manager节点,最后将manager节点的authorized_keys分发到其他节点
ssh-copy-id root@manager
for i in {master,rep1,rep2};do scp /root/.ssh/authorized

  • 测试节点是否可以免密登录
for i in {master,rep1,rep2};do ssh $i hostname ;done

  • 在manager上创建配置文件目录--用于记录mha的配置文件和日志文件
mkdir -p /etc/mha /var/log/mha/app1

  • 配置mha的配置
vim /etc/mha/app1.cnf

  • 输入如下命令检测各节点间ssh互信通信配置是否ok
  •  masterha_check_ssh --conf=/etc/mha/app1.cnf

  • 检查mysql复制集群的连接配置参数是否ok
master_check_repl --conf=/etc/mha/app1.cnf

测试master故障手动配置mha来转移master

  • 首先停止master的mysql
/etc/init.d/mysqld stop

手动配置mha控制master转移到rep1上

  • 在manager上配置
masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf --dead_master_host=192.168.1.128 --dead_master_port=3306 --new_master_host=192.168.1.129 --new_master_port=3306 --ignore_last_failover

  • 在rep1上查看一下--rep1的从库情况--master成功转移到rep1上
show replicas;

  • 恢复MySQL的故障节点使master重新加入集群
[root@master mysql]# /etc/init.d/mysqld start
#将该主机重新加入集群中
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.168.129',
SOURCE_USER='rep',
SOURCE_PASSWORD='123',
master_auto_position=1,
SOURCE_SSL=1;
Query OK, 0 rows affected, 3 warnings (0.00 sec)mysql> start replica;
Query OK, 0 rows affected (0.01 sec)mysql> show replica status\G
*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.168.129Source_User: repSource_Port: 3306Connect_Retry: 60Source_Log_File: binlog.000003Read_Source_Log_Pos: 1249Relay_Log_File: relay-log.000003Relay_Log_Pos: 451Relay_Source_Log_File: binlog.000003Replica_IO_Running: YesReplica_SQL_Running: Yes

配置mha故障自动转移master

  • 删除锁文件,如果不删除的话mha无法故障转移成功
rm -rf /var/log/mha/app1/app1.failover.complete

  • 开启mha的检测
masterha_manager --conf=/etc/mha/app1.cnf

  • 查看mha的状态-----在复制一台manager查看
 masterha_check_status --conf=/etc/mha/app1.cnf

  • 模拟主mysql宕机---关闭rep1的数据库

  • 当故障转移完成后,mha-manager将会自动停止运行
  • 查看转移日志
cat /var/log/mha/app1/manager.log

  • 查看一master的机器的从库情况--此时rep1宕机只有rep2一台从库

  • 删除锁文件
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.168.128',
SOURCE_USER='rep',
SOURCE_PASSWORD='123',
master_auto_position=1,
SOURCE_SSL=1;
mysql> start replica;

配置VIP

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

  • 在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
);
my $vip = '192.168.1.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";
}
  • 给/usr/local/bin/master_ip_failover增加权限
chmod +x /usr/local/bin/master_ip_failover
  • 更改manager配置文件
vim /etc/mha/app1.cnf
[server default]
master_ip_failover_script=/usr/local/bin/master_ip_failover
user=mhaadm
password=123
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log
ssh_user=root
repl_user=rep
repl_password=123
ping_interval=1
[server1]
hostname=192.168.1.128
ssh_port=22
candidate_master=1
[server2]
hostname=192.168.1.129
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.1.130
ssh_port=22
no_master=1

  • 在主库master上手动配置第一次的VIP地址
ip address add 192.168.1.88/24 dev ens32

先检查一下三台主机的ssh通信情况和MySQL集群连接配置的参数

  • 在mha-manager上启动MHA
masterha_manager --conf=/etc/mha/app1.cnf --ignore_last_failover

模拟故障停掉master机器

/etc/init.d/mysqld stop

  • 常看IP是否漂移
  • 首先查看master机器是否还有VIP---不存在

  • 在查看一下rep1的IP是否存在VIP---存在VIP----VIP在mha的控制下从master转移到rep1/

http://www.xdnf.cn/news/20230.html

相关文章:

  • 多线程(六) ~ 定时器与锁
  • 驱动开发系列71 - GLSL编译器实现 - 指令选择
  • python 逻辑运算练习题
  • HttpClient、OkHttp 和 WebClient
  • 贪心算法应用:交易费优化问题详解
  • OpenLayers常用控件 -- 章节七:测量工具控件教程
  • 《sklearn机器学习——聚类性能指标》Fowlkes-Mallows 得分
  • Java学习笔记二(类)
  • 【3D图像算法技术】如何在Blender中对复杂物体进行有效减面?
  • 【EXPLAIN详解:MySQL查询优化师的显微镜】
  • MacOS 使用 luarocks+wrk+luajit
  • Docker 本地开发环境搭建(MySQL5.7 + Redis7 + Nginx + 达梦8)- Windows11 版 2.0
  • Mac Intel 芯片 Docker 一键部署 Neo4j 最新版本教程
  • 【Android 消息机制】Handler
  • PDF教程|如何把想要的网页保存下来?
  • docker 推送仓库(含搭建、代理等)
  • 服务器线程高占用定位方法
  • 使用 Shell 脚本监控服务器 IOWait 并发送邮件告警
  • Python带状态生成器完全指南:从基础到高并发系统设计
  • C#实现导入CSV数据到List<T>的完整教程
  • 【基础-单选】用哪一种装饰器修饰的struct表示该结构体具有组件化能力?
  • Playwright携手MCP:AI智能体实现自主化UI回归测试
  • 第26节:GPU加速计算与Compute Shader探索
  • Homebrew执行brew install出现错误(homebrew-bottles)
  • Go语言后端开发面试实战:谢飞机的“硬核”面试之旅
  • CodeBuddy 辅助重构:去掉 800 行 if-else 的状态机改造
  • Eclipse下的一些快捷键备忘录
  • LangChain实战(十九):集成OpenAI Functions打造强大Agent
  • Day37 MQTT协议 多客户端服务器模型
  • 手写MyBatis第53弹: @Intercepts与@Signature注解的工作原理