前提准备

一套 k8s 集群

worker 节点上的 /nfs/data 目录挂载到磁盘

一、NFS 高可用方案(NFS+keepalived+Sersync)

        本方案 NFS 的高可用方案,应用服务器为 Client ,两台文件服务器分别 Master 和 Slave,使用 keepalived 生成一个虚拟 IP,使用 Sersync 进行 Master 与 Slave 之间文件相互同步,确保高可用。

安装前准备

角色系统版本IP

虚拟 ip(Vip)

192.168.32.116

Client

CentOS Linux 8192.168.32.50

Master

CentOS Linux 8192.168.32.30
SlaveCentOS Linux 8192.168.32.40
  • 在 Master 和 Slave 上创建共享目录

mkdir /nfs/data
chmod 777 -R /nfs/data
  • 在 Client 上创建挂载目录

mkdir /qiyuesuodata
  • 关闭 Client 、Master 和 Slave 服务器上的防火墙

# 关闭防火墙
systemctl stop firewalld# 关闭开机自启
systemctl disable firewalld
  • 在 Client 、Master 和 Slave 服务器上安装 NFS 服务

yum -y install nfs-utils rpcbind
  • 配置 NFS 共享目录

在 Master、Slave 上执行

# 其中/data 为共享的目录,192.168.32.50 为 Client ip,如有多个私有云服务集群可用空格分隔
# 如 echo '/nfs/data 192.168.32.50(rw,sync,all_squash) 192.168.32.40(rw,sync,all_squash)' >> /etc/exportsecho '/nfs/data 192.168.32.50(rw,sync,all_squash) 192.168.32.40(rw,sync,all_squash) 192.168.32.30(rw,sync,all_squash) 192.168.32.20(rw,sync,all_squash) 192.168.32.10(rw,sync,all_squash)' >> /etc/exports# 开启服务systemctl start rpcbind && systemctl start nfs-server.service# 设置开机自启systemctl enable rpcbind && systemctl enable nfs-server.service# 出现:Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.即成功
  • 在 Client 上执行挂载测试

# 测试 Master 
# 其中 ip 为 Master 的 ip,/nfs/data为 Master 共享的目录,/qiyuesuodata 为需要挂载至 Client 的目录mount -t nfs 192.168.32.30:/nfs/data /qiyuesuodata
# 检查 
df -Th 
# 出现  192.168.32.30:/nfs/data      nfs4       29G  7.6G   22G  27% /qiyuesuodata 即为成功
# 去除挂载
umount /qiyuesuodata# 测试 Slave
# 其中 ip 为 Slave 的 ip,/nfs/data为 Slave 共享的目录,/qiyuesuodata 为需要挂载至 Client 的目录mount -t nfs 192.168.32.40:/nfs/data /qiyuesuodata
# 检查 
df -Th 
# 出现  192.168.32.40:/nfs/data      nfs4       29G  7.6G   22G  27% /qiyuesuodata 即为成功
# 去除挂载
umount /qiyuesuodata
  • 在 Slave 进行同步 Master 数据

# 安装 rsync
yum -y install rsync.x86_64# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /nfs/data
auth users = data
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.32.30# 生成认证文件
echo 'data:data123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass# 修改 文件夹权限
groupadd nfsnobody
useradd -g nfsnobody nfsnobody
chown -R nfsnobody:nfsnobody /data/# 启动服务rsync --daemon --config=/etc/rsyncd.conf 
  • 在 Master 上测试

yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /nfs/data/
echo "data123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass# 创建测试文件,测试推送
cd /nfs/data/
echo "This is test file" > file.txt
rsync -arv /nfs/data/ data@192.168.32.30::data --password-file=/etc/rsync.pass# 在 slave 上测试
ls /nfs/data # 出现 file.txt 即可
  • 在 Master 上配置自动同步

cd /usr/local/wget https://dl.qiyuesuo.com/private/nfs/sersync2.5.4_64bit_binary_stable_final.tar.gztar xvf sersync2.5.4_64bit_binary_stable_final.tar.gzmv GNU-Linux-x86/ sersynccd sersync/# 修改配置文件
sed -ri 's#<delete start="true"/>#<delete start="false"/>#g' confxml.xmlsed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/nfs/data">#g' confxml.xmlsed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.32.30" name="data"/>#g' confxml.xmlsed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xmlsed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="data" passwordfile="/etc/rsync.pass"/>#g' confxml.xmlsed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml#启动Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
  • 测试

# 在 master 中的/nfs/data 目录创建文件
touch test
# 查看 salve 中的 /nfs/data 是否有该文件

