MHA实验和架构

news2024/11/21 2:32:31

什么是MHA?

masterhight availabulity:基于主库的高可用环境下可以实现主从复制、故障切换

MHA的主从架构最少要一主两从

MHA的出现是为了解决MySQL的单点故障问题。一旦主库崩溃,MHA可以在0-30秒内自动完成故障切换。

MHA的数据流向和工作流程图:

MHA使用的是半同步的方式,所以使用一个从库来做主从之间切换就可以了

MHA的工作原理

MHA使用的是半同步的方式,只要有一台从服务器写入数据,就会自动提交给客户端

1、 如果master崩溃,slave就会从主的二进制日志保存文件

2、 slave会识别最新更新的日志,差异部分同步到slave

3、 提升一个新的slave作为master

4、 其他的slave继续和新的master同步

实验过程

1、 搭建MHA架构

2、 模拟故障

3、 故障恢复

实验准备:

MHA manager:20.0.0.20

MySQL1:master 20.0.0.50

MySQL2:slave1 20.0.0.60

MySQL3:slave2 20.0.0.70

node组件:需要部署在所有服务器上。因为manager组件依赖于node组件。node组件就是用来监控MySQL的状态的

node组件靠ssh远程连接服务来进行通信。

开始实验

修改从主机名20.0.0.60
hostnamectl set-hostname slave1
修改从主机名20.0.0.70
hostnamectl set-hostname slave2
修改主主机名20.0.0.50
hostnamectl set-hostname master
su一下让他们都生效
修改完成后ping一下主机名看一下能不能通

先实现主从复制

配置主MySQL
vim /etc/my.conf
server-id=1
log_bin=master-bin
log-slave-updates=ture

配置从MySQL1
server-id=2
log_bin=master-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

配置从MySQL2
server-id=3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
重启三台MySQL

在主和从服务器上创建软连接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
三台主机上都要创建软连接

mysql -u root -p123456
#进入数据库
三台服务器同时操作
开始数据库同步赋权给slave访问主库的授权
每台服务器都要操作
给mha权限能访问主从的权限
在三台服务器上都加上个主机名连接
flush privileges;
#刷新其权限
show master status;
#查看一下位置偏移点

在两个从库上配置与主同步
start slave;
#打开两个从的slave
show slave status\G;
#查看两个从的slave的状态都是yes表示成功

必须要把两个从库都设为只读模式
set global read only=1
#把两个从库都设为只读模式

打开工具测试一下主从复制是否成功
create database kgc;
#创建一个库

进入MHA的配置
所有的服务器都需要安装MHA的依赖环境必须要有epel源
开始安装
yum install epel-release --nogpgcheck -y
#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组件,再安装MHA
每台服务器上都需要部署node节点
cd /opt

tar -xf mha4mysql-node-0.57.tar.gz 
#解压文件

perl Makefile.PL
#编译

make $$ make install

回到mha服务器
解压高可用节点

tar -xf mha4mysql-manager-0.57.tar.gz
#解压

cd mhamanager

perl Makefile.PL

make -j4 $$ make install

cd /usr/local/bin/
#查看一下重要组件
ll -h

master的组件:
masterha_check_ssh
#检查MHA的ssh的配置情况
masterha_check_repl
#检查MySQL的复制情况
masterha_manager
#启动manger的脚本
masterha_check_status
#检测MHA的运行状态
masterhaha_master_monitor
#检测master主机的情况,masters是否宕机
masterha_master_switch
#控制故障转移
masterha_conf_host
#添加或者删除配置的server信息
masterha_stp
#停止MHA的脚本

重要的node组件:
save_binary_logs
#保存和复制master的二进制日志
apply_diff_relay_logs
#识别二进制日志当中的差异事件,然后发送给其他的slave
filter_mysqlbinlog
#去除不必要的回滚(MHA已经不用了)
purge_relay_logs
#同步之后清除中继日志(不会阻塞sql的限制)

开始实现ssh免密登录
在MHA主机20.0.0.20上操作
ssh-keygen -t rsa
#选择加密方式
一路回车
ssh-copy-id 20.0.0.50
输入密码和yes
ssh-copy-id 20.0.0.60
输入密码和yes
ssh-copy-id 20.0.0.70
输入密码和yes

