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

Mariadb高可用MHA

目录

前言

一、概述

(一)、概念

(二)、组成

(三)、特点

(四)、工作原理

二、案例

(一)、构建MHA

1.所有节点ssh免密登录

2、MySQL主从复制

 (二)、MHA安装

1.所有节点安装perl环境

 2.所有节点安装node

 3.manager

4.脚本说明

5.配置文件建立

6.测试MHA

7.启动命令

(三)、测试

总结



前言

高可用MySQL集群是指部署了多个MySQL实例的集群,可以在节点出现故障的情况下,自动切换到另一个可用节点,保证系统的高可用性和可靠性。

一、概述

(一)、概念

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

MHA 的出现就是解决MySQL 单点的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

(二)、组成

MHA manager        管理节点
MHA node              数据节点        每个节点上都需要安装

(三)、特点

自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。


使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。


目前MHA支持一主多从架构,最少三台服务,即一主两从。

(四)、工作原理

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

二、案例

192.168.238.134        manager(MHA)        即mgt

192.168.238.135        master                           master

192.168.238.136        slave                             slave1

192.168.238.137        slave                             slave2

(一)、构建MHA

1.所有节点ssh免密登录

192.168.238.134

ssh-keygen

for i in 135 136 137;do ssh-copy-id root@192.168.238.$i;done

yes确认指纹,和输入对应主机的密码

192.168.238.135

ssh-keygen

for i in 134 136 137;do ssh-copy-id root@192.168.238.$i;done

yes确认指纹,和输入对应主机的密码

192.168.238.136

ssh-keygen

for i in 134 135 137;do ssh-copy-id root@192.168.238.$i;done

yes确认指纹,和输入对应主机的密码

192.168.238.135

ssh-keygen

for i in 134 135 136;do ssh-copy-id root@192.168.238.$i;done

yes确认指纹,和输入对应主机的密码

进行验证看是否免密成功逐一登录登出,确保后续脚本正常运行

192.168.238.134为例

2、MySQL主从复制

yum install -y mariadb mariadb-server安装至master、slave1、slave2

192.168.238.135-master

vim /etc/my.cnf

server-id=10

log-bin=master-bin

log-slave-updates=true

 systemctl start mariadb

除了在下图MySQL中登录授权也可以在外部授权

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.238.% identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.% identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.134 identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.136 identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.137 identified by '123.com';"

查看master状态

192.168.238.136

vim /etc/my.cnf

server-id=11

log-bin=master-bin

relay-log=relay-log-bin

relay-log-index=relay-log-bin.index

 systemctl start mariadb

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.238.% identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.% identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.134 identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.136 identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.137 identified by '123.com';"

mysql -e "stop slave;"

 mysql -e "change master to master_host ='192.168.238.135', master_user='myslave',master  _password='123.com',master_log_file='master-bin.000003',master_log_pos=1163;"

mysql -e "start slave;"

查看slave状态

192.168.238.137

vim /etc/my.cnf

server-id=12

log-bin=master-bin

relay-log=relay-log-bin

relay-log-index=relay-log-bin.index

 systemctl start mariadb

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.238.% identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.% identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.134 identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.136 identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.238.137 identified by '123.com';"

 

mysql -e "stop slave;"

 mysql -e "change master to master_host ='192.168.238.135', master_user='myslave',master  _password='123.com',master_log_file='master-bin.000003',master_log_pos=1163;"

mysql -e "start slave;"

查看slave状态

 验证主从关系

master create database class

slave1

slave2

 (二)、MHA安装

基于主从复制模式之上 

1.所有节点安装perl环境

yum install epel-release -y(一直更新到版本epel-release.noarch 0:7-14) 

 yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN

 2.所有节点安装node

tar xf mha4mysql-node-0.57.tar.gz

cd /root/mha4mysql-noder-0.57

perl Makefile.PL && make && make install

验证 

cd  /usr/local/bin

看到脚本就OK

 3.manager

tar xf mha4mysql-manager-0.57.tar.gz
cd /root/mha4mysql-manager-0.57
perl Makefile.PL && make && make install
cp sample/scripts/master_ip_failover /usr/local/bin/
cp sample/scripts/master_ip_online_change     /usr/local/bin/

 