以上就做完了 salve 同步 master 的文件,但是当 master 宕机后恢复,master 无法同步 salve 文件,所以要配置 master 同步 salve 文件

  • 在 Master 进行同步 slave 数据

# 安装 rsync
yum -y install rsync.x86_64# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 slave ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /nfs/data
auth users = data
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.32.40# 生成认证文件
echo 'data:data123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass# 修改 文件夹权限
groupadd nfsnobody
useradd -g nfsnobody nfsnobody
chown -R nfsnobody:nfsnobody /data/# 启动服务rsync --daemon --config=/etc/rsyncd.conf 
  • 在 Slave 上测试

yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /nfs/data/
echo "data123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass# 创建测试文件,测试推送
cd /nfs/data/
echo "This is test file" > test.txt
rsync -arv /nfs/data/ data@192.168.32.40::data --password-file=/etc/rsync.pass# 在 master 上测试
ls /nfs/data # 出现 test.txt 即可
  • 在 Slave 上配置自动同步

# 安装 rsync
yum -y install rsync.x86_64# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /nfs/data
auth users = data
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.32.30# 生成认证文件
echo 'data:data123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass# 修改 文件夹权限
groupadd nfsnobody
useradd -g nfsnobody nfsnobody
chown -R nfsnobody:nfsnobody /data/# 启动服务rsync --daemon --config=/etc/rsyncd.conf 

至此我们已经做好了主从相互同步的操作

  • 安装 Keepalived

在 Master 上执行

yum -y install keepalived.x86_64
# 修改 /etc/keepalived/keepalived.conf
# 其中 ens192 为绑定网卡名称,可以使用 ip addr 命令查看
# 其中 192.168.32.116  为虚拟 ip ,注意不要和其它 ip 冲突global_defs {router_id master   # 一般是主机名称,通过hostname获取  
}#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {script "killall -0 mysqld"  # 检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用interval 2weight -30fall 5rise 5
}# 定义主机信息
vrrp_instance VI_1 {state MASTER  # 主机填写MASTERinterface ens192  # 设置实例绑定的网卡garp_master_delay 1virtual_router_id 10  # 虚拟路由器id号。主从必须一致priority 100  # 定义优先级,数字越大,优先级越高 advert_int 1  # 心跳频率unicast_src_ip 192.168.32.30 # 本机ip
unicast_peer {192.168.32.40 # 对端ip
}authentication {auth_type PASSauth_pass zuanlan1437xi
}
virtual_ipaddress {#192.168.112.210 dev ens33 label ens33:0192.168.32.116  # 虚拟 ip(vip)
}#执行上面定义的脚本
track_script {chk_mysql
}
}# 启动服务
systemctl start  keepalived.service && systemctl enable keepalived.service

在 Slave 上执行

global_defs {router_id salve   # 一般是主机名称,通过hostname获取
}#定义脚本。固定间隔时间执行
vrrp_script chk_mysql {script "killall -0 mysqld"  # 检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用interval 2weight -30fall 5rise 5
}# 定义主机信息
vrrp_instance VI_1 {state BACKUP  # 主机填写MASTERinterface ens192  # 设置实例绑定的网卡garp_master_delay 1virtual_router_id 10  # 虚拟路由器id号。主从必须一致priority 90  # 定义优先级,数字越大,优先级越高advert_int 1  # 心跳频率unicast_src_ip 192.168.32.40 # 本机ip
unicast_peer {192.168.32.30 # 对端ip
}authentication {auth_type PASSauth_pass zuanlan1437xi
}
virtual_ipaddress {#192.168.112.210 dev ens33 label ens33:0192.168.32.116  # 虚拟 ip(vip)
}#执行上面定义的脚本
track_script {chk_mysql
}
}# 启动服务
systemctl start  keepalived.service && systemctl enable keepalived.service
  • 在 Master 上执行 查看 vip 

ip a | grep  ens
# 出现
# inet 192.168.32.116/32 scope global enp0s3
# 即成功
  • vip 漂移、抢占 测试

# 关闭 master 上的 keepalive 服务
systemctl stop keepalived# 在 salve 上查看 vip
ip a | grep ens
出现 32.116 即为漂移成功# 测试抢占模式,启动 master 上的 keepalive 服务
systemctl start keepalive# 查看 vip 是否回到本机
ip a | grep ens
出现 32.116 即为抢占成功
  • VIP 挂载测试,在 Client 上通过 vip 挂载测试

