mysql高可用方案之MHA

mysql集群高可用方案:

单主:keepalived、MHA、MMM

多主:MySQL cluster 、PXC

MHA的工作原理

MHA node 运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明

要求一个复制集群必须最少有三台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,另一台充当从库。

MHA的组成

  • MHA Node(数据节点)

MHA Node 运行在每台MySQL服务器上

  • MHA Manager(管理节点)

MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。

MHA故障切换的原理

  • MHA Manager 会定时探测集群中的 主库(master)节点。

  • 当 master 出现故障时,它可以自动将最新数据的 从库(slave) 提升为新的master , 然后将所有其他的 slave 重新指向新的 master。

  • 整个故障转移过程对应用程序完全透明。

MHA部署过程:

1.所有mysql节点都做主从复制授权,合MHA manager访问数据库的授权

2.做时间同步合mysql的主从复制,并设置所有的从节点为只读模式

3.所有节点安装 MHA node 组件,在manager节点上还要再安装 MHA manager组件

4.所有节点做ssh密钥对免交互登录认证

5.在MHAmanaer节点上准备号故障切换脚本和MHA配置文件

6.在master节点上使用ifconfig创建VIP

7.使用masterha_check_ssh 和 masterha_check_repl 做 MHA 启动前检查,再使用 masterha_manager 启动MHA进程

8.做故障切换测试(故障切换后MHA进程会自动退出,配置文件会自动删除旧master的配置信息,VIP会飘逸到新master节点上,其他的从节点会自动指向新master做主从复制)

搭建MySQL MHA

1.数据库安装

2.做主从服务器时间同步

3.所有mysql都做二进制日志转中继日志配置和主从复制授权

首先添加二进制日志转中继日志配置
在主服务器配置
vim /etc/my.cnflog_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index在从1服务器配置
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
在从2服务器配置
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

 主服务器的配置:

 

 

 

4.在 Master、Slave1、Slave2 节点上都创建两个软链接,之后的managers服务器上也要创建

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

5.给所有数据库授权,并将两个从库设置为只读

先给所有数据库改名
hostnamectl set-hostname mysql1     #主
hostnamectl set-hostname mysql2     #从
hostnamectl set-hostname mysql3     #从主从配置如下:
grant all on *.* to 'manager'@'mysql1' identified by 'abc123';
grant all on *.* to 'manager'@'mysql2' identified by 'abc123';
grant all on *.* to 'manager'@'mysql3' identified by 'abc123';两个从库设置为只读
set global read_only=1;

6.所有服务器上安装MHA软件

yum install epel-release -ycd /opt   #安装MHA软件
tar xf mha4mysql-node-0.57.tar.gzyum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPANperl Makefile.PL
make && make install

7.在mha manager服务器上解压manager包:

tar xf mha4mysql-manager-0.57.tar.gz 
cd mha4mysql-manager-0.57/
perl Makefile.PL
make && make install
#manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh       检查 MHA 的 SSH 配置状况
masterha_check_repl      检查 MySQL 复制状况
masterha_manger          启动 manager的脚本
masterha_check_status    检测当前 MHA 运行状态
masterha_master_monitor  检测 master 是否宕机
masterha_master_switch   控制故障转移(自动或者手动)
masterha_conf_host       添加或删除配置的 server 信息
masterha_stop            关闭manager#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:
save_binary_logs        保存和复制 master 的二进制日志
apply_diff_relay_logs   识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog      去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs        清除中继日志(不会阻塞 SQL 线程)

8.在所有服务器上配置无密码认证:

 cd /usr/local/binyum -y install sshpass第一台数据库:192.168.116.60
