MySQL的高可用(MHA)

高可用模式下的故障切换,基于主从复制。

单点故障和主从复制不能切换的问题。

至少需要三台。

故障切换过程0-30秒

vip地址,根据vip地址所在的主机,确定主备。

主 vip

备 vip

主和备不是优先级确定的,主从复制的时候就确定了,备是在MHA的过程中确定。

MHA的组件:

MHA NODE 数据节点,每台mysql和管理服务器都要安装 监控服务器状态以及收集数据

MHA的 manager 管理节点

管理mysql的高可用集群

可以单独部署在一台独立的服务器,也可以部署多个。

实现主备之间切换,主发生故障,切换到备。

MHA的特点:

1、manager来实现主备切换

2、数据同步还是依靠二进制日志,最大程度上保证数据的完整

3、半同步的方式实现数据的完整性

支持一主多从的架构,至少要三台。


实现MySQL的高可用

一主两从

搭建完成MHA的架构

主备之间的切换

故障恢复

4台机器

master 192.168.124.10 MySQL8.0 node组件

master 192.168.124.10 MySQL8.0 node组件

master 192.168.124.10 MySQL8.0 node组件

管理节点 192.168.233.20 node组件

先修改各个主机的主机名

hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2

修改 master、slave1、slave2 节点的 Mysql主配置文件/etc/my.cnf 

master

log_bin = master-bin:
用于记录主服务器上的更改操作的日志文件。
这个配置用于主服务器,将生成的二进制日志文件保存为"master-bin"(可以是其他自定义的名称)

log-slave-updates = true:
从服务器是否要记录它自己执行的更改操作到自己的二进制日志文件中。
设置为"true"表示从服务器会记录自己执行的更改操作,将其写入从服务器的二进制日志文件中。

slave1

log_bin = master-bin:
指定主服务器(master)的二进制日志文件名称,用于记录主服务器上的更改操作的日志文件。

relay-log = relay-log-bin:
指定从服务器的中继日志文件名称,即用于记录主服务器的二进制日志在从服务器上执行的中继日志。
从服务器会读取主服务器的二进制日志并将其记录到中继日志中。这个配置用于从服务器。

relay-log-index = slave-relay-bin.index:
指定从服务器的中继日志索引文件的名称,该索引文件用于跟踪中继日志文件的位置和顺序。
通过这个索引文件,从服务器知道哪个中继日志文件是下一个要读取和执行的。这个配置用于从服务器。
slave2

slave2不用设置master,指定主的备服务器为slave1即可。(永远的备胎)

在 master、slave1、slave2 节点上都创建两个软链接

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

配置 mysql 一主两从

master

CREATE USER 'myslave'@'192.168.233.%' IDENTIFIED WITH mysql_native_password BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.233.%';#manager 使用
CREATE USER 'mha'@'192.168.233.%' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'192.168.233.%' WITH GRANT OPTION;#防止从库通过主机名连接不上主库
CREATE USER 'mha'@'master' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'master';CREATE USER 'mha'@'slave1' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'slave1';CREATE USER 'mha'@'slave2' IDENTIFIED WITH mysql_native_password BY 'manager';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'slave2';flush privileges;

在 master 节点查看二进制文件和同步点

在 Slave1、Slave2 节点执行同步操作

change master to master_host='192.168.124.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2921; 

start slave;

在 Slave1、Slave2 节点查看数据同步结果
show slave status\G;
    
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。


两个从库必须设置为只读模式:
set global read_only=1;

插入数据测试数据库同步
所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源

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.6选择 0.57 版本。
在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,
因为 manager 依赖 node 组件。

 

cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install

在 MHA manager 节点上安装 manager 组件

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      所有的数据库节点和管理节点通过ssh来进行互相通信,检查集群的ssh配置

masterha_check_ repl      检查mysql的复制情况

masterha_manager     文件的启动脚本

masterha_check_status        检查MHA集群故障的文件

masterha_ master_ switch       控制故障转移

Imasterha_ stop           关闭manager服务

在所有服务器上配置无密码认证
在 manager 节点上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.124.50
ssh-copy-id 192.168.124.51

master 上配置到数据库节点 slave1 和 slave2 的无密码认证

ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.124.10
ssh-copy-id 192.168.124.50
ssh-copy-id 192.168.124.51

 在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.124.10
ssh-copy-id 192.168.124.51

 在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.124.10
ssh-copy-id 192.168.124.50

 在 manager 节点上复制相关脚本到/usr/local/bin 目录
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

