【MySQL】数据库之MHA高可用

目录

一、MHA

1、什么是MHA

2、MHA 的组成

3、MHA的特点

4、MHA的工作原理

二、有哪些数据库集群高可用方案

三、实操:一主两从部署MHA

1、完成主从复制

步骤一:完成所有MySQL的配置文件修改

步骤二:完成所有MySQL的主从授权,以及mha的账号授权

步骤三:主查看master状态,从完成与主对接,启动从节点,查看从的状态,验证IO和SQL线程的状态是否为yes

步骤四:验证主从复制

步骤五:将从节点都改为只读状态

2、所有服务器配置MHA的node组件

步骤一:完成所有节点(三台mysql和manager)安装epel源和依赖环境

步骤二:完成所有服务器部署mha-node组件

3、在MHA manager服务器配置manager组件

步骤一:安装manager组件

4、完成所有所有服务器ssh免密登录

5、完成在 manager 节点上配置 MHA

步骤一:复制相关脚本到/usr/local/bin 目录

步骤二:使用master_ip_failover脚本来管理 VIP 和故障切换,修改该脚本

步骤三:创建 MHA 软件目录并拷贝配置文件,这里使用mysql_mha.conf配置文件来管理 mysql 节点服务器,#创建相关目录(所有节点)

步骤四:给主配置一个vip 

步骤五:完成ssh和集群的健康检查,最后启动mha 

6、故障切换实验

步骤一:先关闭主的mysqld服务

步骤二:查看故障切换有哪些内容

步骤三:修复master

重新启动旧master的mysqld服务,重新做主从

修改manager的配置文件


一、MHA

1、什么是MHA

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

MHA的出现是为了解决MySQL的单点故障,MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换过程中最大程度上保证数据的一致性,已达到真正意义上的高可用。

2、MHA 的组成

●MHA Node(数据节点)
MHA Node 运行在每台 MySQL 服务器上。(注意是每一台!!包含所有的MySQL节点和manager节点)

●MHA Manager(管理节点)
MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。
MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

3、MHA的特点

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

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

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

4、MHA的工作原理

实际就是manager的工作过程

manager会周期性探测master的状态,一旦发现master故障以后,会根据默认,将目前收到最新数据的从节点指定为新的master,所有的其他从节点指向新的master,同时VIP从原来的主漂移到新的主。这些对客户端来说都是透明的

二、有哪些数据库集群高可用方案

有keepalived(单主)、MHA(单主)、MMM(单主)以及MySQL cluster(多主)

所有的高可用都是在主从复制的基础上进行。

keepalived可以完成主备切换,但是不能完成读写分离

MMM的工作模式:

支持双主故障切换和双主日常管理,MMM也是用perl语言开发,主要用来监控和管理MySQL的双主复制。虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。

三、实操:一主两从部署MHA

1、完成主从复制

步骤一:完成所有MySQL的配置文件修改

 

server-id = 3
log-bin=mysql_bin
binlog_format=mixed
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=relay-slave-bin.indexserver-id = 3 ##所有服务器的server-id都不相同
log-bin=mysql_bin ##开启二进制日志
binlog_format=mixed ##设置二进制日志的格式为mixed
log-slave-updates=true ##slave 从 master 复制的数据会写入二进制日志文件里
relay-log=relay-log-bin ##中继日志开启
relay-log-index=relay-slave-bin.index ##中继日志的索引文件

步骤二:完成所有MySQL的主从授权,以及mha的账号授权

mysql> grant replication slave on *.* to 'myslave'@'192.168.20.%' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant all on *.* to 'manager'@'192.168.20.%' identified by 'manager123';
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant all on *.* to 'manager'@'mysql1' identified by 'manager123';
Query OK, 0 rows affected, 2 warnings (0.00 sec)mysql> grant all on *.* to 'manager'@'mysql2' identified by 'manager123';
Query OK, 0 rows affected, 2 warnings (0.00 sec)mysql> grant all on *.* to 'manager'@'mysql3' identified by 'manager123';
Query OK, 0 rows affected, 2 warnings (0.00 sec)mysql> flush privileges;

