Mariadb高可用(四十)

目录

一、概述

(一)概念

(二)组成

(三)特点

(四)工作原理

二、实验要求

三、构建MHA

(一)ssh免密登录

(二)安装mariadb数据库并启动

1、配置 master 机器

2、配置 slave1 机器

3、配置 slave2 机器

4、分别重启服务和设置开机自启

5、分别赋予权限

6、启动从数据库,进行主从数据库同步

6.1、进入数据库

6.2、停止从库

6.3、进行数据同步

(三)MHA安装

(四)停用master的mariadb服务

(五)故障恢复


一、概述

(一)概念

    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进行复制

二、实验

(一)实验介绍

1、实验环境

manager、monitor、master和slave

IP地址搭建主机名
192.168.11.111/24

manager节点     monitor

mgt( managerment )
192.168.11.112/24node节点            mastermaster
192.168.11.113/24node节点             slaveslave1
192.168.11.114/24node节点             slaveslave2

2、实验拓补图

3、实验介绍

       本实验要求通过 MHA 监控 MySQL 数据库在master故障时进行自动切换到master salve,不影响业务。 

4、配置过程

4.1、配置 MySQL 一主两从

4.2、安装 MHA 软件

4.3、配置无密码认证

4.4、配置 MySQL MHA 高可用

4.5、模拟 master 故障切换

(二)实验基础配置

关闭防火墙、关闭SELinux、关闭图形化网络、配置静态IP地址

1、配置各台主机的主机名

hostnamectl set-hostname mgt
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2

2、刷新主机命令

bash

3、分别为四台虚拟机添加本地缓存

vim /etc/hosts

 内容:

192.168.11.111 mgt
192.168.11.112 master
192.168.11.113 slave1
192.168.11.114 slave2

scp /etc/hosts 192.168.11.113:/etc/
scp /etc/hosts 192.168.11.113:/etc/
scp /etc/hosts 192.168.11.114:/etc/

三、构建MHA

(一)ssh免密登录

mgt 端 192.168.11.111 需进行的操作

ssh-keygen

ssh-copy-id mgt

 查看是否创建成功

       注:余下三台机器均将生成密钥对上传至192.168.11.111服务端上,而后进行密钥文件回传,保证互为免密登录

master端 192.168.11.112 需进行的操作

ssh-keygen
ssh-copy-id mgt

slave1 端 192.168.11.113 需进行的操作

ssh-keygen
ssh-copy-id mgt

slave2 端 192.168.11.114 需进行的操作

ssh-keygen
ssh-copy-id mgt

 此时我们去IP地址为111的服务端查看密钥对是否接收到

将生成的密钥文件分别在四台机器上进行一次互传

for i in 2 3 4;do scp /root/.ssh/authorized_keys  root@192.168.11.11$i:/root/.ssh/;done

 

 

       注:此时需要在四台主机上分别进行一次免密登录,从而避免后续使用脚本时发生故障问题。(包括自己本身也需进行一次免密登录)

 这里演示一台机器,其余机器同理

(二)安装mariadb数据库并启动

yum install -y mariadb mariadb-server

 启动服务

systemctl start mariadb

 配置流程

1、配置 master 机器

vim /etc/my.cnf

插入内容: 

server-id = 20
log-bin = master-bin
log-slave-updates = true

2、配置 slave1 机器

vim /etc/my.cnf

插入内容: 

server-id=30
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

3、配置 slave2 机器

vim /etc/my.cnf

插入内容: 

server-id=40
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

4、分别重启服务和设置开机自启

systemctl restart mariadb
systemctl enable mariadb

5、分别赋予权限

master端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"

 注:本来只需赋予第一条命令即可使用,为了防止出现异常,指定后续三个ip段。

slave1端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"

slave2端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"

6、启动从数据库,进行主从数据库同步

6.1、进入数据库

mysql

6.2、停止从库

stop slave;
exit

6.3、进行数据同步

主库查看文件编号,pos值

mysql -e "show master status;"

 从库输入命令:(两个从库都是一样的)

mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1159;"

 分别进入两个从库启动slave

mysql

 进入MySQL数据库

start slave;

 启动从服务

show slave status\G;
exit

查看状态

 主库创建数据库,从库进行查看

mysql -e "create database zn;"

 从:(两个从数据库都是一样的命令,在此不过多追述)

mysql -e "show databases;"

 

 此时基本的主从复制已经搭建完成

(三)MHA安装

    所有节点安装perl环境(使用此命令两次,升级到最新的epel源)

yum install -y epel-release

     下载后续使用安装包缺失的依赖

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

node节点

