MySQL高可用方案之MHA

news2024/9/20 14:23:40

目录

一、简介

二、MHA特点

三、搭建MySQL MHA

1、安装MHA

2、在所有服务器上配置无密码认证

3、在manager节点上配置MHA

4、 manager节点编辑配置文件,管理 mysql 节点服务器

5、在Master服务器上手动开启vip

6、在 manager 节点上测试 ssh 无密码认证

7、故障模拟


一、简介

       MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。
  MHA 是由日本人 yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的 MySQL 高可用方案。MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从。                                             MHA架构由三台mysql服务器(一主两从)和一台manager节点组成,当主库发生故障时,manager能自动从众多从库中选择一台slave log最新的从库转变成主库,然后将其它所有节点重新指向新的主库。将丢失数据的概率降至最低。

写库故障发生前:

写库故障发生后: 

二、MHA特点

       自动故障切换过程中,MHA总会试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。                                                                                                                                             但这并不总是可行,例如如果主服务器硬件故障或者无法通过ssh访问,MHA则无法保存二进制日志,只能进行故障转移而丢失了最新的数据。此时,使用MySQL的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性,有时候可故意设置从节点慢于主节点,当发生意外删除数据库倒是数据丢失时可从从节点二进制日志中恢复。

三、搭建MySQL MHA

MHA一主两从高可用集群示意图:

 实验环境:

MHA manager 服务器:192.168.80.7

Master 服务器:192.168.80.8

Slave1 服务器:192.168.80.3

Slave2 服务器:192.168.80.5

1、安装MHA

部署之前需要配置好主从复制,我这边已经部署好了,详情看我上上篇博客

1)所有服务器上安装MHA依赖的环境

yum install epel-release --nogpgcheck -y  #首先安装epel源

yum install -y perl-DBD-MySQL \     #安装MHA依赖环境
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

2)安装MHA软件包

在所有服务器上必须先安装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

 

 #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 线程)

2、在所有服务器上配置无密码认证

1)在manager节点上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa             #一路按回车键,生成密钥。"-t rsa"指定密钥的类型。
ssh-copy-id 192.168.80.8    #将公钥传给所有数据库节点,形成免密码连接登录
ssh-copy-id 192.168.80.3
ssh-copy-id 192.168.80.5

2)在master节点上配置到数据库节点slave1和slave2的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.80.3    #将公钥传给两个从节点,形成免密码连接登录
ssh-copy-id 192.168.80.5

3)在slave1上配置到数据库节点master和slave2的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.80.8
ssh-copy-id 192.168.80.5

4)在slave2上配置到数据库节点master和slave1的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.80.8
ssh-copy-id 192.168.80.3

3、在manager节点上配置MHA

1)在manager节点上复制相关脚本到/usr/local/bin目录

#在 manager 节点上复制相关脚本到/usr/local/bin 目录
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

#拷贝后会有四个执行文件
ll /usr/local/bin/scripts/

master_ip_failover          #自动切换时 VIP 的管理脚本
master_ip_online_change     #在线切换时 VIP 的管理脚本
power_manager               #故障发生后关闭主机的脚本
send_report                 #因故障切换后发送报警的脚本

2)复制自动切换时VIP管理的脚本到/usr/local/bin目录

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

3)修改master_ip_failover脚本

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.80.100';                             #指定vip的地址
my $brdc = '192.168.80.255';                            #指定vip的广播地址
my $ifdev = 'ens33';                                    #指定vip绑定的网卡
my $key = '1';                                          #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #代表此变量值为ifconfig ens33:1 192.168.80.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";    #代表此变量值为ifconfig ens33:1 192.168.80.100 down
my $exit_code = 0;                                      #指定退出状态码为0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";

##################################################################################
 ​
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";
}

4、 manager节点编辑配置文件,管理 mysql 节点服务器

1)创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器

mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/   #复制配置文件
 ​