步骤三:主查看master状态,从完成与主对接,启动从节点,查看从的状态,验证IO和SQL线程的状态是否为yes

show master status;

mysql> change master to master_host='192.168.20.15',master_user='myslave',master_port=3306,master_password='abc123',master_log_file='mysql_bin.000001',master_log_pos=1761;mysql> start slave;

mysql> show slave status\G;

步骤四:验证主从复制

步骤五:将从节点都改为只读状态

set global read_only=1;

2、所有服务器配置MHA的node组件

步骤一:完成所有节点(三台mysql和manager)安装epel源和依赖环境

yum install epel-release --nogpgcheck -yyum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

步骤二:完成所有服务器部署mha-node组件

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

3、在MHA manager服务器配置manager组件

步骤一:安装manager组件

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

4、完成所有所有服务器ssh免密登录

ssh-keygen -t rsassh-copy-id 192.168.20.15
ssh-copy-id 192.168.20.16
ssh-copy-id 192.168.20.17
ssh-copy-id 192.168.20.7

5、完成在 manager 节点上配置 MHA

步骤一:复制相关脚本到/usr/local/bin 目录

cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

步骤二:使用master_ip_failover脚本来管理 VIP 和故障切换,修改该脚本

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

vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';use Getopt::Long;my ($command, $orig_master_host, $orig_master_ip,$ssh_user,$orig_master_port, $new_master_host, $new_master_ip,$new_master_port,$orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '192.168.20.100/24';
my $key = '1';
# 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";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,'orig_master_ssh_port=i' => \$orig_master_ssh_port,'new_master_host=s'  => \$new_master_host,'new_master_ip=s'    => \$new_master_ip,'new_master_port=i'  => \$new_master_port,'new_master_ssh_port' => \$new_master_ssh_port,'new_master_user' => \$new_master_user,'new_master_password' => \$new_master_password);exit &main();sub main {$ssh_user = defined $ssh_user ? $ssh_user : 'root';print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();&start_arp();$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 \"`;
}
sub stop_vip() {`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub start_arp() {`ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {print"Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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 软件目录并拷贝配置文件,这里使用mysql_mha.conf配置文件来管理 mysql 节点服务器,#创建相关目录(所有节点)

[root@localhost /opt]#mkdir -p /opt/mysql-mha/mha-node
[root@localhost /opt]#mkdir -p /opt/mysql-mha/mha

vim /opt/mysql-mha/mysql_mha.cnf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
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
user=manager
password=manager123
ping_interval=1
port=3306
remote_workdir=/opt/mysql-mha/mha-node
repl_password=abc123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.20.16 -s 192.168.20.17
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.20.15
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.20.16
port=3306[server3]
hostname=192.168.20.17
port=3306

步骤四:给主配置一个vip 

[root@mysql1 /opt]#ifconfig ens33:1 192.168.20.100/24

步骤五:完成ssh和集群的健康检查,最后启动mha 

[root@localhost /usr/local/bin]#masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf

[root@localhost /usr/local/bin]#masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf

masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf ##ssh检查
masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf ##集群检查##在 manager 节点上启动 MHA
nohup masterha_manager \
--conf=/opt/mysql-mha/mysql_mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &##查看 MHA 状态,可以看到当前的 master 是 mysql1 节点。
masterha_check_status --conf=/opt/mysql-mha/mysql_mha.cnfcat /opt/mysql-mha/manager.log | grep "current master"

6、故障切换实验

步骤一:先关闭主的mysqld服务

[root@mysql1 /opt]#systemctl stop mysqld

步骤二:查看故障切换有哪些内容

 

总结:
故障切换后,
1、MHA 进程会退出;
2、HMA 会自动修改 配置文件内容,将宕机的 mysql1 节点删除
3、VIP会漂移到新的master上
4、从节点的状态可以查看 指向新的master

步骤三:修复master

重新启动旧master的mysqld服务,重新做主从

ps:如果说master宕机以后有数据写入,那么还需要先完成数据一致再做主从!!!

[root@mysql1 /opt]#systemctl restart mysqld
[root@mysql1 /opt]#mysql -uroot -pabc123mysql> change master to master_host='192.168.20.16',master_user='myslave',master_password='abc123',master_log_file='mysql_bin.000001',master_log_pos=3087;mysql> start slave;mysql> show slave status\G;

针对数据不一致问题:需要先将主进行只读锁定,然后用mysqldump完成全量备份 给从以后 再从做一次全量备份恢复,最后当数据一致以后,再重新做主从复制 

修改manager的配置文件

[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
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
user=manager
password=manager123
ping_interval=1
port=3306
remote_workdir=/opt/mysql-mha/mha-node
repl_password=abc123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.20.15 -s 192.168.20.17
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.20.15
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.20.16
port=3306[server3]
hostname=192.168.20.17
port=3306

 

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

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

相关文章

三款红外接收二极管电路图

红外接收二极管电路图一&#xff1a; 如图所示&#xff0c;图是红外线遥控接收装置实例。红外线传感器有多种&#xff0c;这里选用光电二极管TPS604。工作原理简介如下&#xff1a;光电二极管TPS604接收到被调制的红外线的微弱信号&#xff0c;先经场效应晶体管VT1的前级放大&…

分布式系统的CAP理论详解

介绍 CP 系统是指在 CAP 理论中偏向于一致性&#xff08;Consistency&#xff09;和分区容错性&#xff08;Partition tolerance&#xff09;&#xff0c;牺牲了可用性&#xff08;Availability&#xff09;。在这样的系统中&#xff0c;一致性是非常重要的&#xff0c;即使在…

数据结构学习笔记——查找算法中的树形查找(B树、B+树)

目录 前言一、B树&#xff08;一&#xff09;B树的概念&#xff08;二&#xff09;B树的性质&#xff08;三&#xff09;B树的高度&#xff08;四&#xff09;B树的查找&#xff08;五&#xff09;B树的插入&#xff08;六&#xff09;B树的删除 二、B树&#xff08;一&#xf…

【linux】线程同步+基于BlockingQueue的生产者消费者模型

线程同步基于BlockingQueue的生产者消费者模型 1.线程同步2.生产者消费者模型3.基于BlockingQueue的生产者消费者模型 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.线程同步 在线程互斥写了一份抢票的代码&#xff0c;我们发现虽然加锁解决了抢到负数票的…

Java重修第二天—学习”方法“

通过学习本篇文章可以掌握如下知识 1、方法的定义 2、方法在计算机中的执行流程。 3、方法使用时常见问题 4、Java中方法的参数传递机制 5、方法重载 1 方法是什么 方法是一种语法结构&#xff0c;它可以把一段代码实现的某种功能封装起来&#xff0c;以便重复利用。 方…

第二百四十五

我们在上一章回中介绍了"修改页面导航中遇到的问题"沉浸式状态样相关的内容&#xff0c;本章回中将介绍如何修改Avatar的大小.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在正常使用CirCleAvatar组件时可以通过该组件的radius属性来修改它的…

目标检测-One Stage-YOLO v3

文章目录 前言一、YOLO v3的网络结构和流程二、YOLO v3的创新点总结 前言 根据前文目标检测-One Stage-YOLOv2可以看出YOLOv2的速度和精度都有相当程度的提升&#xff0c;但是精度仍较低&#xff0c;YOLO v3基于一些先进的结构和思想对YOLO v2做了一些改进。 提示&#xff1a;…

突破技术边界:R与jsonlite库探秘www.snapchat.com的数据之旅

概述 Snapchat是一款流行的社交媒体应用&#xff0c;它允许用户发送和接收带有滤镜和贴纸的照片和视频&#xff0c;以及创建和观看故事和发现内容。Snapchat的数据是非常有价值的&#xff0c;因为它可以反映用户的行为、偏好和趋势。然而&#xff0c;Snapchat的数据并不容易获…

【LMM 009】MiniGPT-4:使用 Vicuna 增强视觉语言理解能力的多模态大模型

论文描述&#xff1a;MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models 论文作者&#xff1a;Deyao Zhu∗ Jun Chen∗ Xiaoqian Shen Xiang Li Mohamed Elhoseiny 作者单位&#xff1a;King Abdullah University of Science and Techn…

亚信安慧AntDB数据库:企业核心业务系统数据库升级改造的可靠之选

在近期召开的“2023年国有企业应用场景发布会”上&#xff0c;亚信安慧公司的核心数据库产品AntDB闪耀登场&#xff0c;技术总监北陌先生针对企业核心业务系统数据库升级改造的关键议题发表了深度分享。他从研发、工程实施和运维管理三个维度细致剖析了当前企业在进行数据库升级…

Python - 深夜数据结构与算法之 DP - 进阶

目录 一.引言 二.经典算法实战 1.House-Robber [198] 2.House-Robber-2 [213] 3.Best-Sell-Time [121] 4.Best-Sell-Time-2 [122] 5.Best-Sell-Time-3 [123] 6.Best-Sell-Time-4 [188] 7.Best-Sell-Time-Coldown [309] 8. Best-Sell-Time-Fee [714] 三.总结 一.引言…

【React系列】父子组件通信—props属性传值

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识组件的嵌套 组件之间存在嵌套关系&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&…

基于粒子群算法的参数拟合,寻优算法优化测试函数

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 粒子群算法参数拟合 代码 结果分析 展望 基于粒子群算法的参数拟合(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88698417 摘要 寻优算法,测试…

后端开发——JDBC的学习(三)

本篇继续对JDBC进行总结&#xff1a; ①通过Service层与Dao层实现转账的练习&#xff1b; ②重点&#xff1a;由于每次使用连接就手动创建连接&#xff0c;用完后就销毁&#xff0c;这样会导致资源浪费&#xff0c;因此引入连接池&#xff0c;练习连接池的使用&#xff1b; …

x-cmd pkg | tig - git 文本模式界面

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 tig 由 Jonas Fonseca 于 2006 年使用 C 语言创建的 git 交互式文本命令行工具。旨在开启交互模式快速浏览 git 存储库的信息以及 git 命令的运行。 首次用户 使用 x tig 即可自动下载并使用 在终端运行 eval "…

微服务之间互相调用出现的错误

场景&#xff1a; 微服务A调用微服务B的接口&#xff0c;微服务B的接口请求方式是get类型&#xff0c;传递的参数是JSON格式。 错误&#xff1a; 1、postman&#xff1a;springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserial…

Gin 框架介绍与快速入门

Gin 框架介绍与快速入门 文章目录 Gin 框架介绍与快速入门一、Gin框架介绍1. 快速和轻量级2. 路由和中间件3. JSON解析4. 支持插件5. Gin相关文档 二、基本使用1.安装2.导入3.第一个Gin 应用 三、应用举例四、Gin 入门核心1.gin.Engine2.gin.Context 一、Gin框架介绍 Gin是一个…

VitePress搭建Vite官方中文文档首页

✨专栏介绍 在当今数字化时代&#xff0c;Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序&#xff0c;就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术&#xff0c;以及各种框架、库和工具…

FinGPT——金融领域开源大模型

文章目录 背景论文摘要相关工作大型语言模型&#xff08;LLMs&#xff09;和ChatGPT金融领域的LLMs为什么需要开源的金融LLMs&#xff1f; 以数据为中心的方法用于FinLLMs金融数据和独特特性应对处理金融数据的挑战 FINGPT 概述&#xff1a;FINLLM 的开源框架数据来源面向金融N…

【常用排序算法】冒泡排序

冒泡排序 冒泡排序基本思想&#xff1a;N 个数的数组&#xff0c;经过N-1轮排序。 升序 大的值下沉&#xff0c;小的值上浮。降序 小的值下沉&#xff0c;小的字上浮 import java.util.Arrays; public class BubbleSort {public static void main(String[] args) {int[] values…