回到master主机
ssh-keygen -t rsa
#选择加密方式
ssh-copy-id 20.0.0.60
输入密码和yes
ssh-copy-id 20.0.0.70
输入密码和yes

回到slave1主机
ssh-keygen -t rsa
#选择加密方式
ssh-copy-id 20.0.0.50
输入密码和yes
ssh-copy-id 20.0.0.70
输入密码和yes

回到slave2主机
ssh-keygen -t rsa
#选择加密方式
ssh-copy-id 20.0.0.50
输入密码和yes
ssh-copy-id 20.0.0.60
输入密码和yes

配置高可用MHA
cd manger
cd samples
cd scripts

master_ip_failover
#自动切换时管理VIP的脚本
master_ip_online_change
#在线切换时的vip管理脚本
power_manger
#如果故障发生之后关闭master脚本
send_report
#发送故障时的告警脚本

cp -a scripts/ /usr/local/bin
cd /usr/loacl/bin
cd scripts
cp master_ip_failover /usr/local/bin

vim master_ip_failover
除了第一行全部删除
添加控制脚本
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 = '20.0.0.100';
#设定vip地址
my $brdc = '20.0.0.255';
#设定VIP的广播地址
my $ifdev = 'ens33';
#VIP绑定的网卡
my $key = '1';
#ifcong ens33:1 20.0.0.100/24 key是1,网卡的编号就是1
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
#key:ens33:1 20.0.0.100 up
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
#ens33:1 20.0.0.100 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";
}
#master宕机之后,VIP地址切换到新的主库

创建MHA的软件目录,对节点服务器进行管理

mkdir /etc/masterha

cd /opt/manger/samples/conf/

app1.cnf
#用来管理mysql的节点服务器
cp -a app1.cnf /etc/masterha/