第二台数据库:192.168.116.70
第三台数据库:192.168.116.80
第四台:192.168.116.30ssh-keygen -t rsa
修改ssh配置文件
vim /etc/ssh/ssh_config
在35行取消注释,后面改为no在主服务器上
sshpass -p '123' ssh-copy-id 192.168.116.70
sshpass -p '123' ssh-copy-id 192.168.116.80
在从1服务器上
sshpass -p '123' ssh-copy-id 192.168.116.60
sshpass -p '123' ssh-copy-id 192.168.116.80
在从2服务器上
sshpass -p '123' ssh-copy-id 192.168.116.70
sshpass -p '123' ssh-copy-id 192.168.116.60
在manager服务器上
sshpass -p '123' ssh-copy-id 192.168.116.60
sshpass -p '123' ssh-copy-id 192.168.116.70
sshpass -p '123' ssh-copy-id 192.168.116.80

9.在manager服务器上的配置

[root@test4 bin]# cd /opt/mha4mysql-manager-0.57/samples/
[root@test4 samples]# ls scripts/
master_ip_failover  master_ip_online_change  power_manager  send_report四个执行文件:
-------------------------------------------------------------------------------------------
master_ip_failover  		#自动切换时 VIP 管理的脚本
master_ip_online_change 	#在线切换时 VIP 的管理
power_manager 				#故障发生后关闭主机的脚本
send_report 				#因故障切换后发送报警的脚本
-------------------------------------------------------------------------------------------

cp -a scripts/ /usr/local/bin/
cd /usr/local/bin
cd scripts/
cp power_manager  ../
cd ..
vim power_manager
进去全部删除,有现成的脚本文件粘贴进去
进去之后改成文本格式复制粘贴
set paster
#!/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.116.200/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;};exit $exit_code;}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";
}

10.所有服务器上创建 MHA 软件目录并拷贝配置文件:

mkdir -p /opt/mysql-mha/mha-node
在manager服务器创建mha目录
mkdir -p /opt/mysql-mha/mha

 11.在manager服务器上编写配置文件:

vim mysql_mha.conf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
master_binlog_dir=/usr/local/mysql/data
[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=123456
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=manager
repl_password=abc123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.116.70 -s 192.168.116.80
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.116.60
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.116.70
port=3306[server3]
hostname=192.168.116.80
port=3306

 12.在主服务器上配置vip

ifconfig ens33:1 192.168.116.200/24

 13.在 manager 节点上测试 ssh 无密码认证

[root@test4 mysql-mha]# pwd
/opt/mysql-mha
[root@test4 mysql-mha]# masterha_check_ssh  --conf=./mysql_mha.cnf

 14.测试 mysql 主从连接情况:

最后出现 MySQL Replication Health is OK为正常:

masterha_check_repl  --conf=./mysql_mha.cnf

 15.在 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 &

 16.查看 MHA 状态,可以看到当前的 master 是 mysql1 节点

masterha_check_status --conf=/opt/mysql-mha/mysql_mha.cnf

 17.查看 MHA 日志,也以看到当前的 master 是 192.168.80.10,如下所示

cat /opt/mysql-mha/manager.log | grep "current master"

18. 查看 mysql1 的 VIP 地址 192.168.80.200 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失

ifconfig//若要关闭 manager 服务,可以使用如下命令。
masterha_stop --conf=/opt/mysql-mha/mysql_mha.cnf
或者可以直接采用 kill 进程 ID 的方式关闭。

 故障模拟

1.在 manager 节点上监控观察日志记录

tail -f /opt/mysql-mha/manager.log

 2.在 Master 节点 mysql1 上停止mysql服务

systemctl stop mysqld

 

 正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。查看 mysql2 是否接管 VIP

ifconfig

 查看日志:

故障修复步骤:

1.修复mysql

systemctl restart mysqld

2.修复主从
#在现主库服务器 mysql2 查看二进制文件和同步点

show master status;

 3.在原主库服务器 mysql1 执行同步操作

change master to master_host='192.168.116.70',master_user='myslave',master_password='abc123',master_log_file='mysql-bin.000001',master_log_pos=2776;start slave;

4.在 manager 节点上修改配置文件mysql_mha.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)