mount -t nfs 192.168.32.116:/nfs/data /qiyuesuodata# 如 /qiyuesuodata 目录中有共享目录中文件则说明挂载成功
umount /qiyuesuodata/
  • 设置 keepalived 脚本

        因为 ip 的漂移是根据 keepalived 的存活来判断的,所以在 nfs 宕机之后需要手动停止 keepalived 服务来进行 ip 的切换,这里在 Master 上编写一个定时任务来检测 nfs 服务是否宕机

cd /usr/local/sbin
# 生成文件check_nfs.sh
#!/bin/sh
# 每秒执行一次
step=1 #间隔的秒数,不能大于60 
for (( i = 0; i < 60; i=(i+step) )); do ###检查nfs可用性:进程和是否能够挂载/sbin/service nfs status &>/dev/nullif [ $? -ne 0 ];then###如果服务状态不正常,先尝试重启服务/sbin/service nfs restart/sbin/service nfs status &>/dev/nullif [ $? -ne 0 ];then# 如服务仍不正常,停止 keepalivedsystemctl stop keepalived.servicefifisleep $step 
done 
  • 加入定时任务

chmod 777 /usr/local/sbin/check_nfs.sh
crontab -e
# 输入定时任务
* * * * *  /usr/local/sbin/check_nfs.sh &> /dev/null
  • 在 Client 添加定时任务,当 Master 宕机时进行重新挂载

cd /usr/local/sbin
# 生成文件check_mount.sh#!/bin/sh
# 每秒执行一次
step=1 #间隔的秒数,不能大于60 
for (( i = 0; i < 60; i=(i+step) )); do mount=`df -Th|grep qiyuesuodata`if [ $mount = "" ];thenumount /qiyuesuodatamount mount -t nfs 192.168.32.116:/data /qiyuesuodatafisleep $step 
done 
  • 加入定时任务

chmod 777 /usr/local/sbin/check_mount.sh
crontab -e
# 输入定时任务
* * * * *  /usr/local/sbin/check_nfs.sh &> /dev/null

未完待续。。。

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

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

相关文章

BI 系统数据看板全解析:让数据可视化驱动业务决策

BI 系统数据看板全解析&#xff1a;让数据可视化驱动业务决策在 BI 系统中&#xff0c;数据看板是连接原始数据与业务洞察的 “桥梁”。它将零散的业务指标转化为直观的可视化图表&#xff0c;让产品经理、运营人员等角色能快速把握业务动态。一个设计精良的数据看板&#xff0…

图机器学习(14)——社交网络分析

图机器学习&#xff08;14&#xff09;——社交网络分析0. 前言1. 数据集分析1.1 数据集介绍1.2 使用 networkx 加载数据集2. 网络拓扑和社区检测2.1 网络拓扑2.2 社区检测0. 前言 社交网站的崛起是近年来数字媒体领域最活跃的发展趋势之一&#xff0c;数字社交互动已经融入人…

深入解析Hadoop MapReduce中Reduce阶段排序的必要性

MapReduce概述与Reduce阶段简介MapReduce作为Hadoop生态系统的核心计算框架&#xff0c;其设计思想源自Google论文&#xff0c;通过"分而治之"的理念实现海量数据的并行处理。该模型将计算过程抽象为两个关键阶段&#xff1a;Map阶段负责数据分解和初步处理&#xff…

7月23日华为机考真题第二题-200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ bishipass.com 02. 图书馆资源分配系统 问题描述 A先生是一位图书馆管理员,负责管理图书采购和分配工作。图书馆收到了来自不同出版社的图书批次,同时有多位读者代表排队申请图书…

基于深度学习的图像分类:使用ResNet实现高效分类

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…

JVM:工具

JVMjpsjstatjmapjhatjstackjconsolejvisualvmjps jps&#xff08; Java Virtual Machine Process Status Tool &#xff09;&#xff0c;是 JDK 中的一个命令行工具&#xff0c;用于列出当前正在运行的 JVM 实例的信息。其对于监控和管理运行在多个 JVM 上的 Java 应用程序特别…

Elasticsearch Circuit Breaker 全面解析与最佳实践

一、Circuit Breaker 简介 Elasticsearch 是基于 JVM 的搜索引擎&#xff0c;其内存管理十分重要。为了避免单个操作或查询耗费过多内存导致节点不可用&#xff0c;Elasticsearch 引入了 Circuit Breaker&#xff08;熔断器&#xff09;机制。当内存使用达到熔断器预设阈值时&a…

ARM-定时器-定时器函数封装配置

以TIMER7为例&#xff0c;对定时器函数进行封装注意事项&#xff1a;GD32中TIMER7是高级定时器&#xff0c;相关详细请参考上一篇文章。main.c//main.c#include "gd32f4xx.h" #include "systick.h" #include <stdio.h> #include "main.h" …