4.脚本说明

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

5.配置文件建立

mkdir /var/log/masterha/app1 -p 

mkdir /etc/masterha -p
vim /etc/masterha/app1.cnf

6.测试MHA

vim /usr/local/bin/master_ip_failover

chown +x /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.238.200';								#指定vip的地址
my $brdc = '192.168.238.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.238.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.238.200 down
my $exit_code = 0;											#指定退出状态码为0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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";
}

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

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

7.启动命令

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 &


启动时masterIP异常
    需要工程手动配置VIP

(三)、测试

停用master的mariadb服务     

去slave1中查看IP

                                                                                                                                                                                                                                                                                                                                                                         


总结

今天的内容要在免密和主从复制的基础之上才能运行,搭建基础就考验小伙伴们的基本功底了,在学新知识的同时又复习了学过的知识。

相关文章:

Mariadb高可用MHA

目录 前言 一、概述 &#xff08;一&#xff09;、概念 &#xff08;二&#xff09;、组成 &#xff08;三&#xff09;、特点 &#xff08;四&#xff09;、工作原理 二、案例 &#xff08;一&#xff09;、构建MHA 1.所有节点ssh免密登录 2、MySQL主从复制 &#x…...

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记&#xff0c;SASS 学习笔记 中包含&#xff1a; 配置 变量 嵌套 这里加一个扩展&#xff0c;嵌套中有一个 & 的用法&#xff0c;使用 & 可以指代当前 block 中的 selector&#xff0c;后面可以追加其他的选择器。如当前的 scope 是 form&a…...

提高 Snowflake 工作效率的 6 大工具

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 Snowflake 彻底改变了企业存储、处理和分析数据的方式&#xff0c;提供了无与伦比的灵活性、可扩展性和性能。但是&#xff0c;与任何强大的技术一样&#xff0c;要真正利用其潜力&#xff0c;必须拥有…...

选项方式读取配置IOption、IOptionSnapshot、IOpstionMonitor的区别

IOption, IOptionsSnapshot, 和 IOptionsMonitor 都是 ASP.NET Core 中用于访问配置选项的接口。它们在不同的场景下用于获取配置选项值,并具有不同的生命周期和行为。 IOption: IOption 是一个泛型接口,表示一个配置选项的包装器。它通常在应用程序启动时被解析并注入到需…...

linux基础面试题整理

目录标题 1.说下企业为什么用linux而不用windows&#xff1f;2.linux学过什么&#xff0c;怎么学习的&#xff1f;3.linux基本命令4.linux查看端口、进程、文件类型、挂载5.使用top命令之后前五行会显示什么内容&#xff1f;6.linux怎么查找一个文件7.vim进去后的各种操作 1.说…...

IDEA开发项目时一直出现http404错误的解决方法

系列文章目录 安装cv2库时出现错误的一般解决方法_cv2库安装失败 SQL&#xff1e; conn sys/root as sysdbaERROR:ORA-12560: TNS: 协议适配器错误的解决方案 虚拟机启动时出现“已启用侧通道缓解”的解决方法 Hypervisor launch failed&#xff1b; Processor does not pr…...

NLPR、SenseTime 和 NTU 加速自动视频纵向编辑

视频人像编辑技术已经在电视、视频和电影制作中得到了应用&#xff0c;并有望在不断发展的网真场景中发挥关键作用。最先进的方法已经可以逼真地将同源音频合成为视频。现在&#xff0c;来自北京模式识别国家实验室&#xff08;NLPR&#xff09;、商汤科技研究和南洋理工大学的…...

layui下拉框select 弹出层在最外层

出现问题如图所示 想要的效果是如下 这样的效果只需一行代码就能解决 .layui-layer-page .layui-layer-content{overflow: visible!important;}...

fnn手动实现和nn实现(包括3种激活函数、隐藏层)

原文网址&#xff1a;https://blog.csdn.net/m0_52910424/article/details/127819278 fnn手动实现: import time import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn import torchvision from torch.nn.functional import cross_entrop…...

Lua + mysql 实战代码