[root@test4 mysql-mha]# vim mysql_mha.cnf [server1]
hostname=192.168.116.70
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.116.60
port=3306

5.在 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 &

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

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

相关文章

Java方法用法及解析

在 Java 中&#xff0c;方法&#xff08;Method&#xff09;是用于执行特定任务的代码块。它是一个函数&#xff0c;用于封装一段可重复执行的代码&#xff0c;并可以被其他代码调用。方法定义了一系列操作的步骤&#xff0c;并提供了一种结构化和可复用的方式来组织和执行这些…

[VUE]4-状态管理vuex

目录 状态管理 vuex 1、vuex 介绍 2、安装 3、使用方式 4、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Python人工智…

【源码预备】Calcite基础知识与概念:关系代数概念、查询优化、sql关键字执行顺序以及calcite基础概念

文章目录 一. 关系代数的基本知识二. 查询优化三. SQL语句的解析顺序1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT 四. Apache Calcite中的基本概念1. Adapter2. Calcite中的关系表达式2.1. 关系表达式例子2.2. 源码底层结构 3. Calcite的优化规则4. Calcite的Trait--算子物理…

02 Deep learning algorithm

Neural Networks target&#xff1a; inference&#xff08;prediction&#xff09;training my own modelpractical advice for building machine learning systemdecision Tress application: speech&#xff08;语音识别&#xff09; ----> images(计算机视觉)—> t…

数据结构-测试4

一、判断题 1.队列结构的顺序存储会产生假溢出现象。 &#xff08;T&#xff09; 2.度为二的树就是二叉树。(F) 二叉树的度可以小于等于2 3. 栈是插入和删除只能在一端进行的线性表&#xff1b;队列是插入在一端进行&#xff0c;删除在另一端进行的线性表。&#xff08;T&…

【CMake】1. VSCode 开发环境安装与运行

CMake 示例工程代码 https://github.com/LABELNET/cmake-simple 插件 使用 VSCode 开发C项目&#xff0c;安装 CMake 插件 CMakeCMake ToolsCMake Language Support &#xff08;建议&#xff0c;语法提示) 1. 配置 CMake Language Support , Windows 配置 donet 环境 这…

异地环控设备如何远程维护?贝锐蒲公英解决远程互联难题

青岛某企业致力于孵化设备、养禽设备和养猪设备的研发、生产和服务&#xff0c;历经三十多年发展&#xff0c;目前已成长为行业主要的养殖装备及工程服务提供商&#xff0c;产品覆盖养殖产业链中绝大多数环节&#xff0c;涉及自动化设备、环控设备、整体解决方案等。 在实际应用…

Python3从零基础到入门(1)

目录 一、环境搭建 1.检测Python环境 2.下载安装Python环境 3.VSCode中配置Python环境 二、第一个程序 1.编码 2.输出 3.标识符 4.import 5.保留字 6.注释 7.缩进 三、变量和赋值 1.Python 中的变量 2.变量的赋值 3.多个变量赋值 四、基础数据类型 1.类型查看…

以unity技术开发视角对android权限的讲解

目录 前言 Android权限分类 普通权限 普通权限定义 普通权限有哪些 危险权限 危险权限的定义 危险权限有哪些 动态申请权限实例 申请单个权限实例 第一步&#xff1a;在清单文件中声明权限 第二步&#xff1a;在代码中进行动态申请权限 申请多个权限实例 第一步&am…

以对象为中心的视频编辑;SDXL高质量缩小版;Transformer在FPGA上实现12.8倍速度提升;深入研究ViT固有问题

本文首发于公众号&#xff1a;机器感知 以对象为中心的视频编辑&#xff1b;SDXL高质量缩小版&#xff1b;Transformer在FPGA上实现12.8倍速度提升&#xff1b;深入研究ViT固有问题 VASE: Object-Centric Appearance and Shape Manipulation of Real Videos 现有方法通过文生…