master_ip_failover          自动切换时 VIP 管理的脚本
master_ip_online_change     在线切换时 vip 的管理
power_manager                 故障发生后关闭主机的脚本
send_report                 因故障切换后发送报警的脚本

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

 

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

修改内容如下:(删除原有内容,直接复制并修改vip相关参数)
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.124.100';
my $brdc = '192.168.124.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 节点服务器

在app1.cnf配置文件里面写入内容

[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 192.168.124.50 -s 192.168.124,51
#从对主监听
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.124.10
#主服务器
port=3306[server2]
candidate_master=1   
check_repl_delay=0
hostname=192.168.124.50 
#备用主服务器
port=3306[server3]
hostname=192.168.124.51 
#从服务器2
port=3306

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

在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully

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

在 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 &


实现主服务器宕机了转移备服务器,备服务器变成主

打开manager节点上的日志记录

关闭主服务器的数据库

查看一下vip地址

不见了,查看一下备服务器slave1上的地址

vip地址已经飘到slave1上面了,查看一下manager节点上面的状态信息

查看一下实验结果新的主服务器slave1和备服务器slave2之间能不能实现主从关系

下面恢复原来的主服务器,先停掉manager节点

更改manager节点上app1.cnf上面的配置

更改一下原来从服务器的地址,把原来主服务器的ip地址添加进去

原来的server1消失不见了,把slave1变成主,master变成从,manager节点上就改这么多

更改原主的配置文件和现主的配置文件

更改原主的配置文件,把原来备的配置文件添加到原主的配置文件中

重启一下

进入现主服务器中的数据库中,把只读模式关闭

查看主的状态

进入现在的备服务器数据库中,设置成只读模式

然后停止和重置slave ,执行同步操作

回到manager节点上查看

这时候主变成192.168.124.50

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

查看一下实验结果


MySQL的MHA总结:

MHA 是一套用于 MySQL 高可用的解决方案,具有以下重要特点和优势:

特点

1、自动故障切换:能够在主库出现故障时,快速自动地将从库提升为主库,减少服务中断时间。

2、数据一致性保障:在切换过程中,最大程度保证数据的一致性,避免数据丢失或不一致的情况。

3、无需修改现有部署:可以方便地集成到现有的 MySQL 主从复制架构中,无需对现有架构进行大规模修改。

工作原理
MHA 通常通过监控主库的状态来判断是否需要进行故障切换。它会定期检查主库的健康状况,包括网络连接、MySQL 服务状态等。一旦检测到主库故障,MHA 会选择一个最新的从库,并执行一系列操作将其提升为主库,包括应用剩余的 binlog 等。

配置步骤

  1. 安装 MHA 相关软件包。
  2. 配置主从复制环境。
  3. 配置 MHA 管理节点和各个服务器节点。
  4. 测试故障切换流程。

实际应用中的注意事项

  1. 网络延迟:要确保主从库之间的网络延迟在可接受范围内,以免影响故障切换的准确性和速度。
    例如,如果网络延迟过高,可能导致 MHA 误判主库故障。
  2. 从库的同步状态:定期检查从库的同步状态,确保在需要切换时能够选择到最新的从库。
  3. 监控和告警:配置完善的监控和告警机制,及时发现潜在的问题并通知管理员。

总之,MHA 为 MySQL 提供了一种可靠的高可用解决方案,但在实际应用中需要仔细配置和维护,以确保其正常稳定运行。

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

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

相关文章

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…

python使用rich.progress打印彩色进度条

常规的同步方法和for循环的进度&#xff0c;使用tqdm能很直观地展示进度&#xff1b;而一些异步协程或难以预估进度的&#xff0c;可以考虑使用rich.progress Ref: https://typer.tiangolo.com/tutorial/progressbar/#progress-bar 案例一&#xff1a;左侧展示旋转的小圈圈 …

机器学习(二十):偏差和方差问题

一、判断偏差和方差 以多项式回归为例&#xff0c;红点为训练集数据&#xff0c;绿点为交叉验证数据。 下图的模型&#xff0c;训练集误差大&#xff0c;交叉验证集误差大&#xff0c;这代表偏差很大 下图的模型&#xff0c;训练集误差小&#xff0c;交叉验证集误差小&#x…

等级保护 总结2

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…

外卖霸王餐系统架构怎么选?

在当今日益繁荣的外卖市场中&#xff0c;外卖霸王餐作为一种独特的营销策略&#xff0c;受到了众多商家的青睐。然而&#xff0c;要想成功实施外卖霸王餐活动&#xff0c;一个安全、稳定且高效的架构选择至关重要。本文将深入探讨外卖霸王餐架构的选择&#xff0c;以期为商家提…

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好&#xff0c;我是画画的小强 在 7 月初的一次更新中&#xff0c;ComfyUI 官方推出了 Beta 版 UI&#xff0c;取消了原本的悬浮面板&#xff0c;还新增了工作流管理功能&#xff0c;整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

pdf2image:将PDF文档转化为图像的Python魔法

标题&#xff1a;探索pdf2image&#xff1a;将PDF文档转化为图 像的Python魔法 背景 在数字时代&#xff0c;我们经常需要处理各种格式的文档&#xff0c;尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而&#xff0c;有时我们需要将PDF文件转换成图像格式&am…

springboot3-web-questions-分析

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、问题案例 1、maven项目compile时候出现告警warn 2、java文件打包然后在命令行中运行java会找不到主类 3、程序找不到数据库驱动和配置实例 4、springboot和mybatis-plus版本不兼容导致 5、springboot项目启动的解释…

21、Python之面向对象:一切皆对象,可你真的需要面向对象吗

引言 面向对象&#xff08;Object-Oriented Programming, OOP&#xff09;和面向过程&#xff08;Procedural Programming&#xff09;是两种不同的编程范式。不能因为我们接下来要进入“面向对象”的模块的学习&#xff0c;就武断地说&#xff0c;面向对象一定比面向过程好。…

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 &#xff0c;图片合并及保存需要另做处理&#xff01;&#xff01; 目标&#xff1a;Excel合并行内容的导入 结果&#xff1a; 1. ExcelUtil.java 类&#xff0c;新增方法&#xff1a;判断是否是合并行 /*** 新增 合并行相关代码&#xff1a;…

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

计网_数据通信基础知识

2024.07.05&#xff1a;计算机网络数据通信基础知识学习笔记 第2节 数据通信基础知识 2.1 物理层特性&#xff08;学会区分&#xff09;2.2 信道相关的基本概念2.2.1 数字信号的&#xff08;基带调制&#xff09;&#xff08;1&#xff09;不归零NRZ编码&#xff08;2&#xff…

1207. 有趣的数字图形IV

问题描述 输入一个整数 &#x1d45b; &#xff08; &#x1d45b;≤12 &#xff09;&#xff0c;打印出如下要求的方阵&#xff1a; 除掉右上到左下对角线上的数外的右下半个区域中每个元素等于左边的和上面的元素之和。每个元素场宽为 5 。左上半个区域为空。 输入 一个整…

C语言------指针讲解(3)

一、字符指针 在指针中&#xff0c;我们知道有一类指针类型为字符指针char*; int main() {char ch w;char* pc &ch;*pc w;return 0; } 还有一种使用方式如下&#xff1a; 上述代码中&#xff0c;本质是把hello的首字符的地址放到了pstr中。即把一个常量字符串的首字符…

C++图书管理系统

目录 实现功能 用户管理 图书管理 借阅与归还 未归还图书 部分效果图 结构体 Book 结构体 User 结构体 源代码 编译时在连接器命令行加入 完整代码 实现功能 用户管理 添加用户&#xff1a;输入用户ID、用户名和密码…

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画

在 Midjourney 中&#xff0c;seed 是指一个种子&#xff0c;用于生成图像时的起点或基础。 使用格式&#xff1a;--seed 获取的seed值 获取 seed 值 使用 seed 生成图像 a cute boys avatar, background with blue sky and white cloud, Ghibli Studio style, Hayao Miyazaki…

智能爬虫管理:定制化数据抓取方案为企业赋能

摘要&#xff1a; 在数据驱动的时代&#xff0c;精准而高效的数据抓取成为企业决策的命脉。本文将探讨如何通过定制化的智能爬虫管理方案&#xff0c;赋能企业实现数据洞察力的飞跃。我们将深入解析定制化数据抓取的核心优势&#xff0c;分享成功案例&#xff0c;并揭秘如何利…

InteliJ IDEA最新2024版下载安装与快速配置激活使用教程+jdk下载配置

第一步&#xff1a;下载ideaIC-2024.1.4 方法1&#xff1a;在线链接 IntelliJ IDEA – the Leading Java and Kotlin IDE (jetbrains.com) 选择社区版进行下载 方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1ydS6krUX6eE_AdW4uGV_6w?pwdsbfm 提取…

vue3+g2plot实现词云图

词云图 效果预览: 核心代码: import {WordCloud } from @antv/g2plot;fetch(https://gw.alipayobjects.com/os/antfincdn/jPKbal7r9r/mock.json).then((res) => res.json()).then((data) => {const wordCloud = new WordCloud(container, {data,wordField: x,weigh…