vim /etc/masterha/app1.cnf
全部删除内部的配置重新配置
[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的二进制的位置,必须要和master保存的路径一致
master_ip_failover_script=/usr/local/bin/master_ip_failover
#设置自动切换脚本
master_ip_online_change_script=/usr/local/bin/master_ip_onli
ne_change
#手动切换脚本
password=manager
ping_interval=1
#监控主库发送ping包的时间间隔 1代表1秒 工作中一般3-6秒。会尝试3次之后会切换到failover脚本进行自动切换
remote_workdir=/tmp
#mysql在发生切换时,binlog的保存位置
repl_password=123456
#登录主库和从库的用户密码
repl_user=myslave
#用户名
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.60 -s 20.0.0.70 
#从和主之间互相监听,主服务器无需声明,但是从服务器需要在check之后声明
#从对主监听
shutdown_script=""
#设置切换时告警的脚本
ssh_user=root
#远程登录的用户名
user=mha

[server1]
hostname=20.0.0.50
#主服务器
port=3306

[server2]
candidate_master=1 
#设置后选的master主库崩溃会切换到server2 233.22
check_repl_delay=0
#即使设置了权重,但是从服务器的relay_logs落后master100M,即使设置了权重也不会切换。通过设置0会忽略设置延迟复制,直接升为主.强制切换到设定为候选master的服务器。
hostname=20.0.0.60 
#备用主服务器
port=3306

[server3]
hostname=20.0.0.70
#从服务器2
port=3306

测试ssh通信是否正常
masterha_check_ssh -conf=/etc/masterha/app1.cnf
#测试ssh通信主从之间免密登录是否正常

测试主从连接情况是否正常
masterha_check_repl-conf=/etc/masterha/app1.cnf
#测试主从连接情况是否正常

都显示ok表示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 &

remove_dead_master_conf
#如果发生组从切换,老的主库的ip地址会从文件中删除
/var/log/masterha/app1/manager.log
#MHA的管理日志
-ignore_last_failover 
#如果检测到连续发生宕机,而且宕机的事件间隔不足8小时,不会进行自动切换。忽略时间间隔只要发生故障,就会切换
cat /var/log/masterha/app1/manager.log | grep "current master"
在开一个20主机监控一下管理日志
tail -f /var/log/masterha/app1/manager.log
这时候停掉主MySQL
systemctl stop mysqld
然后到20查看日志
查看一下vip地址还在不在主库20.0.0.50上如果已经转移到主库2 20.0.0.60上代表切换成功。

开始故障恢复
进入MySQL1的my.cnf文件进行配置
vim /etc/my.conf
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
#将MySQL1设为从

再进入MySQL2的my.cnf文件进行配置
vim /etc/my.conf
log_bin = master-bin
log-slave-updates=ture
#将MySQL2设置为新的主

进入manager主机
配置文件进行配置
vim /etc/masterha/app1.cnf

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.50 -s 20.0.0.70
#声明从库的ip将20.0.0.60修改为50


[server1]
hostname=20.0.0.60
port=3306
#server1的ip改为60

[server2]
candidate_master=1
check_repl_delay=0
hostname=20.0.0.50
port=3306
#复制一个server2出来将ip改为50

修改完成后重启启动一下manager
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 &

然后回到新的主MySQL20.0.0.60
重启MySQL服务
systemctl restart mysqld
进入MySQL
mysql -u root -p

查看一下偏移点
show master status;

再回到MySQL1
启动MySQL服务
进入MySQL
先停止slave服务
stop slave
进行配置
change master to master_host='20.0.0.60',
master_user='myslave',master_password='123456',
master_log_file='master-bin.000002',
master_log_pos=154; 
#绑定新的主MySQL的ip和日志文件和偏移点
配置完成后
reset slave
start slave
#启动slave服务

查看一下slave的状态
show slave status\G

此时出现两个yes代表实验成功

进入新的主MySQL20.0.0.60

创建一个库
create database kgc2;

三台MySQL都能查看到代表实验成功

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

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

相关文章

QT windows与linux之间sokcet通信中文乱码问题解决方法

QT windows与linux之间sokcet通信中文乱码问题解决方法 linux发送与接收都转码utf-8: tcpClient ->write( send_msg.toUtf8());//解决乱码&#xff0c;发送转码 接收&#xff1a; QByteArray buffer tcpClient->readAll(); if(!buffer.isEmpty()) { // ui->plain…

[工业自动化-21]:西门子S7-15xxx编程 - 软件编程 - 如何快速看懂PLC梯形图?

目录 预备&#xff1a;电气图 1. 电路图 2. 电气图 一、梯形图概述 1.1 什么是梯形图 1.2 梯形图的作用 二、梯形图中的主要元素 三、梯形图的程序执行 3.1 梯形图扫描的原则 3.2 梯形图执行顺序 3.3 梯形图扫描 预备&#xff1a;电气图 1. 电路图 电路组成&#x…

雷达测角原理、测角精度、测角分辨率以及3DFFT角度估计算法汇总

1.角度测量方法 依据&#xff1a;电磁波的直线传播和雷达天线的方向性。 分类&#xff1a;振幅法测角、相位法测角 1.1 相位法测角 相位法测角利用多个天线所接收回波信号之间的相位差进行测角。如下图所示&#xff1b; 图 1 设在θ方向有一远区目标&#xff0c;则到达接收点…

【STM32】串口和printf

1.数据通信的基本知识 1.串行/并行通信 2.单工/半双工/全双工通信 类似于【广播 对讲 电话】 不是有两根线就是全双工&#xff0c;而是输入和输出都有对应的数据线。 3.同步/异步通信 区分同步/异步通信的根本&#xff1a;判断是否有时钟信号&#xff08;时钟线&#xff09;。…

MVC使用的设计模式

MVC使用的设计模式 一、背景 MVC模式是"Model-View-Controller"的缩写&#xff0c;中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View&#xff0c;或者同时改变两者。只要Controller改变了Model…

关于 Java NIO 的 Selector 的事儿,这篇文章里面全都有

前面 4 篇文章深入分析了 NIO 三大组件中的两个&#xff1a;Buffer 和 Channel&#xff1a; 【死磕 NIO】— 深入分析Buffer【死磕 NIO】— 深入分析Channel和FileChannel【死磕NIO】— 跨进程文件锁&#xff1a;FileLock【死磕NIO】— 探索 SocketChannel 的核心原理 这篇文…

ffmpeg5及以上-s和像素格式转换 画屏问题

环境: lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.10 Release: 22.10 Codename: kinetic拉下ffmpeg源码&#xff0c;6.0.1&#xff0c;4.3.6&#xff0c;5.1.4&#xff0c;依次安装作实验 ./configure --disable-x86asm …

msvcp140.dll丢失的解决方法、详细解析dll缺失原因及对电脑的影响

msvcp140.dll是一款Visual C Redistributable for Visual Studio 2015的运行时库&#xff0c;许多程序都需要依赖这个库才能正常运行。当msvcp140.dll丢失时&#xff0c;我们可能会遇到无法打开程序或游戏&#xff0c;甚至系统崩溃的问题。本文将详细介绍msvcp140.dll丢失的解决…

Linux--makefile

一、makefile的作用 makefile是一个文件&#xff0c;是围绕依赖关系和依赖方法的自动化编译工具 一个工程中的源文件有很多&#xff0c;按照不同的类型、功能、模块放在不同的目录中。而makefile定义了一系列的规则来指定&#xff0c;那些文件需要先编译&#xff0c;那些文件…

后端接口性能优化分析-程序结构优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

【开源】基于JAVA的电子元器件管理系统

目录 一、摘要1.1 项目简介1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录&注册&主页3.2 元器件单位模块3.3 元器件仓库模块3.4 元器件供应商模块3.5 元器件品类模块3.6 元器件明细模块3.7 元器件类型模块3.8 元器件采购模块3.9 元器件领用模块3.10 系统基础模块 …

PlantUML基础使用教程

环境搭建 IDEA插件下载 打开IEDA系列IDE&#xff0c;从FIle–>Settings–>Plugins–>Marketplace 进入到插件下载界面&#xff0c;搜索PlantUML&#xff0c;安装PlantUML Integration和PlantUML Parser两个插件&#xff0c;并重启IDE 安装和配置Graphviz 进入官网…

【Python 千题 —— 基础篇】欢迎光临

题目描述 题目描述 欢迎光临。为列表中的每个嘉宾打印欢迎光临语句。例如&#xff0c;有一份嘉宾列表 ["李二狗", "王子鸣"]&#xff0c;则需要根据嘉宾名单打印输出&#xff1a; 欢迎光临&#xff01;李二狗。 欢迎光临&#xff01;王子鸣。下面是一份…

基于布谷鸟算法优化概率神经网络PNN的分类预测 - 附代码

基于布谷鸟算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于布谷鸟算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于布谷鸟优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

编程怎么学习视频教程,编程实例入门教程,中文编程开发语言工具下载

编程怎么学习视频教程&#xff0c;编程实例入门教程&#xff0c;中文编程开发语言工具下载。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件…

csapp第三章读书笔记

caspp chapter 3 寄存器 operand form data movement instructions mov 指令例子: 0扩展 movz 指令: Zero-extending data movement instructions是一种计算机指令类型&#xff0c;涉及将数据从一个位置移动到另一个位置&#xff0c;同时通过在最重要的一端添加零位来将数据扩…

【考研复习】二叉树的特殊存储|三叉链表存储二叉树、一维数组存储二叉树、线索二叉树

文章目录 三叉链表存储二叉树三叉链表的前序遍历&#xff08;不使用栈&#xff09;法一三叉链表的前序遍历&#xff08;不使用栈&#xff09;法二 一维数组存储二叉树一维数组存储二叉树的先序遍历 线索二叉树的建立真题演练 三叉链表存储二叉树 三叉链表结构体表示如下图所示…

探秘Vue组件间通信:详解各种方式助你实现目标轻松搞定!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…

软件工程理论与实践 (吕云翔) 第四章 结构化分析课后习题及答案

第四章 结构化分析 知识点&#xff1a; ​ 结构化分析模型的核心为数据字典&#xff0c;它是描述软件使用和产生的所有数据对象。围绕着这个核心有3种不同的图&#xff1a;“数据流图”指出当数据在软件系统中移动时怎样被变换&#xff0c;并描绘变换数据流的功能和子功能&am…

实现Vue3 readonly,教你如何一步步重构

本文通过实现readonly方法&#xff0c;一步步展示重构的流程。 前言 readonly接受一个对象&#xff0c;返回一个原值的只读代理。 实现 Vue3 中readonly方法&#xff0c;先来看一下它的使用。 <script setup> import { readonly } from "vue";let user {n…