vim /etc/masterha/app1.cnf   #删除原有内容,直接复制并修改节点服务器的IP地址
[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
user=mha
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.3 -s 192.168.80.5
shutdown_script=""
ssh_user=root
 ​
[server1]
hostname=192.168.80.8
port=3306
 ​
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.80.3
port=3306
 ​
[server3]
hostname=192.168.80.5
port=3306

5、在Master服务器上手动开启vip

/sbin/ifconfig ens33:1 192.168.80.100/24

6、在 manager 节点上测试 ssh 无密码认证

在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出successfully

masterha_check_ssh -conf=/etc/masterha/app1.cnf

7、故障模拟

在master上停止mysql服务,MHA 会自动修改 app1.cnf 文件内容,将宕机的master节点删除。 slave1会自动接管 VIP,成为新的master

systemctl stop mysqld    #在Master节点上停止mysql服务

tail -f /var/log/masterha/app1/manager.log    #在manager节点上监控观察日志记录

 

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

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

相关文章

安装JDK8绿色版

前言:官网提供的JDK8只有安装包,没有绿色免安版,而我们开发时需要根据需求使用不同的JDK版本,使用安装包安装过程会写入注册表,不方便便携式使用,还会附带安装Java 8 Update,会自动更新。而绿色…

详细介绍NLP中文分词原理及分词工具

基于词表的分词方法 正向最大匹配算法FMM 从左到右扫描文本,得到词的最大匹配。 案例分析: 用正向最大匹配法对“秦皇岛今天晴空万里”进行中文分词,见下表。 词典 :“秦皇岛”“岛”“今天”“天晴”“晴空万里”“万里”………

《数据在外设中的存储》

【一】磁盘的物理结构 我们现在很少看到磁盘了,我们电脑使用的大部分使用的是nvme协议的固态硬盘,差一点的使用的是sata固态接口的硬盘了,磁盘在我们电脑上尤其是笔记本电脑上是很少存在的,难道磁盘真的穷途末路了吗?显…

confluence 6.7.1-x64.bin安装

confluence数据库的配置文件:# cat /var/atlassian/application-data/confluence/confluence.cfg.xml 1: 安装包 jdk 2: 执行./atlassian-confluence-6.7.1-x64.bin 设置安装目录和数据目录 启动 service confluence start 3&#xff…

[附源码]计算机毕业设计社区住户信息管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

连阿里P8都赞不绝口的“分布式架构原理设计笔记”到底有多牛

在分布式系统中,一次业务处理可能需要多个应用来实现,比如用户发送一次下单请求,就涉及到订单系统创建订单,库存系统减库存,而对于一次下单,订单创建与减库存应该是要同时成功或者同时失效,但在…

matlab中的隐马尔可夫模型(HMM)实现

隐马尔可夫模型(HMM)简介 隐马尔可夫模型(HMM)是一个在你观察到的输出顺序,但不知道状态序列模型产生输出的过程。 去年,我们为一家公司进行了短暂的咨询工作,该公司正在构建一个主要基于隐马…

借助PyCharm在代码中自动添加作者、日期

名人说:闻道有先后,术业有专攻。——韩愈 Code_流苏(CSDN) o(‐^▽^‐)o很高兴你打开了本篇博客,跟着步骤一起去设置吧! Pycharm安装教程请点这里 目录一、背景缘由二、设置方法三、补充一、背景缘由 在用…

左神:中级提升班5

1.斐波那切数列套路 1.1F(N)F(N-1)F(N-2) 1.2F(N)3F(N-1)-4F(N-3)6F(N-5) 1.3生牛问题 1.4达标串数量 1.5取最少的木棍 2.背包问题 3.找工作 4.判断是否符合人类正常书写 1.斐波那切数列套路 1.1F(N)F(N-1)F(N-2) 线性代数: 1. 利用初始项可以吧a,b,c,d算出来 2…

【面试题】https协议

1. http和https的区别 http是明文传输,敏感信息容易被中间劫持。https在http协议的基础上,增加了加密的特性,数据被劫持了也无法解密。现代浏览器已经开始强制使用https协议。 2. https的加密方式 2.1 对称加密 对称加密:使用…

[激光原理与应用-38]:《光电检测技术-5》- 光学测量基础 - 光调制

目录 一、光调制概述 1.1 什么是光调制 1.2 激光的光调制方法 1.3 光调制的调制 二、直接调制法 三、腔内调制法 3.1 被动调制: 3.2 主动调制: 四、腔外调制法 五、新型光调制 5.1 基于强度调制 5.2 基于相位调制 5.3 基于偏振调制 一、光调…

【前端】面试题6~10

目录 一、说一说BFC 1、BFC的概念 2、BFC布局规则 3、BFC形成的条件 3、BFC解决能的问题 4、BFC的其他 5、总结 二、说一说Vuex是什么,每个属性是干嘛的,如何使用 ? 1、Vuex是什么 2、Vuex 的属性 3、使用方法 4、简单总结 三、说…

Jsp基础了解(二)

文章目录Jsp基础了解(一)7,MVC模式和三层架构7.1 MVC模式7.2 三层架构7.3 MVC 和 三层架构8,案例8.1 环境准备8.1.1 创建工程8.1.2 创建包8.1.3 创建表8.1.4 创建实体类8.1.5 准备mybatis环境8.2 查询所有8.2.1 编写BrandMapper8.…

无模型深度强化学习算法

无模型深度强化学习算法:直接训练类神经网络模型来表示策略。这里的“无模型”指的是不建立环境模型,而非不建立任何机器学习模型。这样的策略模型可以直接用策略梯度(policy gradient)[3]训练,但是策略梯度的变异性太…

使用extundelete恢复文件-尚文网络xUP楠哥

~~全文共1462字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! 假如遇到一些恶意者试图入侵服务器或者遇到Linux系统架构师不小心误删文件或目录,可以通过extundele…

DFS 、BFS、回溯

1、dfs(res,当前结构,当前候选热数据,当前目标值,当前搜索的层级) 2、BFS(Breadth first search) 对于树来说,BFS就是层次遍历 而图的BFS 与树的BFS 不同点在于,树有根节点&#xf…

GPIO口,232串口,USB接口,485接口等接口保护电路

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言一、GPIO口1、输入端2、输出端二、USB口三、232口前言 送给大学毕业后找不到奋斗方向的你(每周不定时更…

Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查

写在前面 分享一些 AWX 启用facts缓存和模板问卷调查的笔记博文内容涉及: 启动facts缓存相关配置Demo启用模板调查来设置变量demo 食用方式: 需要了解 Ansible理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去&a…

基础入门 - Spring Boot HelloWorld 第二节

简化配置 Spring Boot 把所有的配置都固定编写在 application.properties 里,文件名是固定写法,不能改 我们如果想更改配置,几乎所有的配置都在这里面更改就可以,而且,就算你不更改,不编写配置,…

计算机毕业设计java基于springboot医院急诊挂号系统

项目介绍 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:springbootvue 人难免会有生病的时候,尤其是当一些突发情况下,一旦发生一些疾病很可能会危及生命。这时候如果按照常规的方式进行挂号是很浪费时间…