--[[luarocks lua语言的包管理器luasql https://luarocks.org/brew install luarocksluarocks install luasql-mysql 注意此处&#xff0c;如果你是 mariadb&#xff0c;然后要求指定 MYSQL_DIR 参数的时候&#xff0c;千万不要指到 mariadb 的安装目录&#xff0c;而是要指…...

智慧工地监管云平台源码 建筑施工一体化信息管理系统源码

智慧工地管理云平台系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 智慧工地平台系统工作原理&#xff1a; 1、感知设备的…...

三.net core 自动化发布到docker (创建一个dotnet工程发布)

创建Jenkins-create a job 输入名称&#xff08;建议不要带“”这类的字符&#xff09;&#xff0c;选择自由风格的类型&#xff08;红框标注的&#xff09;&#xff0c;点击确定 用于测试,下面选项基本没有选择-配置代码地址 选择执行shell #!/bin/bash # 获取短版本号 GITHA…...

【Spring Cloud 八】Spring Cloud Gateway网关

gateway网关 系列博客背景一、什么是Spring Cloud Gateway二、为什么要使用Spring Cloud Gateway三、 Spring Cloud Gateway 三大核心概念4.1 Route&#xff08;路由&#xff09;4.2 Predicate&#xff08;断言&#xff09;4.3 Filter&#xff08;过滤&#xff09; 五、Spring …...

Android JNI传递CallBack接口并接收回调

在JNI中&#xff0c;可以通过传递一个Java接口对象的引用给C代码&#xff0c;并在C代码中调用该接口对象的方法&#xff0c;实现JAVA层监听C数据变化&#xff0c;下面是一个简单的示例&#xff1a; 在Java代码中定义一个CallBack接口和JNI方法 class TestLib {companion objec…...

机器学习:特征工程之特征预处理

目录 特征预处理 1、简述 2、内容 3、归一化 3.1、鲁棒性 3.2、存在的问题 4、标准化 ⭐所属专栏&#xff1a;人工智能 文中提到的代码如有需要可以私信我发给你&#x1f60a; 特征预处理 1、简述 什么是特征预处理&#xff1a;scikit-learn的解释&#xff1a; provide…...

高级艺术二维码制作教程

最近不少关于二维码制作的&#xff0c;而且都是付费。大概就是一个好看的二维码&#xff0c;扫描后跳转网址。本篇文章使用Python来实现&#xff0c;这么简单花啥钱呢&#xff1f;学会&#xff0c;拿去卖便宜点吧。 文章目录 高级二维码制作环境安装普通二维码艺术二维码动态 …...

每日一题leetcode--使循环数组所有元素相等的最少秒数

相当于扩散&#xff0c;每个数可以一次可以扩散到左右让其一样&#xff0c;问最少多少次可以让整个数组都变成一样的数 使用枚举&#xff0c;先将所有信息存到hash表中&#xff0c;然后逐一进行枚举&#xff0c;计算时间长短用看下图 考虑到环形数组&#xff0c;可以把首项n放…...

tauri-react:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果

tauri-react 一个使用 taurireacttsantd 开发跨平台软件的模板&#xff0c;支持窗口头部自定义和窗口阴影&#xff0c;不用再自己做适配了&#xff0c;拿来即用&#xff0c;非常 nice。而且已经封装好了 tauri 的 http 请求工具&#xff0c;省去很多弯路。 开原地址&#xff…...

k8s 自身原理之 Service

好不容易&#xff0c;终于来到 k8s 自身的原理之 关于 Service 的一部分了 前面我们用 2 个简图展示了 pod 之间和 pod 与 node 之间是如何通信息的&#xff0c;且通信的数据包是不会经过 NAT 网络地址转换的 那么 Service 又是如何实现呢&#xff1f; Service 我们知道是用…...

arduino Xiao ESP32C3 oled0.96 下雪花

Xiao ESP32C3使用oled 0.96实现下雪的功能 雪花下落的时候, 随机生成半径和位置 sandR和sandX,sandY 保存雪花下落位置的时候, 将其周边一圈设置为-1, 标记为有雪花 其他雪花下落的时候, 其他雪花的一圈如果遇到-1, 则停止下落, 并重复2 #include "oled.h" void …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...