mysql 高可用 之 MHA 故障切换

MHA简介

MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。

failover :网络 故障转移; 故障切换; 容错; 失效接管; 失效转移

MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从。

MHA服务的角色

MHA 服务有两种角色,MHA Manager(管理节点)和MHA Node(数据节点)

MHA Manager:
 通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。

MHA node:
  运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移。
  主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

在这里插入图片描述

由上图我们可以看出,每个复制组内部和 Manager 之间都需要ssh实现无密码互连,只有这样,在 Master 出故障时, Manager 才能顺利的连接进去,实现主从切换功能

MHA提供的工具

MHA会提供诸多工具程序。
Manager节点:

    masterha_check_ssh:MHA 依赖的 ssh 环境监测工具;
  masterha_check_repl:MYSQL 复制环境检测工具;
  masterga_manager:MHA 服务主程序;
  masterha_check_status:MHA 运行状态探测工具;
  masterha_master_monitor:MYSQL master 节点可用性监测工具;
  masterha_master_swith:master:节点切换工具;
  masterha_conf_host:添加或删除配置的节点;
  masterha_stop:关闭 MHA 服务的工具。

Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)

save_binary_logs:保存和复制 master 的二进制日志;
apply_diff_relay_logs:识别差异的中继日志事件并应用于其他 slave;
purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);

MHA的工作原理

在这里插入图片描述

MHA工作原理总结为以下几条:
(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);
(2) 识别含有最新更新的 slave ;
(3) 应用差异的中继日志(relay log) 到其他 slave ;
(4) 应用从 master 保存的二进制日志事件(binlog events);
(5) 提升一个 slave 为新 master ;
(6) 使用其他的 slave 连接新的 master 进行复制。

实现步骤

MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等。

实验环境:

server1  主数据库  172.25.2.10
server2  从数据库   172.25.2.11
server3  从代理器  172.25.2.254
真机     MHAmanager 172.25.2.250

关闭4台主机的防火墙和selinux 

前提做好4台数据库的主从复制,这里采用基于GTID的主从复制。
并且应该在每个主机上编写 /etc/hosts文件,便于后面的ssh 连接。

在这里插入图片描述

1.server1中的my.cnf的配置文件
在这里插入图片描述

server-id = 1              //复制集群中的各节点的id均必须唯一 
log_slave_updates = on       //使得更新的数据写进二进制日志中
 log-bin =binlog        //开启二进制日志

2.server2中的配置文件
在这里插入图片描述3.server3中的配置文件
在这里插入图片描述4.开启server1
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述5.对server2做配置
在这里插入图片描述进行初始化并且登录进数据库之后
在这里插入图片描述在这里插入图片描述6.对server3进行相应配置
登陆进数据库

在这里插入图片描述
在这里插入图片描述以server1为主,server2,server3为从数据库的基GTID的主从复制到此完成。

MHA manager节点

真机,172.25.2.250,用于监控管理,它是整个集群的控制器。
1.安装软件

yum	install	-y	mha4mysql-manager-0.58-0.el7.centos.noarch.rpm	perl-* mha4mysql-node-0.58-0.el7.centos.noarch.rpm

在这里插入图片描述在这里插入图片描述2.#配置免密访问(server4 需要连接 server1 2 3 都免密码

先生成密钥
在这里插入图片描述在这里插入图片描述#发送密钥
在这里插入图片描述在这里插入图片描述在这里插入图片描述测试免密登录
在这里插入图片描述其他 3 个节点都安装 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在manager节点配置 mha 工作目录及配置文件
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述##检测 ssh 连接

masterha_check_ssh --conf=/etc/masterha/app1.cnf

发现报错,server1 2 3 互相之间不免密拷贝 

在这里插入图片描述 真机上的密钥给 server1 2 3
在这里插入图片描述再检测 ssh,成功

接下来在真机上检测复制功能

masterha_check_repl --conf=/etc/masterha/app1.cnf

在这里插入图片描述在这里插入图片描述发现有报错,这是因为 manager 默认是用 root 远程连接数据库,但是在配置数据库是已经禁用了 root 的远程连接

