Mysql的MHA

Mysql的MHA

一、MHA

1、什么是MHA?

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

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

至少需要3台

故障切换过程0~30秒

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

主 vip 备 vip

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

2、MHA的组件

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

MHA的 manager 管理节点 管理mysql的高可用集群

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

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

3、MHA的特点

1.1 manager来实现主备切换

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

1.3 半同步的方式,实现数据完整

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

4、主备故障切换

1.1 主宕机,保存二进制日志

1.2 备从主的二进制日志当中更新到自己的slave日志当中

1.3 备成为主,同步到master的二进制文件

1.4 其他备服务器从新的主同步数据

1.5 原来的备成为主,其他的备的服务器都和主继续同步数据

1.6 主备切换之后,mysql模式下,一般是继续以现有主作为集群的主,重新把服务器加入到集群

二、MHA实验

架构:一主两从

搭建完成MHA的架构

主备之间的切换

故障恢复

4台机器

master 192.168.100.17 mysql8.0 node组件

slave1 192.168.100.18 mysql8.0 node组件

slave2 192.168.100.19 mysql8.0 node组件

管理节点 192.168.100.14 manager组件 node组件

1.1 主从复制

# mysql7、8、9
systemctl stop firewalld
setenforce 0# 时间同步
yum -y install ntpdate 
ntpdate ntp.aliyun.com
date# mysql7
hostnamectl set-hostname master
# mysql8
hostnamectl set-hostname slave1
# mysql9
hostnamectl set-hostname slave2# mysql7、8、9
vim /etc/hosts
192.168.100.17 master
192.168.100.18 slave1
192.168.100.19 slave2# mysql7
vim /etc/my.cnf
server-id = 1
log_bin = master-bin
binlog_format = MIXED
log-slave-updates = true
relay_log_recovery = 1
wq! 
systemctl restart mysqld# mysql8
vim /etc/my.cnf
log-bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
relay_log_recovery = 1
wq!
systemctl restart mysqld# mysql9
vim /etc/my.cnf
server-id = 3
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
relay_log_recovery = 1
wq!
systemctl restart mysqldmysql7、8、9
ln -s /usr/local/mysql/bin/mysql /usr/sbin
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbinmysql -uroot -p123456#从数据库同步使用
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;# mysql7
show master status;# mysql8、9
change master to master_host='192.168.100.17',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=???;start slave;
show slave status\G;# navicate
在主数据库上创建
create database test1;# mysql8、9终端数据库
set global read_only=1;
# 设置成只读模式

1.2 部署MHA

# mysql7、8、9 test4
# 同步操作 #
cd /opt  #把软件包拖进去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-CPANtar -xf mha4mysql-node-0.57.tar.gzcd mha4mysql-node-0.57
# 开始编译安装
perl Makefile.PL        # 编译
make && make install    # 安装# 此时node节点安装完毕 ## test4
tar -xf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57perl Makefile.PL
make && make installcd /usr/local/bin
# 查看这个目录下的文件
# masterha_check_ssh   所有的数据库节点和管理节点通过ssh来进行互相通信,检查集群的ssh配置
# masterha_check_repl  检查mysql的复制情况 数据同步
# masterha_manager  是manager文件的启动脚本
# masterha_check_status  检查MHA集群状态的文件
# masterha_master_switch  控制故障转移
# masterha_stop  关闭manager服务ssh-keygen -t rsa    一直回车即可  #指定算法
ssh-copy-id 192.168.100.17  # yes # 123
ssh-copy-id 192.168.100.18  # yes # 123
ssh-copy-id 192.168.100.19  # yes # 123# 此时manager节点安装完毕 ## mysql7
ssh-keygen -t rsa    一直回车即可  #指定算法
ssh-copy-id 192.168.100.18  # yes # 123
ssh-copy-id 192.168.100.19  # yes # 123# mysql8
ssh-keygen -t rsa    一直回车即可  #指定算法
ssh-copy-id 192.168.100.17  # yes # 123
ssh-copy-id 192.168.100.19  # yes # 123# mysql9
ssh-keygen -t rsa    一直回车即可  #指定算法
ssh-copy-id 192.168.100.17  # yes # 123
ssh-copy-id 192.168.100.18  # yes # 123# test4
cd /opt/mha4mysql-manager-0.57
cd samples
cd scripts
# 解释scripts目录下的文件
# power_manager  故障发生后,关闭主机的脚本
# send_report     故障切换之后,发送报警的脚本cd ..  #到samples目录
cp -rp scripts/ /usr/local/bin
cd /usr/local/bin # 到这个目录下ll检查一下是否复制到这个目录下
cd /opt
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/
cd /usr/local/bin/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.100.100';
my $brdc = '192.168.100.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";
}
wq!mkdir /etc/masterha
pwd   #/usr/local/bin
cd /opt/mha4mysql-manager-0.57/samples
cd conf
cp app1.cnf /etc/masterha/
cd /etc/masterha/     # 这是管理配置文件用来管理mysql的管理服务器vim app1.cnf
# 清空所有复制粘贴以下文本[server default]
manager_log=/var/log/masterha/app1/manager.log       
#主日志文件,报错看这个
manager_workdir=/var/log/masterha/app1
#manager的工作目录
master_binlog_dir=/usr/local/mysql/data
#mysql主服务器的binlog二进制文件的保存目录
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
#ping主库的时间间隔,每一秒ping一次,ping不通就进行failover自动切换,生产环境一般3秒,实验环境设置成一秒即可
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.100.18 -s 192.168.100.19 
#从对主监听
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.100.17 
#主服务器
port=3306[server2]
candidate_master=1   
check_repl_delay=0
hostname=192.168.100.18  
#备用主服务器
port=3306[server3]
hostname=192.168.100.19  
#从服务器2
port=3306
wq!# 此时所有配置全部完成# mysql7
ifconfig ens33:1 192.168.100.100/24
ifconfig# test4
cd /etc/msaterha
1.1 
masterha_check_ssh -conf=/etc/masterha/app1.cnf
1.2
masterha_check_repl -conf=/etc/masterha/app1.cnf
1.3
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 &
1.4 
masterha_check_status --conf=/etc/masterha/app1.cnf
1.5
cat /var/log/masterha/app1/manager.log | grep "current master"

