系统学习Linux-Mariadb高可用MHA

news2024/11/17 0:01:56

概念

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

MHA 的出现就是解决MySQL 单点的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

组成

MHA manager——管理节点

MHA node——数据节点(每个节点上都需要安装)

特点

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

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

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

工作原理

从宕机崩溃的master 保存二进制日志事件(binlog events);

识别含有最新的更新slave日志

应用差异的中继日志(relay log)到其他的slave

应用从master保存的二进制日志事件

提升一个slave为新的master

使其他的slave连接新的master进行复制


案例
192.168.31.24manager(MHA)mgt
192.168.31.25mastermasternode
192.168.31.26slaveslave1
192.168.31.27slaveslave2

搭建实验环境4台虚拟机分别配置基础环境与ip

修改每台虚拟机主机名方便实验

 

修改etc/hosts文件

vim /etc/hosts

配置所有hosts的节点后scp到其他虚拟机

scp /etc/hosts ip:/etc

去每台虚拟机验证是否存在hosts内容

验证连通性

一定每台机器都要测试

配置ssh免密登陆(每台ssh-keygen)

[root@mgt ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:OFdoPhxC3bHTgT9y7PN+z0Xr6pcpfB4fwz8tzsDfDwM root@mgt
The key's randomart image is:
+---[RSA 2048]----+
|      .. ..o.    |
|     .  ..oo .   |
|      . + +o.    |
|       * o..=    |
|      o S  +E.  .|
|       o . .o....|
|            +oo*=|
|             *+@X|
|            .=@=@|
+----[SHA256]-----+

[root@mgt]# cd ./ssh
[root@mgt .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

将循环迭代252627,并分别执行ssh-copy-id命令来将公钥复制到

远程主机192.168.31.$i中的root用户下

for i in 25 26 27;do ssh-copy-id root@192.168.31.$i;done

测试每台主机的免密并一定把yes输入一遍

ssh-keygen(每台虚拟机)

虚拟机

mgt:for i in 25 26 27;do ssh-copy-id root@192.168.31.$i;done

master:for i in 24 26 27;do ssh-copy-id root@192.168.31.$i;done

slave1:for i in 24 25 27;do ssh-copy-id root@192.168.31.$i;done

slave2:for i in 24 26 25;do ssh-copy-id root@192.168.31.$i;done

mgt虚拟机需要远程的ip与名

ssh master/slave1/slave2

ssh 192.168.31.25/26/27

master虚拟机需要远程的ip与名

ssh mgt/slave1/slave2

ssh 192.168.31.24/26/27

slave1虚拟机需要远程的ip与名

ssh mgt/master/slave2

ssh 192.168.31.24/25/27

slave2虚拟机需要远程的ip与名

ssh mgt/master/slave1

ssh 192.168.31.24/25/26

ssh master/slave1/slave2   与  ssh 192.168.31.25/26/27

安装mariadb并启动

搭配master配置

 

重启

systemctl restart mariadb

添加用户权限

grant replication slave on *.* to 'myslave'@'192.168.31.%' identified by '123.com';
grant all privileges on *.* to 'mha'@'192.168.31.%' identified by '123.com';
grant all privileges on *.* to 'mha'@'192.168.31.24' identified by '123.com';
grant all privileges on *.* to 'mha'@'192.168.31.26' identified by '123.com';
grant all privileges on *.* to 'mha'@'192.168.31.27' identified by '123.com';

slave1\2服务器进行

vim /etc/my.conf

slave1赋予权限

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.31.%' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.%' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.24' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.25' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.27' identified by '123.com';"

slave2赋予权限

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.31.%' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.%' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.24' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.25' identified by '123.com';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.31.26' identified by '123.com';"

登陆Mysql绑定主

change master to master_host='192.168.31.25',master_user='myslave',master_password='123.com',master_log_file='master-bin.000002',master_log_pos=326;"

slave start;

show slave status\G

master创建数据库测试

create database lwj1;

 slave1/2查看是否存在


MHA安装

所有节点安装perl环境(安装两次更新成统一版本) 

yum install epel-release -y

更新完后安装编译

yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN

所有节点安装node包(如果有包导入进去解压安装)

tar xf mha4mysql-node-0.57.tar.gz

cd mha4mysql-node-0.57

perl Makefile.PL && make && make install

验证看到脚本就可以  原始没脚本

cd /usr/local/ bin

其他虚拟机也安装以上所有


安装manager(只有mgt服务需要)

tar xf mha4mysql-manager-0.57.tar.gz

cd /root/mha4mysql-manager-0.57

perl Makefile.PL && make && make install

编译后复制脚本到usr/local/bin

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

cp sample/scripts/master_ip_online_change     /usr/local/bin/

配置文件建立

mkdir /etc/masterha

vim /etc/masterha/app1.cnf

可以当做日后模板文件
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123.com
ping_interval=1
remote_workdir=/tmp
repl_password=123.com
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.31.26 -s 192.168.31.27
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.31.25
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.31.26
port=3306

[server3]
hostname=192.168.31.27
port=3306

修改master_ip_failover脚本

cd /usr/local/bin

删除 master_ip_failover 自己写入准备好的脚本内容 不然容易报错

vim 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.31.100';								#指定vip的地址
my $brdc = '192.168.31.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.184.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.184.200 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";
}

测试MHA

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

 

masterha_check_repl --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 &
查看命令jobs

此时会master会出现一个ens33:1 192.168.31.100的虚拟地址

停用master后测试

此时可以看到ens33:1跳到了slave1

高可用成功

再次查看/etc/masterha/app1.cnf

此时配置文件已被脚本修改slave1的配置被删除

 

故障恢复

修改app1.cnf启动配置

添加master主机配置信息

分别在slave上重新指定master主机及binlog日志同步信息

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

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

相关文章

IDEA 找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:3.1.2‘

找不到项目 ‘org.springframework.boot:spring-boot-starter-parent:2.6.7’ 这个问题主要是因为ide的缓存导致的&#xff0c;我们直接清理缓存并重启ide 重启之后ide会对pom文件进行编排索引完成之后问题就没有了

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了&#xff0c;因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了&#xff0c;主要是觉得一会儿用鼠标&#xff0c;一会儿键盘&#xff0c;一点儿不酷&#xff0c;我希望可以一直用键盘&#xff0c;抛开鼠标。后面陆续记录一下各个软件的快捷…

STM32CubeMx之esp8266的at指令使用

AT //返回ok则为正常 ATCWMODE1//设置为设备模式 ATCWLAP//搜索附近可用wifi ATCWJAP"CMCC-5-7","chb513029"//连接热点 ATCIPMUX0//设置wifi为单连接 ATCIPSTART"TCP","192.168.37.1",1001//连接tcp 这里遇到了重重问题 这里我…

VScode搭建Opencv(C++开发环境)

VScode配置Opencv 一、 软件版本二 、下载软件2.1 MinGw下载2.2 Cmake下载2.3 Opencv下载 三、编译3.1 cmake-gui3.2 make3.3 install 四、 VScode配置4.1 launch.json4.2 c_cpp_properties.json4.3 tasks.json 五、测试 一、 软件版本 cmake :cmake-3.27.2-windows-x86_64 Mi…

Go framework-Beego

一、Beego Beego用于在Go中快速开发企业应用程序&#xff0c;包括RESTful API、web应用程序和后端服务。 Beego 源码地址 Beego 官方站点 Beego 官方说明 Beego的特性 RESTful支持MVC架构模块化自动API文档注释路由命名空间开发工具集合Full stack for Web & API Bee…

iTOP-2K1000开发板固态硬盘分区

固态硬盘分区的目的是把固态硬盘分成一个分区并格式化为 ext2&#xff0c;在 linux 系统下&#xff0c;分区主要使用的命令是 fdisk 命令。接下来我们一起看下分区操作。 U 盘启动成功以后进到文件系统&#xff0c;输入命令 fdisk -l 查看当前开发板的固态硬盘的节点&#xff…

易服客工作室:UberMenu WordPress插件 - 网站超级菜单插件

UberMenu WordPress插件是一个用户友好、高度可定制、响应迅速的 Mega Menu WordPress 插件。它与 WordPress 3 菜单系统一起开箱即用&#xff0c;易于上手&#xff0c;但功能强大&#xff0c;足以创建高度定制化和创意的大型菜单配置。 网址: UberMenu WordPress插件 - 网站超…

RS485、MODBUS通信协议详解

前言 MODBUS协议是Modicon公司发表的一种串行通信协议&#xff0c;属于OSI模型中应用层的协议&#xff0c;现广泛应用于工业控制领域&#xff0c;它的主要特点是免费开放、支持多种电气接口&#xff08;如RS-232、RS-485&#xff09;&#xff0c;传输介质可以是双绞线、光纤、无…

java-JVM内存区域JVM运行时内存

一. JVM 内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程直接映…

Beats:安装及配置 Metricbeat (一)- 8.x

在我之前的文章&#xff1a; Beats&#xff1a;Beats 入门教程 &#xff08;一&#xff09;Beats&#xff1a;Beats 入门教程 &#xff08;二&#xff09; 我详细描述了如何在 Elastic Stack 7.x 安装及配置 Beats。在那里的安装&#xff0c;它通常不带有安全及 Elasticsearc…

机器视觉基础实验-Panorama Stitching

文章目录 1、实验内容2、实验设计&#xff08;略&#xff09;3、实验环境及实验数据集四、实验过程及结果4.1 Harris角点检测器寻找关键点4.2 构建描述算子来描述图中的每个关键点&#xff0c;比较两幅图像的两组描述子&#xff0c;并进行匹配。4.3 根据一组匹配关键点&#xf…

Nginx的安装及负载均衡搭建

一.Nginx的安装 1&#xff09;准备安装环境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一个Perl库&#xff0c;包括 perl 兼容的正则表达式库。 nginx的http模块使用pcre来解…

每天一练:SpringBoot连接mq

目录 每天一练:Springboot连接rabbitmq 每天一练:Springboot连接rabbitmq 目录一、部署Rabbitmq&#xff1f;二、增加maven依赖三、连接RabbitMq四、发布和订阅消息总结 一、部署Rabbitmq&#xff1f; 这里rabbitmq采用docker安装部署。 拉取docker镜像 [root192 ~]# docker…

349. 两个数组的交集 题解

题目描述&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 方法一&#xff1a; 解题思路&#xff1a; 我们可以…

《零基础7天入门Arduino物联网-04》电路基础知识上

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 直流电与交流电 直流电&#xff08;DC&#xff09; 是指电流的方向始终保持不变的电流。这意味着…

Hyperledger Fabric的使用及开发

Hyperledger Fabric是Linux基金会发起的一种跨行业的区块链技术&#xff0c;目前在多家大型公司有着应用&#xff0c;这里就不多做HF本身的介绍了&#xff0c;有兴趣可关注其官网。 1. 准备工作&#xff1a; 开始前需要一定的准备工作&#xff0c;安装各类中间件&#xff1a;…

JVM——HotSpot的算法细节实现

一、根节点枚举 固定可作为GC Roots的节点主要在全局性的引用&#xff08;如常量或类静态属性&#xff09;与执行上下文&#xff08;如栈帧中的本地变量表&#xff09;中&#xff0c;尽管目标明确&#xff0c;但查找要做到高效很难。现在java应用越来越庞大&#xff0c;光方法区…

啥是虚拟机

虚拟机这个概念第一次听到还是在我大二学计算机网络做实验的时候听说过&#xff0c;第二次算比较熟练地使用应该是在大三下学期的大数据课程&#xff0c;做实验的时候也算是学到了许多Linux的命令。但到底什么是虚拟机&#xff0c;我还是搞不清楚的&#xff0c;所以&#xff0c…

【八股】2023秋招八股复习笔记1(CSBase+部分WXG题)

文章目录 MYSQL & redis网络 & 系统安全 & C招聘要求&#xff08;x3&#xff09;部分面经和题目&#xff08;WXG-后端&#xff09;&#xff08;x5&#xff09; MYSQL & redis redis&#xff1a;memcached/mysql&#xff0c;线程模型&#xff08;6.0多线程&…

css实现div内文字自动滚动

网上找了好久&#xff0c;终于找到了个能实现的&#xff0c;把它整理一下。 需求&#xff1a;表格内字体过长实现自动滚动 实现思路如下&#xff1a; html&#xff1a; <div class"item-column" style"background: rgb(12, 87, 154); width: 18%; height: 6…