【日志】unity俄罗斯方块——边界限制检测

Bug修复记录 项目场景 尝试使用Unity独自制作俄罗斯方块&#xff08;也许很没有必要&#xff0c;网上随便一搜就有教程&#xff09; 问题描述 俄罗斯方块的边缘检测出错了&#xff0c;对方块进行旋转后&#xff0c;无法到达最左侧或者最下侧的位置&#xff0c;以及其他问题。演…

C++ string:准 STL Container

历史STL 最初是一套独立的泛型库&#xff08;Alexander Stepanov 等人贡献&#xff09;&#xff0c;后来被吸纳进 C 标准库&#xff1b;std::basic_string 则是早期 C 标准&#xff08;Cfront / ARM 时代&#xff09;就存在的“字符串类”&#xff0c;并非 STL 原生物。std::st…

Golang学习笔记--语言入门【Go-暑假学习笔记】

目录 基础语法部分相关概念 基础语法部分概念详解 可见性 导包 内部包 运算符 转义字符 函数 风格 函数花括号换行 代码缩进 代码间隔 花括号省略 三元表达式 数据类型部分相关概念 数据类型部分概念详解 布尔类型 整型 浮点型 复数类型 字符类型 派生类型…

linux中kill 命令使用详解

在Linux系统里&#xff0c;kill命令的主要功能是向进程发送信号&#xff0c;以此来控制进程的运行状态。下面为你详细介绍它的使用方法&#xff1a; 基础语法 kill [选项] [进程ID]进程ID也就是PID&#xff0c;可通过ps、pgrep或者top等命令来获取。 常用信号及其含义 信号可以…

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器 一、Nginx安装 1. 安装依赖项 sudo yum groupinstall "Development Tools" -y # 非必须 sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2.下载Nginx wget http://n…

写个 flask todo app,简洁,实用

- 此项目虽然看起来简单&#xff0c;实际上&#xff0c;修改成自己喜欢的样子&#xff0c;也是费时间的。 - 别人都搞AI 相关的项目&#xff0c;而我还是搞这种基础的东西。不要灰心。 - 积累。不论项目大小&#xff0c;不论难易&#xff0c;只看是否有用。项目地址&#xff1a…

4麦 360度定位

要在 ESP32 上用 4 个麦克风实现 360 声源定位&#xff0c;通常思路是通过 时延估计&#xff08;TDOA&#xff09; 几何计算&#xff0c;核心流程&#xff1a;阵列布置将 4 个麦克风等间距布置成正方形&#xff08;或圆形&#xff09;。记阵列中心为原点&#xff0c;麦克风编号…

使用yolov10模型检测视频中出现的行人,并保存为图片

一、使用yolov10模型检测视频中出现的行人&#xff0c;并保存为图片&#xff0c;detect_person.py代码如下&#xff1a;from ultralytics import YOLOv10 import glob import os import cv2 import argparsedef detect_person(videoPath, savePath):if not os.path.exists(save…

现在希望用git将本地文件crawler目录下的文件更新到远程仓库指定crawler目录下,命名相同的文件本地文件将其覆盖

git checkout main git pull origin main $source “D:\黑马大数据学习\crawler” $dest Join-Path (Get-Location) “crawler” if (-not (Test-Path $dest)) { New-Item -ItemType Directory -Path $dest | Out-Null } Copy-Item -Path $source* -Destination $dest -Recur…

网络调制技术对比表

&#x1f4ca; 网络调制技术全维度对比表​调制技术​​简称​​频谱效率​​抗噪性​​功率效率​​复杂度​​关键特性​​典型应用场景​​幅度键控​ASK低差高低/低电路简单&#xff0c;易受干扰遥控器、光通信(OOK)​频移键控​FSK低-中中中中/中抗噪较好&#xff0c;频谱…

优化 Elasticsearch JVM 参数配置指南

一、概述 Elasticsearch 是基于 JVM 的搜索和分析引擎。JVM 参数的合理配置直接影响着 Elasticsearch 的性能和稳定性。尽管 Elasticsearch 已经提供了默认的 JVM 设置&#xff0c;但在某些特定场景下&#xff0c;我们可能需要进行适当的调整和优化。 本文将详细讲述如何安全、…

Python, Go 开发如何进入心流状态APP

要开发一款基于Python和Go语言、帮助用户进入“心流”状态&#xff08;高度专注、高效愉悦的心理状态&#xff09;的应用&#xff0c;需结合两种语言的技术优势&#xff08;Go的高并发与性能、Python的灵活性与AI生态&#xff09;及心流触发机制&#xff08;清晰目标、即时反馈…