【简单认识MySQL的MHA高可用配置】

news2024/11/24 4:39:29

文章目录

  • 一、简介
    • 1、概述
    • 2、MHA 的组成
    • 3.MHA 的特点
    • 4、MHA工作原理
  • 二、搭建MHA高可用数据库群集
    • 1.主从复制
    • 2.MHA配置
  • 三、故障模拟
  • 四、故障修复步骤:


一、简介

1、概述

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

2、MHA 的组成

- MHA Node(数据节点)
MHA Node 运行在每台 MySQL 服务器上。
- MHA Manager(管理节点)
MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。

MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave
提升为新的 master 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

3.MHA 的特点

  • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从

4、MHA工作原理

MHA工作原理总结如下:

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

二、搭建MHA高可用数据库群集

实验准备
MHA 服务器:192.168.116.30
Master 数据库:192.168.116.50
Slave1 数据库:192.168.116.20
Slave2 数据库:192.168.116.40

1.主从复制

可使用之前的实验架构

#同步在线源阿里云的时间
ntpdate ntp.aliyun.com

主从数据库添加日志配置
vim /etc/my.cnf
 
#在[mysqld]下修改和添加的内容
 
#id项每台数据库不可一致!
server-id = 1
 
#二进制日志
log-bin=mysql-bin
binlog_format=MIXED
log-slave-updates=true
expire_logs_days=10
max_binlog_size=500M
 
#中继日志
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
 
#修改完后重启服务
systemctl restart mysqld.service

在这里插入图片描述

做软连接为后面主备切换准备

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

用户授权

--登入3台数据库,执行以下授权操作--
                                          --架构环境所在网段--
grant replication slave on *.* to 'myslave'@'192.168.116.%' identified by '123123';
 
grant all on *.* to 'mha'@'192.168.116.%' identified by '123123';
 
                        --三台数据库主机名--
grant all on *.* to 'mha'@'slave1' identified by '123123';
grant all on *.* to 'mha'@'slave2' identified by '123123';
grant all on *.* to 'mha'@'master' identified by '123123';

主从复制配置
先查看主节点状态,获取日志文件和位置点信息
在这里插入图片描述
在两台从节点中执行

--指定master信息--
change master to master_host='192.168.116.50',master_user='myslave',
master_password='123123',master_log_file='mysql-bin.000008',master_log_pos=2672;
 
--开启从节点--
start slave;
 
--查看从节点状态--
show slave status\G

在这里插入图片描述
都为yes即为成功
在这里插入图片描述
在这里插入图片描述
将两台从库设为只读
在这里插入图片描述
测试主从同步
主节点建库建表,看从节点是否也有,如果都有则同步一致
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.MHA配置

安装依赖包和软件
所有服务器安装依赖环境

yum install epel-release --nogpgcheck -y
 
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

所有服务器安装MHA-node组件(CentOS7.4需要选择0.57的版本)

#先把0.57版本的安装包放到/opt下
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
 
#编译安装
cd mha4mysql-node-0.57
perl Makefile.PL && make && make install

MHA服务器还需安装MHA-manager组件

#先把0.57版本的manager安装包放到/opt下
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL && make && 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 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)

配置到每台数据库免密登录

ssh-keygen -t rsa
 
#每台主机要依次配置其他数据库主机的ip(MHA服务器需要配置所有数据库主机的ip)
ssh-copy-id 192.168.116.20
ssh-copy-id 192.168.116.40
...

在这里插入图片描述
在这里插入图片描述
修改故障切换管理脚本

