MySQL的高可用(MHA)

news2024/11/15 17:21:03

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

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

至少需要三台。

故障切换过程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.coloradmin.cn/o/1946120.html

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

相关文章

使用infercnv对单细胞转录组进行拷贝数变异推断(上,原理)

InferCNV 是一个专门设计用于鉴定肿瘤样本中拷贝数变异&#xff08;Copy Number Variations, CNVs&#xff09;的R包&#xff0c;特别是在单细胞RNA测序&#xff08;scRNA-seq&#xff09;数据分析领域。它通过比较肿瘤细胞与正常细胞&#xff08;或参照细胞&#xff09;的基因…

【Leetcode】十八、动态规划:不同路径 + 全1的最大正方形

文章目录 1、动态规划2、leetcode509&#xff1a;斐波那契数列3、leetcode62&#xff1a;不同路径4、leetcode121&#xff1a;买卖股票的最佳时机5、leetcode70&#xff1a;爬楼梯6、leetcode279&#xff1a;完全平方数7、leetcode221&#xff1a;最大正方形 1、动态规划 只能…

CTFSHOW 萌新 web5 解题思路和方法

点击题目链接&#xff0c;发现页面代码&#xff0c;根据最后一行的提示当id1000时返回flag值&#xff0c;但是前面if判断intval(id)的值不得超过999&#xff0c;故需要对其进行绕过。 我们发现题目中相比前几题中过滤条件更为严格&#xff0c;但是没有过滤取反运算符。此时我们…

matlab 绘制参数方程

matlab 绘制参数方程 绘制参数方程绘制结果 绘制参数方程 clc; clear; close all;axis_length 100;% 定义参数t的范围 t 0:0.01:100;% 计算x和y的值 x t.^2 1; y 4*t - t.^2;% 绘制函数图像 plot(x, y); xlabel(x); ylabel(y); title(Plot of the curve xt^21, y4t-t^2…

运维朋友最喜欢的一集:trzsz-ssh!!【送源码】

软件介绍 trzsz-ssh&#xff08;tssh&#xff09;是一个替代openssh的SSH客户端软件&#xff0c;支持trzsz、批量登录、密码记忆、zmodem等功能。可实现方便的本地与远程服务器文件传输&#xff0c;支持多系统跨平台运行&#xff0c;提供良好的交互体验和进度显示。优势包括tmu…

普发Pfeiffer真空TSH071TSU261TSH521泵站电路图安装操作使用说明

普发Pfeiffer真空TSH071TSU261TSH521泵站电路图安装操作使用说明

0724, 大型补作业现场

sock编程 struct sockaddr struct sockaddr_in --> struct in_addr struct hostent htonl() htons() ntohl() ntohs() int inet_aton(const char* cp,struct in_addr * inp); in_addr_t inet_addr(const char* cp); const char* inet_ntop…

深入理解算数表达式求值:后缀表达式的转换与计算

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;没人会嘲笑竭尽全力的人&#xff01; 前…

软件渗透测试包括的内容和作用简析

在当今信息技术迅速发展的时代&#xff0c;软件安全已成为企业和用户关注的重中之重。尤其是渗透测试作为一种专业的安全测试方法&#xff0c;日益受到企业们的重视。   软件渗透测试是一种模拟恶意攻击者的方式&#xff0c;对软件及其相关系统进行评估&#xff0c;以发现可能…

html基础及python web开发

1.标签 ①p标签 段落标签&#xff0c;分隔段与段。 <p>...</p> ②h标签 标题标签h1-6&#xff0c;大小依次减小 <h1>...</h1> <h2>...</h2> <h3>...</h3> <h4>...</h4> <h5>...</h5> <h6>.…

数据结构的概念和术语

目录 一.前言 二.数据结构的基本概念 三.数据结构的术语 一.前言 数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科。数据结构的基本数据结构包括两部分&#xff0c;线性结构跟非线性结构。 二.数据结构的基本概念 数据结构主要包括…

MarkTool集合篇

MarkTool目前包含以下几种工具 1、TCP客户端 2、TCP服务端 3、UDP客户端 4、Web客户端 5、Web服务端 6、串口网口 7、PLC 8、获取本机设备 9、Log 10、密钥 11、系统设置 11-1、基本设置 11-2、角色设置 11-3、用户设置 11-4、log记录 开启软件需要找我解密&#…

怎样做好仓库管理工作?如何利用仓库管理系统进行有效管理?

我前前后后跑遍了十几家仓储设备公司&#xff0c;跟那些制造业的朋友们聊了个痛快&#xff0c;从他们那儿学到了不少仓库管理的实践方法。 回来自己整理了一套仓库管理更高效的实用方法&#xff0c;现在就来跟大家伙儿聊聊仓库管理中那些常见问题&#xff0c;以及我是怎么琢磨…

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…

HarmonyOS网络请求的简单用法,HttpUtil简单封装

请求网络获取数据 点击按钮发送一个post请求&#xff0c;发送一条string由于此处的返回result.data本身就是一个string&#xff0c;因此不需要转换类型 Button(请求网络).margin({ top: 10 }).fontSize(24).fontWeight(FontWeight.Bold).onClick(() > {httpRequestPost(http…

算法从零到精通 (一) ~ 快慢双指针

1. 前言 快慢双指针是一种常用的算法技巧&#xff0c;通常用于解决涉及链表或数组的问题。它的基本思想是使用两个指针&#xff0c;一个移动速度快&#xff08;快指针&#xff09;&#xff0c;一个移动速度慢&#xff08;慢指针&#xff09;&#xff0c;来解决特定的问题。这两…

【高可用】利用AOP实现数据库读写分离

最近项目中需要做【高可用】数据库读写分离相关的需求&#xff0c;特地整理了下关于读写分离的相关知识。项目中采用4台数据库&#xff1a;1个master&#xff0c;2个slave&#xff0c;1个readOnly&#xff0c;其中master数据库会自动定时同步到readOnly节点。可以通过中间件(Sh…

Mysql —— 事务

目录 什么是事务&#xff1f; 两种方式实现事务&#xff1a; 方法一 方法二&#xff1a; 事务四大特性(简称ACID) 并发事务问题&#xff08;面试题&#xff09; 事务隔离级别 什么是事务&#xff1f; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff…

跨域浏览器解决前端跨域问题

1.问题背景 这是一种属于非主流的解决跨域的方案&#xff0c;但是也是可以正常使用而且比较简单的。如果需要使用主流的解决前端跨域方案&#xff0c;请参考这篇文章。 我这边其实是优先建议大家使用主流的跨域方案&#xff0c;如果主流的实在不行&#xff0c;那么就使用跨域…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 图像物体的边界(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…