在主库上授权用户

 grant all on *.* to root@'%' identified by 'W....';

在这里插入图片描述再次在manager检测时,正确
在这里插入图片描述在这里插入图片描述测试 manager 能否开启

 nohup	masterha_manager	--conf=/etc/masterha/app1.cnf
--remove_dead_master_conf	--ignore_last_failover	<	/dev/null	> /var/log/masterha.log 2>&1 & 打入后台运行

在这里插入图片描述测试手动 failover 切换先关闭 manager,不关的话切不了,manager 就是自动切换的工具

在这里插入图片描述

手动死切

手动切换之前,需要保证主从同步正常,repl 复制用户能够远程连接’ 中间都选 yes。
在这里插入图片描述
在manager上

masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.2.10 --dead_master_ip=172.25.0.1
--dead_master_port=3306	--new_master_host=172.25.2.11
--new_master_port=3306

在这里插入图片描述在这里插入图片描述切换成功后,可以在 server3 上看到它的 master 已经变成了 server2( 而 server2 已经时是master 了再手动开启 server1,作为 slave 加入集群

在这里插入图片描述将server1加入集群。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述当完成一次手动切换后,manager上生成了如下文件
在这里插入图片描述在/etc/masterha 目录下生成一个 app1.failover.complete 文件,是来记录 failover 情况的,再进行 failover 时必须先把这个文件删除,不然不会 failover

手动活切

手动在线切换,刚才是 master 挂掉后切换,现在是master在线时切换。

在manager中

masterha_master_switch	--conf=/etc/masterha/app1.cnf	--master_state=alive
--new_master_host=172.25.2.10	--new_master_port=3306
--orig_master_is_new_slave --running_updates_limit=10000

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

又切换回 172.25.2.10 为 master

在这里插入图片描述

半自动故障转移( failover )

首先清理 app1.failover.complete

1.开启mha manager

nohup	masterha_manager
--conf=/etc/masterha/app1.cnf &>/dev/null &

在这里插入图片描述mha manager 自带守护进程,在 server1 上查看

在这里插入图片描述在这里插入图片描述
再查看,发现 mysql 进程又开启了
在这里插入图片描述

在 server1 上手动关闭 mysqld
在这里插入图片描述在manager上查看日志,发现已经切换,同时 manager 进程退出,所以全自动需要脚本先把 server1 加回集群
在这里插入图片描述在server1上

CHANGE MASTER TO MASTER_HOST = '172.25.2.11', MASTER_USER = 'repl',
MASTER_PASSWORD = 'Wssss', MASTER_AUTO_POSITION = 1;
 start slave;

配置 vip 漂移

因为用户访问入口只能有一个,对客户端来说,访问的vip,只能有一个,客户端感受不到后端多台数据库服务器在服务。所以需要配置 vip,当发生故障时,谁获得vip,谁上线。

1.在manager中,编辑 master_ip_failover 和 master_ip_online_change 两个脚本
配置自动添加和删除 vip
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

注意在 manager 的配置文件种这两行的注释要打开

master_ip_failover_script= /usr/local/bin/master_ip_failover 
master_ip_online_change_script= /usr/local
/bin/master_ip_online_change

在这里插入图片描述在这里插入图片描述已经将serevr1设置成主库,先给 server1 添加 vip
在这里插入图片描述
在这里插入图片描述
在manager中关闭ha
在这里插入图片描述

手动测试vip漂移

手动测试 vip 漂移(在线切)

在这里插入图片描述可以看到切换 vip

在这里插入图片描述在这里插入图片描述server2获得vip
在这里插入图片描述server2成为主库
在这里插入图片描述

测试全自动漂移

在这里插入图片描述
manager开启MHA
在这里插入图片描述serevr2上关闭mysqld
在这里插入图片描述manager查看日志
在这里插入图片描述可以看到切换成功,vip 也成功漂移 server1成为主库
在这里插入图片描述在这里插入图片描述

发布了264 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45649763/article/details/104750719