#将软件包中的脚本目录复制到/usr/local/bin/
cp -p /opt/mha4mysql-manager-0.57/samples/scripts/* /usr/local/bin/

master_ip_failover #自动切换时 vip 管理的脚本
master_ip_online_change #在线切换时 vip 的管理
power_manager #故障发生后关闭主机的脚本
send_report #因故障切换后发送报警的脚本
在这里插入图片描述

#修改故障切换脚本
vim 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.116.200';
my $brdc = '192.168.116.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
 
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";
}

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

[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.10.14 -s 192.168.10.15	#指定检查的从服务器IP地址
shutdown_script=""			#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root				#设置ssh的登录用户名
user=mha					#设置监控用户root

[server1]
hostname=192.168.10.16
port=3306

[server2]
hostname=192.168.10.14
port=3306
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

首次启动需要手动在Master节点上开启VIP

ifconfig ens33:1 192.168.116.200/24

在这里插入图片描述
启动前测试
在这里插入图片描述
在这里插入图片描述
启动

#开启
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 &
 
#检查开启状态
masterha_check_status --conf=/etc/masterha/app1.cnf
--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log:日志存放位置。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。

在这里插入图片描述

三、故障模拟

关闭master的mysqld服务

#在 manager 节点上监控观察日志记录
tail -f /var/log/masterha/app1/manager.log

#在 Master 节点 master 上停止mysql服务
systemctl stop mysqld
或
pkill -9 mysql

#正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 master 节点删除。查看 slave1 是否接管 VIP
ifconfig

跟踪mha服务器的日志(发现切换成功)
在这里插入图片描述
查看mha的配置文件
在这里插入图片描述
查看Slave1节点在这里插入图片描述
查看Slave2节点
在这里插入图片描述

四、故障修复步骤:

1.修复mysql
systemctl restart mysqld

2.修复主从
#在现主库服务器 Mysql2 查看二进制文件和同步点
show master status;

#在原主库服务器 mysql1 执行同步操作
change master to master_host='192.168.10.14',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1745;

start slave;


3.在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
vi /etc/masterha/app1.cnf
......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.10.14 -s 192.168.10.15
......
[server1]
hostname=192.168.10.16
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.10.14
port=3306

[server3]
hostname=192.168.10.15
port=3306

4.在 manager 节点上启动 MHA
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 &



#解决中英字不兼容报错的问题
dos2unix /usr/local/bin/master_ip_failover 

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

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

相关文章

Java网络编程基础概念

一、网络编程入门 1.1、软件结构 c/s结构&#xff1a;指客户端和服务器结构。如下图 B/S结构&#xff1a;指浏览器和服务器结构。如下图 共同点&#xff1a;无论哪一种架构&#xff0c;都离不开网络的支持。因此就设计到网络编程&#xff08;在一定的协议下&#xff0c;实…

android app控制ros机器人二

Ros-Mobile的使用基本熟悉&#xff0c;接下来熟悉代码&#xff0c;记录中间的问题。 GitHub - ROS-Mobile/ROS-Mobile-Android: Visualization and controlling application for Android 使用android studio打开项目后有bug。 BUG&#xff1a; 1.FAILURE: Build failed wit…

nvidia-smi输出的结果代表什么

nvidia-smi(NVIDIA System Management Interface) 是基于nvml的gpu的系统管理接口,主要用于显卡的管理和状态监控。 nvidia-smi简称NVSMI&#xff0c;提供监控GPU使用情况和更改GPU状态的功能&#xff0c;是一个跨平台工具&#xff0c;支持所有标准的NVIDIA驱动程序支持的Linu…

CMIP6数据处理及在气候变化、水文、生态等领域中的应用

气候变化对农业、生态系统、社会经济以及人类的生存与发展具有深远影响&#xff0c;是当前全球关注的核心议题之一。IPCC&#xff08;Intergovernmental Panel on Climate Change&#xff0c;政府间气候变化专门委员会&#xff09;的第六次评估报告明确&#xff1b;指出&#x…

低代码平台浅析:JNPF快速开发平台

目录 一、前言 二、低代码平台体验简述 三、关于平台 平台简介&#xff1a; 四、场景及用户分析 五、产品分析 1、着重讲一下JNPF的编辑器 2、业务流程 六、总结 一、前言 低代码平台能够改变了应用交付和管理的模式&#xff0c;大幅缩减交付周期&#xff0c;最终帮助业务加速创…

使用深度学习模型CNN进行实时情绪检测研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 使用深度学习模型CNN进行实时情绪检测是一种应用广泛的研究方向。下面是一个简要的步骤&#xff1a; 1. 数据收集和标注&#xff1a;收集包含…

华为OD机试真题 Java 实现【阿里巴巴找黄金宝箱(III)】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、那么问题来了&#xff0c;如果有两个满足的怎么办&#xff1f; 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为O…

类和对象(下篇)

目录 1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字 2.Static成员2.1概念2.2特性 3.友元3.1友元函数3.2友元类 4.内部类5.再次理解类和对象总结 1.再谈构造函数 1.1构造函数体赋值 如下为对象赋初值构造函数体的语句&#xff0c;不能称作初始化。 class D…

Ubuntu18.04系统安装视频剪辑软件shotcut

Snap Store安装 使用的是最新的Ubuntu 18.04 LTS&#xff08;Bionic Beaver&#xff09;&#xff0c;其本身已安装Snap 如果没有安装&#xff0c;则可以使用以下命令安装SNAP $ sudo apt-get install snapd安装shotcut $ sudo snap install shotcut --classic启动shotcut $…

8.JAVA NIO核心之选择器(Selector)

highlight: arduino-light 选择器(Selector)概述 选择器Selector是 SelectableChannle 对象的多路复用器&#xff0c;Selector 可以同时监控多个SelectableChannel的 IO 状况&#xff0c;也就是说&#xff0c;利用 Selector可使一个单独的线程管理多个 Channel。Selector 是非阻…

shift语句的使用

[rootvm1 scripts]# help shift shift: shift [n]Shift positional parameters.Rename the positional parameters $N1,$N2 ... to $1,$2 ... If N isnot given, it is assumed to be 1.Exit Status:Returns success unless N is negative or greater than $#.说明&#xff1a…

SWMM模型:水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用

查看原文>>>最新水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用 随着计算机的广泛应用和各类模型软件的发展&#xff0c;将排水系统模型作为城市洪灾评价与防治的技术手段已经成为防洪防灾的重要技术途径。本文聚焦于综合利用GIS及CAD等工具高效地进…

Rust vs Go:常用语法对比(十二)

题图来自 Rust vs Go in 2023[1] 221. Remove all non-digits characters Create string t from string s, keeping only digit characters 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 删除所有非数字字符 package mainimport ( "fmt" "regexp")func main() { s : hei…

07 |「注解、反射、多线程、锁」

前言 函数 文章目录 前言一、注解二、反射1、作用 三、多线程1、基本概念2、实现方式1&#xff09;继承 Thread 类2&#xff09;实现Runnable接口3、常用 API 四、锁1、为什么2、锁 一、注解 注解不影响程序逻辑&#xff0c;但会被编译器在不同阶段&#xff08;编译、执行&…

【小白必看】利用Python生成个性化名单Word文档

文章目录 前言所需文件及文件格式说明excel数据如下word 模板如下文件目录格式及生成后的文件 导入所需的模块&#xff1a;打开 Excel 文件&#xff1a;选择工作表&#xff1a;获取数据列表&#xff1a;遍历数据并生成 Word 文档&#xff1a;完整代码结束语 前言 对于需要批量…

【Python机器学习】实验03 logstic回归

文章目录 简单分类模型 - 逻辑回归1.1 准备数据1.2 定义假设函数Sigmoid 函数 1.3 定义代价函数1.4 定义梯度下降算法gradient descent(梯度下降) 1.5 绘制决策边界1.6 计算准确率1.7 试试用Sklearn来解决2.1 准备数据(试试第二个例子)2.2 假设函数与前h相同2.3 代价函数与前相…

找不到vcruntime140_1.dll,无法继续执行此代码如何解决

最近我在使用电脑时遇到了一个问题&#xff0c;即出现了vcruntime140_1.dll文件丢失的错误提示。这让我感到非常困惑和烦恼&#xff0c;因为我无法正常运行一些软件和游戏。 vcruntime140_1.dll是一个Windows系统文件&#xff0c;它是Microsoft Visual C Redistributable的一部…

maven本地仓库地址修改+maven国内镜像设置+maven运行所需pos.xml文件配置基本写法

1&#xff0c;maven本地仓库地址修改 maven在使用过程中&#xff0c;本地项目仓库其空间占用会越来越大&#xff0c;但是其默认仓库位置往往是以C盘为主&#xff0c;C盘作为系统盘常常会遇到所在盘空间占满的情况&#xff0c;所以我们将其改至其他硬盘空间位置为适合做法&#…

Vue style中的 scoped 属性

Vue 中存在 scoped 属性&#xff0c;HTML5中也存在一个 scoped 属性&#xff0c;而且&#xff0c;这两者都是针对 css 样式处理的属性&#xff0c;所以很多文章在 解释 Vue scoped 的时候&#xff0c;都会把两者混为一谈&#xff0c;直接进把 HTML5 scoped 的定义搬到 Vue scop…

TikTok带货成功的关键:用户参与与互动

TikTok作为一个社交媒体平台&#xff0c;其带货成功的关键之一是用户参与和互动。在这篇文章中&#xff0c;我们将探讨如何通过激发用户参与和互动&#xff0c;提高TikTok带货的效果。 首先&#xff0c;创造互动性的内容是吸引用户参与的重要因素。在带货视频中&#xff0c;可…