MHA高可用

MHA:

什么是MHA:masterhight availabulity:基于主库的高可用环境下:主从复制,故障恢复

有一个主从的架构。

MHA实验要求,最少有一主两从

Mysql的单点故障问题,一旦主库崩溃,MHA可以在0-30S内自动完成故障切换

核心图:

原理:

MHA使用的是半同步方式,只要有一套服务器写入数据,就会自动提交给客户端

Master崩溃,slave就会从主的二进制日志保存文件

Slave识别最新更新日志,差异部分同步到slave

提升一个新的slave作为master

其他的slave继续和新的master同步

实验部分:

  1. MHA架构
  2. 模拟故障
  3. 故障恢复

用到四台虚拟机:

MHA manager 20.0.0.54

Master 20.0.0.51

Slave1 20.0.0.52

Slave2 20.0.0.53

Node组件------>需要部署在所有的服务器上,为什么需要node组件,manager组件依赖node组件,node监控mysql的状态,Node组件靠ssh来进行通信的

实验:关闭所有防火墙和安全机制

修改三台主从的主机名,不然后面脚本无法实现,随后ping一下

修改 Master、Slave1、Slave2 节点的主机名

hostnamectl set-hostname Master

hostnamectl set-hostname Slave1

hostnamectl set-hostname Slave2

实现主从复制

主:

log_bin = master-bin

log-slave-updates = true

log_bin = master-bin:

用于记录主服务器上的更改操作的日志文件。

这个配置用于主服务器,将生成的二进制日志文件保存为"master-bin"(可以是其他自定义的名称)。

log-slave-updates = true:

从服务器是否要记录它自己执行的更改操作到自己的二进制日志文件中。

设置为"true"表示从服务器会记录自己执行的更改操作,将其写入从服务器的二进制日志文件中。

从1

log_bin = master-bin:

指定主服务器(master)的二进制日志文件名称,用于记录主服务器上的更改操作的日志文件。

relay-log = relay-log-bin:

指定从服务器的中继日志文件名称,即用于记录主服务器的二进制日志在从服务器上执行的中继日志。

从服务器会读取主服务器的二进制日志并将其记录到中继日志中。这个配置用于从服务器。

relay-log-index = slave-relay-bin.index:

指定从服务器的中继日志索引文件的名称,该索引文件用于跟踪中继日志文件的位置和顺序。

通过这个索引文件,从服务器知道哪个中继日志文件是下一个要读取和执行的。这个配置用于从服务器。

从2

relay-log = relay-log-bin

relay-log-index = slave-relay-bin.index

#slave2不用设置master,指定主的备服务器为slave1即可。

三台都要mysql做软连接

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

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

进入三台数据库,数据库同步赋权,三台都要做

grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';

grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';

grant all privileges on *.* to 'mha'@'master' identified by 'manager';

grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';

grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';

flush privileges;

到Master数据库

两个从数据库节点执行同步操作

change master to master_host='20.0.0.51',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1737;

主从复制实现以后,两个从库设为只读模式

Set global read_only=1;设置只读模式

第二大部分:MHA

所有的服务器都要安装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

安装node组件,安装MHA

每台服务器都要安装node组件

编译安装

安装MHA服务器(仅需一台,不用全部装),在 MHA manager 节点上安装 manager 组件

#manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:

Masterha_check_ssh:检查MHA的ssh的配置情况

Masterha_check_real:检查mysql的复制情况

Masterha_manager:启动manager的脚本

Masterha_check_status:检测MHA的运行状态

Masterha_master_monitor:检测master主机的情况,master是否宕机

Masterha_master_switch:控制故障转移

Masterha_master_host: 添加或者删除配置的server信息。

masterha_stop:停止MAH脚本

node 组件安装后也会在/usr/local/bin 下面会生成几个脚本