1.3 模拟故障切换

# 在navicate的mysql1-7上模拟
create database test2;
# 此时主库和从库上都出现test2# 在终端上打开另外一台test4查看日志文件
tail -f /var/log/masterha/app1/manager.log# mysql7
systemctl stop mysqld
# 关闭主的mysql查看test4的日志文件记录
# 此时可以从test4的日志文件中看出,主挂掉后,自动切换,此时备主成为主
ip addr   # 192.168.100.100的ip消失 # mysql8
ip addr   #192.168.100.100出现# test4
1.1
masterha_check_status --conf=/etc/masterha/app1.cnf
1.2
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 &
1.3
masterha_check_status --conf=/etc/masterha/app1.cnf
# 此时的运行的主是192.168.100.18# 到navicate
# 关闭mysql1-7,在mysql8上创建数据库test3看是否同步到mysql9
create database test3;
# 刷新,可同步到mysql9,主备切换成功

1.4 故障恢复

# test4
1.1 关闭manager
masterha_stop --conf=/etc/masterha/app1.cnf
1.2 修改配置
vim /etc/masterha/app1.cnf 
# 修改配置文件如下
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.100.17 -s 192.168.100.19[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.100.17
port=3306[server2]
hostname=192.168.100.18
port=3306
wq!1.3 修改mysql7的配置文件
vim /etc/my.cnf
# 在配置文件里面增加下面的命令
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
wq!
systemctl restart mysqld1.4 进入主mysql8的数据库
mysql -u root -p123456
set global read_only=0;
# 关闭只读模式
show master status;1.5 进入mysql7的数据库
mysql -u root -p123456
set global read_only=1;
stop slave;
reset slave;change master to master_host='192.168.100.18',master_user='myslave',master_password='123456',master_log_file='master-bin.000004',master_log_pos=3666;start slave;
show slave status\G;# test4
1.1
masterha_check_status --conf=/etc/masterha/app1.cnf
1.2
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 &
1.3
masterha_check_status --conf=/etc/masterha/app1.cnf
1.4
masterha_check_repl -conf=/etc/masterha/app1.cnf# 在navicate上面操作
# 开启mysql1-7,在mysql8上创建数据库test4看是否同步到mysql7和mysql9
create database test4;
# 刷新,可同步到mysql7和mysql9,故障恢复成功

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

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

相关文章

嵌入式Linux八股(四)——MCURTOS

嵌入式Linux八股完整文章目录 嵌入式Linux八股&#xff08;一&#xff09;——语言篇_嵌入式软件八股-CSDN博客 嵌入式Linux八股&#xff08;二&#xff09;——Linux_linux嵌入式的八股文有哪些-CSDN博客 嵌入式Linux八股&#xff08;三&#xff09;——计算机基础_嵌入式哪…

DM(DataMart)增量表

DM&#xff08;DataMart&#xff09;增量表通常指的是在数据仓库或数据集市中的增量表。这些表格用于存储每日或每周等时间段内新增的数据&#xff0c;以便在后续的分析和报告中使用。 特点和作用&#xff1a; 1.存储增量数据&#xff1a;DM增量表存储了相对于上一次抽取或加载…

【Vue实战教程】之Vue工程化项目详解

Vue工程化项目 随着多年的发展&#xff0c;前端越来越模块化、组件化、工程化&#xff0c;这是前端发展的大趋势。webpack是目前用于构建前端工程化项目的主流工具之一&#xff0c;也正变得越来越重要。本章节我们来详细讲解一下如何使用webpack搭建Vue工程化项目。 1 使用we…

基于Python的哔哩哔哩国产动画排行数据分析系统

需要本项目的可以私信博主&#xff0c;提供完整的部署、讲解、文档、代码服务 随着经济社会的快速发展&#xff0c;中国影视产业迎来了蓬勃发展的契机&#xff0c;其中动漫产业发展尤为突出。中国拥有古老而又璀璨的文明&#xff0c;仅仅从中提取一部分就足以催生出大量精彩的…

【C# 】 一个List<T> 如何快速的知道里面的最大、最小、平均值呢?

在C#中&#xff0c;要从一个List<T>中找到最大值、最小值和平均值&#xff0c;首先需要确保列表中的元素类型支持这些操作&#xff08;例如int、ushort或double&#xff09;。 这里使用LINQ&#xff08;Language Integrated Query&#xff09;来简化这些计算。 如果使用…

源码拆解SpringBoot的自动配置机制

SpringBoot相比于Spring系列的前作&#xff0c;很大的一个亮点就是将配置进行了简化&#xff0c;引入了自动化配置&#xff0c;仅靠几个注解和yml文件就取代了之前XML的繁琐配置机制&#xff0c;这也是SpringBoot的独有特点&#xff0c;下面我们从源码角度&#xff0c;一点点拆…

Golang | Leetcode Golang题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; var (singles []string{"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}teens []string{&…

IEC61850 协议解读

1. IEC61850 协议介绍 IEC 61850 是定义 变电站 自动化系统 中 设备 及设备之间相互交互的 国际标准。 给出英文定义&#xff1a;IEC 61850 is the international standard for defining devices within substation automation systems and how they interact with one anoth…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

git命令使用详细介绍

1 环境配置 设置的信息会保存在~/.gitconfig文件中 查看配置信息 git config --list git config user.name设置用户信息 git config --global user.name "有勇气的牛排" git config --global user.email “1809296387qq.com”2 获取Git仓库 2.1 本地初始化一个仓…

GO-学习-02-常量

常量是不变的 const package main import "fmt"func main() {//常量定义时必须赋值const pi 3.1415926const e 2.718//一次声明多个常量const(a 1b 2c "ihan")const(n1 100n2n3)//n2,n3也是100 同时声明多个常量时&#xff0c;如果省略了值则表示和…

一个vue mixin 小案例,实现等比例缩放

mixin.js /** Author: jinjianwei* Date: 2024-07-24 16:17:16* Description: 等比例缩放&#xff0c;屏幕适配 mixin 函数*/// * 默认缩放值 const scale {width: 1,height: 1, } // * 设计稿尺寸&#xff08;px&#xff09; const baseWidth 1920 const baseHeight 1080 …

Android Studio入门级教程(二)——项目开发基础(Java新手向))持续更新ing

目录 前言&#xff1a; 一.使用Log工具打印日志 常见语法&#xff1a; 如何使用&#xff1f; 二.工程目录结构 三.编译配置文件build.gradle 四.运行配置文件AndroidManifest.xml 五.界面显示与逻辑处理 六.创建新的app页面 1.包含的步骤 在layout目录下创建XML文件…

uniapp集成安卓原生录屏插件以及使用

概述 我们知道UniApp的出现简化了开发者的工作流程&#xff0c;并减少了代码的重复编写。开发者可以使用一套代码编译到iOS、Android、以及各种小程序的应用&#xff0c;节省了人力和时间成本&#xff0c;但是涉及到与系统交互的时候&#xff0c;比如录屏、录音、录像、文件操…

Ubuntu使用root远程登录报错Permission denied, please try again.

Ubuntu使用root远程登录报错Permission denied, please try again. 在Ubuntu上直接使用root账户进行SSH远程登录通常会遇到权限被拒绝的问题。这是因为默认情况下&#xff0c;Ubuntu禁用了root账户的SSH远程登录&#xff0c;这是出于安全考虑。 如果你需要允许root账户进行SS…

Java 每日一题: for 与 foreach 的区别 ?

for 循环&#xff1a;是最基本的循环结构&#xff0c;可以通过初始化语句、循环条件和迭代语句来控制循环的执行。 foreach 循环&#xff08;也称为增强型 for 循环&#xff09;&#xff1a;用于遍历集合或数组中的元素&#xff0c;简化了遍历过程&#xff0c;没有显式地控制索…

vercel 如何部署 express 项目

注意&#xff1a;如果你是用 express-generator 生成的 express 项目&#xff0c;请检查是否有依赖 jade &#xff0c;如果有的话删除目录下的 views 文件夹&#xff0c;并把所有渲染页面的方法改成 res.send() !!!!!! 然后在项目根目录创建文件 vercel.json {&qu…

获取后端返回的图形验证码

如果后端返回的直接就是一个图形&#xff0c;有以下几种方式展示 一、直接在img标签里面的src里面调用接口 <img :src"dialogSrc" class"photo" alt"验证码图片" click"changeDialog">let orgUrl "/api/captcha" …

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换&#xff0c;效率过低&#xff0c;所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本&#xff08;Build 19041 及更高版本&#xff09;或 Win…

基础复习(集合)

集合 Collection单列集合 1.特点 2.常用方法&#xff08;Collection都可用&#xff09; 遍历方式 迭代器遍历 Iterator<String> it c.iterator();//此处c是之前定义好的集合//第二步&#xff1a;用于判断当前位置是否有元素可以获取 //解释&#xff1a;hasNext()方…