node节点是计算机网络中的一个设备或主机

        所有节点安装node

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

  在一台机器上远程将tar包传给其余三台机器 

for i in master slave1 slave2;do scp mha4mysql-node-0.57.tar.gz $i:/root/;done

步骤同上,进行安装 

  验证:看到脚本就OK

cd /usr/local/bin
ls

    manager

tar xf mha4mysql-manager-0.57.tar.gz
cd /root/mha4mysql-manager-0.57
perl Makefile.PL && make && make install

cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_failover /usr/local/bin/
cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change /usr/local/bin/

        脚本说明

cd /root/mha4mysql-manager-0.57/samples/scripts

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

            master_ip_online_change    在线切换时 vip 的管理

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

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

 注:master_ip_failover安装包自带的配置文件有问题,脚本没有写全,需重新进行编辑

这里使用以下命令将其备份

mv master_ip_failover master_ip_failover_bak

然后创建新的文件,并赋予权限

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

赋予权限:

chmod 755 master_ip_failover
ll

        创建配置文件

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=manager
[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=123123
ping_interval=1
remote_workdir=/tmp
repl_password=123123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.11.113 -s 192.168.11.114
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=192.168.11.112
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.11.113
port=3306[server3]
hostname=192.168.11.114
port=3306

文件内容解析: 

  • manager_log:MHA管理器的日志文件路径。
  • manager_workdir:MHA管理器的工作目录。
  • master_binlog_dir:MySQL主服务器的二进制日志目录。
  • master_ip_failover_script:用于执行IP故障切换的脚本路径。
  • master_ip_online_change_script:用于执行在线IP更改的脚本路径。
  • password:MySQL的密码。
  • ping_interval:MHA管理器检测服务器存活状态的时间间隔。
  • remote_workdir:远程主机的工作目录。
  • repl_password:复制用户的密码。
  • repl_user:复制用户的用户名。
  • secondary_check_script:用于检查从服务器的脚本路径。
  • shutdown_script:关机时执行的脚本路径。
  • ssh_user:用于通过SSH连接到服务器的用户名。
  • user:MHA管理器的用户名。

接下来是每个服务器的具体配置:

  • server1:主服务器的配置。

  • hostname:服务器的主机名或IP地址。

  • port:MySQL服务的端口号。

  • server2:备选主服务器的配置。

  • candidate_master:指示该服务器是否可以成为主服务器的标志。1表示是,0表示否。

  • check_repl_delay:检查复制延迟的时间(以秒为单位)。

  • server3:从服务器的配置。

  • hostname:服务器的主机名或IP地址。

  • port:MySQL服务的端口号。

 

mkdir /var/log/masterha/app1 -p

        测试MHA

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

 显示ok即为成功,没有错误

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 &

 命令解析:

  • nohup: 这是一个命令,用于在后台运行指定的命令,并忽略挂起信号。这意味着即使关闭终端也不会停止该进程。
  • masterha_manager: 这是要运行的命令或可执行文件的名称,即masterha_manager。
  • --conf=/etc/masterha/app1.cnf: 这是指定masterha_manager的配置文件路径和名称。
  • --remove_dead_master_conf: 这是masterha_manager的一个选项,用于在故障转移后自动删除已死亡主节点的配置。
  • --ignore_last_failover: 这是masterha_manager的一个选项,用于忽略最后一次故障转移。
  • < /dev/null: 这是将空设备/dev/null作为masterha_manager的输入。这意味着不会从标准输入读取任何输入。
  • > /var/log/masterha/app1/manager.log: 这是将masterha_manager的输出重定向到指定的日志文件,即/var/log/masterha/app1/manager.log。
  • 2>&1: 这是将标准错误输出也重定向到与标准输出相同的位置,即将错误信息写入到manager.log中。
  • &: 这是一个特殊符号,表示将命令放入后台运行。

因此,这段命令的意思是以后台模式运行masterha_manager,并将其输出重定向到指定的日志文件中。同时,还忽略了最后一次故障转移的记录,自动删除已死亡主节点的配置,并且不从标准输入读取任何输入。

  查看

jobs

         启动时masterIP异常

            需要工程手动配置VIP

(四)停用master的mariadb服务,模拟故障

systemctl stop mariadb

 在slave1里查看

ip a

  注:服务在完成以后自动回掉,此时需手动重启

停止命令

jobs
fg 1

将后台进程掉到前台,ctrl+c进行打断即可 

(五)故障恢复

在停掉master以后,配置文件中内容回消失

vim /etc/masterha/app1.cnf 

     修改app1.cnf启动配置,添加master主机配置信息

将内容添加进去即可

[server1]
hostname=192.168.11.112
port=3306

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

master 端进行操作

启动服务

systemctl start mariadb

进入数据库

mysql

 停止从库

stop slave;
exit

 查看状态

mysql -e "show master status;"

 slave1 、2端进行操作

重启服务

systemctl restart mariadb

进入数据库 

mysql

停止从服务 

stop slave;
exit

同步数据

mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000003',master_log_pos=245;"

分别从两个从库进入数据库

mysql

启动 

start slave;

查看状态并退出 

show slave status\G;
exit

 主库创建内容

mysql -e "create database zm;"

从库进行查看

mysql -e "show databases;"

这样可以看到主从复制又恢复原有了

注:但是有一点需要注意,在恢复完毕后,在主的机器上还是看不见设置的虚IP地址。如果想看见的话,就关闭主的服务,然后去从上进行查看!!!感觉不是很灵活的样子,做完还得重新进行配置然后再给改回来,然后还是看不见。。。陷入了俄罗斯套娃。。。。 

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

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

相关文章

android framework之Applicataion启动流程分析(三)

现在再回顾一下Application的启动流程&#xff0c;总的来说&#xff0c;虽然进程的发起是由ATMS服务发起的&#xff0c;但是进程的启动还是由AMS负责&#xff0c;所以需要调用AMS的startProcess()接口完成进程启动流程&#xff0c;AMS要处理的事情很多&#xff0c;它将事务交给…

解读亚马逊云科技语义搜图检索方案

图像检索&#xff08;包括文搜图和图搜图&#xff09;是各个行业中常见的一个应用场景。比如在电商场景中&#xff0c;基于以图搜图做相似商品查找&#xff1b;在云相册场景中&#xff0c;基于文搜图来找寻所需的图像素材。 传统基于标签的图像检索方式&#xff0c;即先使用目标…

【Linux】JumpServer 堡垒机远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

7.react useReducer使用与常见问题

useReducer函数 1. useState的替代方案.接收一个(state, action)>newState的reducer, 并返回当前的state以及与其配套的dispatch方法2. 在某些场景下,useReducer会比useState更加适用,例如state逻辑较为复杂, 且**包含多个子值**,或者下一个state依赖于之前的state等清楚us…

Cmake qt ,vtkDataArray.cxx.obj: File too big

解决方法&#xff1a; Qt4 在pro 加入“QMAKE_CXXFLAGS -BigObj” 可以解决 Qt5 在网上用“-Wa,-mbig-obj” 不能解决&#xff0c;最后通过“QMAKE_CXXFLAGS -Ofast -flto”解决问题。 Qt4 在pro 加入“QMAKE_CXXFLAGS -BigObj” 可以解决Qt5 在网上用“-Wa,-mbig-obj” …

数据集收集列表(opencv,机器学习,深度学习)持续更新

opencv 车牌识别数据集 opencv 手写数字识别数据集 机器学习 印第安糖尿病 Pima Indians数据集 &#xff0c;下载地址 Boston波士顿房价数据集 &#xff0c;下载

Win 教程 Win7实现隔空投送

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

基于Matlab实现频谱分析(附上源码+数据集)

Matlab是一个功能强大的数值计算和科学计算软件&#xff0c;可以用于频谱分析。频谱分析是一种信号处理技术&#xff0c;用于将时域信号转换为频域信号&#xff0c;以便更好地理解信号的频率特性。本文将介绍使用Matlab实现频谱分析的方法。 文章目录 部分源码完整源码数据集下…

植物根系基因组与数据分析

1.背景 这段内容主要是关于植物对干旱胁迫的反应&#xff0c;并介绍了生活在植物体内外以及根际的真菌和细菌的作用。然而&#xff0c;目前对这些真菌和细菌的稳定性了解甚少。作者通过调查微生物群落组成和微生物相关性的方法&#xff0c;对农业系统中真菌和细菌对干旱的抗性…

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了&#xff0c;全程只需要一部手机&#xff0c;就能完成24小时直播带货&#xff0c;不需要真人出镜&#xff0c;不需要场地&#xff0c;不需要搭建直播间&#xff0c;只需要一部手机就可以了。真人语音讲解&#xff0c;真人智能回复&#xff0c;实…

力扣:随即指针138. 复制带随机指针的链表

复制带随机指针的链表 OJ链接 分析&#xff1a; 该题的大致题意就是有一个带随机指针的链表&#xff0c;复制这个链表但是不能指向原链表的节点&#xff0c;所以每一个节点都要复制一遍 大神思路&#xff1a; ps:我是学来的 上代码&#xff1a; struct Node* copyRandomList(s…

不同路径【动态规划】

不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f;…