(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:

Save_binary_logs保存和复制master的二进制日志

Apply_diff_relay_logs:识别二进制表当中的差异事假,然后发送给其他slave

Filter_mysqlbinlog:去除不必要的回滚(MHA已经不用了)

purge_relay_logs:同步之后清楚中继日志(不会阻塞sql的线程)

主从互相之间免密登录,MHA与三台mysql互相免密登录,

ssh-keygen -t rsa

ssh-copy-id XXXXX

在 manager 节点上配置 MHA

master_ip_failover   #自动切换时 VIP 管理的脚本

master_ip_online_change #在线切换时 vip 的管理

power_manager #故障发生后关闭主机的脚本

send_report #因故障切换后发送报警的脚本

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

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

这里使用master_ip_failover脚本来管理 VIP 和故障切换

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

修改内容如下:(删除原有内容,直接复制并修改vip相关参数)

修改内容如下:(删除原有内容,直接复制并修改vip相关参数)

vim /usr/local/bin/master_ip_failover

原内容全部删除,除了第一行

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.233.100'; #设定VIP的地址

my $brdc = '192.168.233.255'; #设定VIP的广播地址

my $ifdev = 'ens33'; #VIP绑定的网卡

my $key = '1'; #ifcong enss33: 1 192.168.233.100/24

my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #enss33: 1 192.168.233.100 up

my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #enss33: 1 192.168.233.100  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 节点服务器

mkdir /etc/masterha

cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha

App1.cof:配置文件,用来管理mysql节点服务器

vim /etc/masterha/app1.cnf 删除原有内容,直接复制并修改节点服务器的IP地址

原内容全部删除

[server default] 

manager_log=/var/log/masterha/app1/manager.log  #manager的管理日志

manager_workdir=/var/log/masterha/app1 #manager的工作目录

master_binlog_dir=/usr/local/mysql/data #保存master的二进制日志的位置,必须要和master保存的路径一致

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包的时间间隔,1秒,工作当中设置3-6秒,尝试三次之后会切换到failover脚本进行自动切换

remote_workdir=/tmp #mysql在发生切换时,binlog的保存位置

repl_password=123456 #用户密码

repl_user=myslave #用户名

secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.233.22 -s 192.168.233.23

#从对主监听,从和主互相监听,主无需声明,但是从服务器

shutdown_script="" #设置切换时告警的脚本

ssh_user=root #远程登录的用户名

user=mha

[server1]

hostname=192.168.233.21

#主服务器

port=3306

[server2]

candidate_master=1   #设置候选非master,如果主库崩溃,会切换到server2 233.22

check_repl_delay=0   #即使设置了权重,但是从服务器的realy_log落后100M,也不会切换,如果设置为0,会忽略延迟复制,直接升为主,也可以理解为强制切换到候选master的服务器

hostname=192.168.233.22  

#备用主服务器

port=3306

[server3]

hostname=192.168.233.23  

#从服务器2

port=3306

第一次配置需要在 Master 节点上手动开启虚拟IP

/sbin/ifconfig ens33:1 20.0.0.100/24

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

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

在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常。如下所示。

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

安装完成

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

Remove_dead_master_conf:表示发生主从切换,老的主库的IP地址,会从文件中删除

/var/log/masterha/app1/manager.log:MHA的管理日志

-ignore_last_failover:MHA检测到连续发生宕机,而且宕机时间间隔不足8小时,不会进行自动切换

故障模拟:

在主master上创建一个虚拟网卡,然后关闭主的mysql服务

查看备

打开节点服务器的报错日志

故障修复:

重启原主master的数据库

.修复主从

#在现主库服务器 Mysql2 查看二进制文件和同步点

show master status;

原主库

修改原主的配置文件和新主的配置文件:

原主库修改:

server-id = 1

log_bin=master-bin

relay-log = relay-log_bin

relay-log-index = slave-relay_bin.index

新主库:

server-id = 2

log_bin=master-bin

log-slave-updates=true

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

vim /etc/masterha/app1.cnf

重启manager:

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

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 &

查看日志:

#解决中英字不兼容报错的问题

dos2unix /usr/local/bin/master_ip_failover

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

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

相关文章

wpf devexpress 添加GanttControl到项目

这个教程示范如何添加GanttControl 到你的项目使用内置GanttControl数据类。 要求 添加 Devexpress.Wpf.Gantt Nuget包到你的项目使用GanttControl. 数据模型 GanttControl携带和内置数据对象&#xff0c;可以使用创建视图模型&#xff1a; GanttTask 呈现甘特图任务 Gan…

BUUCTF 被偷走的文件 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 一黑客入侵了某公司盗取了重要的机密文件&#xff0c;还好管理员记录了文件被盗走时的流量&#xff0c;请分析该流量&#xff0c;分析出该黑客盗走了什么文件。 密文&#xff1a; 下载附件&#xff0c;解压得到一个…

unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案

unity中的模型坐标系与3dmax导出的模型坐标系不一致的解决方案 unity是左手坐标系&#xff0c;3dmax为右手坐标系 需要在3dmax中修改坐标系 顶视图中改成&#xff1a;X轴&#xff08;红色&#xff09;向右&#xff1a; Y轴&#xff08;蓝色&#xff09;朝向自己: Z轴&#xff…

Spring Boot 中使用 ResourceLoader 加载资源的完整示例

ResourceLoader 是 Spring 框架中用于加载资源的接口。它定义了一系列用于获取资源的方法&#xff0c;可以处理各种资源&#xff0c;包括类路径资源、文件系统资源、URL 资源等。 以下是 ResourceLoader 接口的主要方法&#xff1a; Resource getResource(String location)&am…

Linux常用命令——bzcat命令

在线Linux命令查询工具 bzcat 解压缩指定的.bz2文件 补充说明 bzcat命令解压缩指定的.bz2文件&#xff0c;并显示解压缩后的文件内容。保留原压缩文件&#xff0c;并且不生成解压缩后的文件。 语法 bzcat(参数)参数 .bz2压缩文件&#xff1a;指定要显示内容的.bz2压缩文…

【Coppeliasim】 通过TCP与coppeliasim通信

仿真客户端&#xff0c; 代码中启动了tcp服务器。 simrequiresim socketrequiresocket-- 以下函数将数据写入套接字&#xff08;仅为简单起见只处理单个数据包&#xff09;&#xff1a; writeSocketDatafunction(client,data)local headerstring.char(59,57,math.mod(#data,25…

ubuntu20.04在docker下运行ros-noetic

经常折腾虚拟机各双系统 &#xff0c; 想着不如把docker利用起来&#xff0c;下面算是一个初学者使用docker运行ros的记录&#xff1a; 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

新材料企业ERP有几种?能帮助企业解决哪些问题

在我们的生活当中会遇到各种各样的新材料&#xff0c;这些新材料对应不同的制造工艺、品质检验标准、生产工序、制造设备等。有些新材料企业的营销渠道不止一个&#xff0c;各个营销平台的经营策略和商品维护流程各不相同&#xff0c;而这也使得日常的管理工作量较大。 经过多…

工业机器人“智能制造产线6”教学案例

​智能制造单元主要以智能制造技术推广应用实际与发展需求为设计依据&#xff0c;按照“设备自动化生产精益化管理信息化人工高效化”的构建理念&#xff0c;将数控加工设备、工业机器人、检测设备、数据信息采集管控设备等典型加工制造设备&#xff0c;集成为智能制造单元“硬…

HIS医疗项目

文章目录 医疗项目简介HIS项目介绍HIS架构解析HIS业务流程图HIS项目架构图 HIS组件解析——服务支撑 内存设置为4G或以上部署NGINX服务部署web安装JDK部署Elasticsearch安装ik中文分词器 部署rabbitmq部署MySQL服务安装MySQL服务建库、授权用户导入数据 部署Redis测试Redis 部署…

在线 sha1 加密

ttmd5 http://www.ttmd5.com/hash.php?type5 qqxiuzi https://www.qqxiuzi.cn/bianma/sha-1.htm jb51 http://tools.jb51.net/password/sha_encode

基于SpringBoot+Vue的新能源汽车充电桩管理系统

基于SpringBootVue的新能源汽车充电桩管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 充电桩详情 管理员界面 摘要 本项目是基于Spring Boot 和 …

解决requests库中的期限处理问题:从404到异常再到修复

目录 引言 一、了解HTTP 404错误 二、问题分析 三、解决方法 1、控制请求频率 2. 使用代理服务器 3、异常处理与重试机制 4、修复问题源头 5、联系目标网站管理员 四、总结 引言 在利用Python的requests库进行网络爬虫或API请求时&#xff0c;我们有时会遇到“HTTP …

天猫精灵/小爱同学+巴法云+Openwrt控制局电脑/群晖开关机

天猫精灵/小爱同学巴法云Openwrt控制局电脑/群晖开关机 事情的起因实战环境开始发车1.天猫精灵/小爱同学 连接 八法云 2.openwrt3.docker环节注意:sshpass 要先使用 ssh命令登陆一下你要唤醒或者远程关机的设备,不然可能因为一个登陆提示你是否登陆的yes/no导致程序没有反应,然…

(论文阅读40-45)图像描述1

40.文献阅读笔记&#xff08;m-RNN&#xff09; 简介 题目 Explain Images with Multimodal Recurrent Neural Networks 作者 Junhua Mao, Wei Xu, Yi Yang, Jiang Wang, Alan L. Yuille, arXiv:1410.1090 原文链接 http://arxiv.org/pdf/1410.1090.pdf 关键词 m-RNN、…

【Linux】Linux进程间通信(三)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

Python:函数篇(每周练习)

编程题&#xff1a; Python第四章作业&#xff08;初级&#xff09; (educoder.net) 题一&#xff1a;无参无返回值函数 def print_hi_human(): # 函数名用小写字母print("人类&#xff0c;你好&#xff01;")if __name__ __main__:print_hi_human() 题二&#…

在python中os.chdir()的含义以及用法

文章目录 一、os.chdir() 是什么&#xff1f;二、用法注意 一、os.chdir() 是什么&#xff1f; 在Python中&#xff0c;os.chdir() 是 “change directory” 的缩写&#xff0c;意思是改变当前工作目录。这个函数是Python的 os 模块的一部分&#xff0c;允许你更改程序的工作目…

2023.11.16 hivesql高阶函数之开窗函数

目录 1.开窗函数的定义 2.数据准备 3.开窗函数之排序 需求:用三种排序方法查询学生的语文成绩排名,并降序显示 4.开窗函数分组 需求:按照科目来分类,使用三种排序方式来排序学生的成绩 5.聚合函数与分组配合使用 6.聚合函数同时和分组以及排序关键字配合使用 --需求1&…

MAC电脑连接外接显示屏,颜色显示有问题,又粉、紫色蒙版,问题处理(1)

问题描述 买了一个显示器&#xff0c;想给mac做分屏使用&#xff0c;结果连上之后发现&#xff0c;整个屏幕像是被蒙上了一层紫色的蒙版。 就像下面展示的一样&#xff1a; 解决 将显示器颜色空间改为RGB颜色空间即可。 打开显示器菜单&#xff0c;找到颜色空间选项&#…