前端学习笔记 3:Vue 工程

前端学习笔记 3&#xff1a;Vue 工程 上一篇文章介绍了如何在单一 Html 页面中使用 Vue&#xff0c;本文介绍如何从头开始用 Vue 构建一个前端工程项目。 1.环境准备 Vue 框架代码的创建依赖于 Node.js&#xff0c;因此需要先安装 Node.js。 2.创建和启动 2.1.创建 通过以…

MongoDB高级集群架构设计

两地三中心集群架构设计 容灾级别 RPO & RTO RPO&#xff08;Recovery Point Objective&#xff09;&#xff1a;即数据恢复点目标&#xff0c;主要指的是业务系统所能容忍的数据丢失量。RTO&#xff08;Recovery Time Objective&#xff09;&#xff1a;即恢复时间目标&…

OpenHarmony内存泄漏指南 - 解决问题(综合)

本系列文章旨在提供定位与解决OpenHarmony应用与子系统内存泄露的常见手段与思路&#xff0c;将会分成几个部分来讲解。首先我们需要掌握发现内存泄漏问题的工具与方法&#xff0c;以及判断是否可能存在泄漏。接着需要掌握定位泄漏问题的工具&#xff0c;以及抓取trace、分析tr…

智能计价器Scratch-第14届蓝桥杯Scratch省赛真题第5题

5. 智能计价器&#xff08;80分&#xff09; 背景信息&#xff1a;A城市的出租车计价&#xff1a;3公里以内13元&#xff0c;基本单价每公里2.3元(超过3公里的部分&#xff0c;不满1公里按照1公里收费&#xff09;&#xff0c;燃油附加费每运次1元。例如&#xff1a;3.2公里的…

自动化测试报告生成(Allure)

之前尝试使用过testNG自带的测试报告、优化过reportNG的测试报告&#xff0c;对这两个报告都不能满意。后经查找资料&#xff0c;发现有个神器&#xff1a; Allure&#xff08;已经有allure2了&#xff0c;笔者使用的就是allure2&#xff09;&#xff0c;生成的测试报告与上述…

【回溯算法】n-皇后

导航 题目来源题目描述示例思路完整代码 题目来源 n-皇后 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一…

【Linux Shell】9. 流程控制

文章目录 【 1. if else 判断 】1.1 if1.2 if else1.3 if elif else1.4 实例 【 2. case 匹配 】【 3. 循环 】3.1 for 循环3.2 while 循环3.3 until 循环3.4 无限循环3.5 跳出循环3.5.1 break 跳出所有循环3.5.2 continue 仅跳出当前循环 【 1. if else 判断 】 1.1 if fi 是…

【算法】递归算法理解(持续更新)

这里写目录标题 一、递归算法1、什么情况下可以使用递归&#xff1f;2、递归算法组成部分3、案例&#xff1a;求n的阶乘4、编写一个递归函数来计算列表包含的元素数。5、通过递归找到列表中最大的数字。6、通过递归的方式实现二分查找算法。 一、递归算法 递归&#xff08;Rec…

“单项突出”的赢双科技IPO加速,比亚迪是最强助力?

近日&#xff0c;新能源汽车核心部件供应商赢双科技首次递表科创板&#xff0c;其凭借旋转变压器产品就坐稳了新能源车企主要供应商的地位&#xff0c;从核心业务及业绩情况来看&#xff0c;赢双科技不愧为“单项冠军”。 据悉&#xff0c;赢双科技本次IPO拟募资8.47亿元&…

3.9 EXERCISES

矩阵加法需要两个输入矩阵A和B&#xff0c;并产生一个输出矩阵C。输出矩阵C的每个元素都是输入矩阵A和B的相应元素的总和&#xff0c;即C[i][j] A[i][j] B[i][j]。为了简单起见&#xff0c;我们将只处理元素为单精度浮点数的平方矩阵。编写一个矩阵加法内核和主机stub函数&am…