nfs高可用部署

news2024/11/26 11:54:56

一、前言

     为了避免nfs单点问题导致的服务不可用,使用以下架构实现nfs的高可用,keepalived+inotify+rsync+nfs,keepalived实现nfs的高可用,inotify持续监控nfs数据目录的变化,发生变化后通过rsync进行同步到备节点,这里使用两台主机实现nfs高可用

主机信息

ip服务
10.1.60.22nfs、rsync、inotify、keepalived
10.1.60.23nfs、rsync、inotify、keepalived
10.1.60.6vip

二、部署

   nfs部署参考:nfs部署-CSDN博客

   部署rsync和inotify服务 (主备节点都需要安装)

  yum -y install rsync inotify-tools

   编辑rsync配置文件(主节点)

  vi  /etc/rsyncd.conf

uid = root
gid = root
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[master_nfs]
path = /share                 #同步的路径
auth users = rsync             #同步用户
comment = master_nfs
read only = no
list = no
secrets file = /etc/rsyncd.passwd  #存储同步所用的用户名和密码
hosts allow = 10.1.60.0/24        #允许同步的网段

   备用节点的配置文件编辑和主节点有点不一样

   vi /etc/rsyncd.conf       #备用节点

uid = root
gid = root
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[slave_nfs]       #更改备用节点的模块名称
path = /share
auth users = rsync
comment = slave_nfs   #更改备用节点的模块名称
read only = no
list = no
secrets file = /etc/rsyncd.passwd
hosts allow = 10.1.60.0/24

编辑rsync的用户名密码     #以下操作主备节点都要配置

vi /etc/rsyncd.passwd

rsync:12345678

编辑rsync同步时调用的密码文件,在执行同步操作时不用手动输入密码,调用该文件即可

vi /opt/rsyncd.passwd     

12345678

设置两个文件的权限,必须时600,不然会报错   

chmod 600 /etc/rsyncd.passwd

chmod 600 /opt/rsyncd.passwd

启动rsync服务

systemctl start rsyncd && systemctl enable rsyncd

检测rsync服务是否启动

ps -ef |grep rsync

 使用nfs共享目录测试rsync功能是否正常同步  #在主节点执行

创建目录

mkdir /share/123

同步测试

rsync -avzp --delete /share/ rsync@10.1.60.23::slave_nfs --password-file=/opt/rsyncd.passwd

-a:归档模式。保留权限、所有者、时间戳,并递归地复制目录。

-v:详细模式。增加传输过程中显示的信息。

-z:在传输过程中压缩数据,以减少网络使用。

-p:保留源文件的权限。

--delete:该选项确保目标(目标)上不存在于源中的文件将被删除。这有助于保持目标与源的同步

/share/:将该目录下的文件同步过去

slave_nfs:调用23主机的rsync服务配置的模块

--password-file:使用密码文件进行用户身份验证,即使用rsync用户访问23主机rsync服务的密码

在备节点查看是否存在123目录

 

 使用rsync+inotify进行自动同步配置

创建脚本存放目录    #主备节点均需执行

mkdir /opt/nfs-rsync && cd /opt/nfs-rsync

主节点脚本文件配置

配置自动检测目录文件变化并进行同步的脚本,该脚本是个死循环脚本,所以会一直执行持续进行目录的检测和同步

vi rsync-inotify.sh

#!/bin/bash
host=10.1.60.23     #同步到的主机
src=/share/         #需要同步过去的目录
des=slave_nfs       #使用的模块
password=/opt/rsyncd.passwd    #用户的密码文件
user=rsync             #同步使用的用户
inotifywait=/usr/bin/inotifywait     #检测目录文件变化的服务

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \     #检测目录文件变化的命令
| while read files ;do           #循环检测目录文件是否发生变换
 rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des  #同步命令
 echo "${files} was rsynced" >>/opt/nfs-rsync/rsync.log 2>&1
done

配置检测vip是否存在当前节点来判断是否执行同步脚本

vi vip-monitor.sh

#!/bin/bash
vip_status=`ip add |grep 10.1.60.6|wc -l`   #检测vip是否存活
inotify_status=`ps -ef |grep inotifywait|grep -v grep|wc -l`   #检测inotifywait检测目录命令是否存活

wechat_alert() {                            #告警
    key="----------xx环境监控报警---------"
    host="10.1.60.22"
    env="pro"
    zt="nfs组件异常"
    webhook='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=123456'
    error="检测到nfs组件未在运行,已启用10.1.60.23备机,请检查组件是否出现异常!!"
    content="${key} \n主题:${zt}  \n环境:${env} \n主机地址:${host} \n详情: ${error}"
    curl $webhook -H 'Content-Type: application/json' -d ' {"msgtype": "text", "text": {"content":"'" ${content}"'"}}'  &>/dev/null
}

if [ $vip_status -eq 0 ]; then    #判断vip是否存在当前节点上
   wechat_alert    #如果vip不在当前节点,就调用告警函数执行告警
   if [ $inotify_status -eq 0 ]; then
      exit 0
   else         #vip不在当前节点,需要执行关闭同步脚本的命令,因为同步脚本是死循环会一直执行,需要手动关闭
      ps -fe |grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9
      ps -fe |grep rsync-inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9
   fi
else
   if [ $inotify_status -eq 0 ]; then
      nohup sh /opt/nfs-rsync/rsync-inotify.sh &
   else
      exit 0
   fi
fi

备节点脚本文件配置

配置自动检测目录文件变化并进行同步的脚本

vi rsync-inotify.sh

#!/bin/bash
host=10.1.60.22
src=/share/
des=master_nfs
password=/opt/rsyncd.passwd
user=rsync
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
 rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
 echo "${files} was rsynced" >>/opt/nfs-rsync/rsync.log 2>&1
done

配置检测vip是否存在当前节点来判断是否执行同步脚本

vi vip-monitor.sh

#!/bin/bash
vip_status=`ip add |grep 10.1.60.6|wc -l`
inotify_status=`ps -ef |grep inotifywait|grep -v grep|wc -l`

wechat_alert() {
    key="----------xx环境监控报警---------"
    host="10.1.60.23"
    env="pro"
    zt="nfs组件异常"
    webhook='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=12345678'
    error="检测到nfs组件未在运行,已启用10.1.60.22主机,请检查组件是否出现异常!!"
    content="${key} \n主题:${zt}  \n环境:${env} \n主机地址:${host} \n详情: ${error}"
    curl $webhook -H 'Content-Type: application/json' -d ' {"msgtype": "text", "text": {"content":"'" ${content}"'"}}'  &>/dev/null
}

if [ $vip_status -eq 0 ]; then
   wechat_alert
   if [ $inotify_status -eq 0 ]; then
      exit 0
   else
      ps -fe |grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9
      ps -fe |grep rsync-inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9
   fi
else
   if [ $inotify_status -eq 0 ]; then
      nohup sh /opt/nfs-rsync/rsync-inotify.sh &
   else
      exit 0
   fi
fi

脚本赋权   #主备节点均需执行

chmod +x rsync-inotify.sh

chmod +x vip-monitor.sh

部署keepalived服务

这里说明一下keepalived需要用到非抢占模式和keepalived状态检测执行脚本,非抢占模式是为了避免master节点故障恢复数据还未进行同步就立刻将vip抢占回来,keepalived状态检测执行脚本是为了实现对vip的监控从而进行数据的同步,当keepalived的状态发生变化时都会执行对应的脚本检测vip是否存在从而进行数据是否同步的操作

yum -y install keepalived   #主备节点均需执行

编辑主节点keepalived配置文件 

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   script_user root
   enable_script_security
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id nfs01
  # vrrp_skip_check_adv_addr
  # vrrp_strict
  # vrrp_garp_interval 0
  # vrrp_gna_interval 0
}

vrrp_script check_nfs {
   script "/etc/keepalived/check_nfs.sh"   #持续进行检测nfs服务是否存活脚本
   interval 3
}

vrrp_instance VI_4 {
    state BACKUP     #都配置backup状态
    interface ens192
    virtual_router_id 53
    priority 90
    advert_int 1
    nopreempt         #优先级高的配置非抢占模式
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.6
    }
    track_script {
       check_nfs
    }
    notify "/opt/nfs-rsync/vip-monitor.sh"     #keepalived状态发生变化时执行该脚本检测vip是否存在
    notify_stop "/opt/nfs-rsync/vip-monitor.sh"    #keepalived服务挂掉时执行该脚本检测vip是否存在
}

编辑备节点keepalived配置文件 

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   script_user root
   enable_script_security
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id nfs02
  # vrrp_skip_check_adv_addr
  # vrrp_strict
  # vrrp_garp_interval 0
  # vrrp_gna_interval 0
}

vrrp_script check_nfs {
   script "/etc/keepalived/check_nfs.sh"
   interval 3
}

vrrp_instance VI_4 {
    state BACKUP     #都配置backup状态
    interface ens192
    virtual_router_id 53
    priority 80      #优先级低的不需要配置非抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.6
    }
    track_script {
       check_nfs
    }
    notify "/opt/nfs-rsync/vip-monitor.sh"
    notify_stop "/opt/nfs-rsync/vip-monitor.sh"
}

编辑检测nfs服务脚本      #主备节点均需执行

vi /etc/keepalived/check_nfs.sh

#!/bin/bash
status=`ps -ef |grep nfsd|grep -v grep|wc -l`
if [ $status -eq 0 ]; then
   systemctl stop keepalived     #检测到nfs不存活时,关掉keepalived服务使vip漂移
else
   exit 0;
fi

脚本赋权     #主备节点均需执行

chmod +x /etc/keepalived/check_nfs.sh

启动keepalived服务,需要先启动主节点的再启动备节点

systemctl start keepalived && systemctl enable keepalived

检查主节点同步是否生效

ps -ef |grep rysnc

ps -ef |grep inotify

也可以通过查看rsync同步日志

tail -f  /opt/nfs-rsync/rsync.log

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

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

相关文章

元旦快到了,分享一些元旦祝福模板

元旦-王安石 爆竹声中一岁除,春风送暖入屠苏。 千门万户曈曈日,总把新桃换旧符。 元旦其实也是中国的传统节日了,不过元旦是由中国的春节演化而来的。传统的元旦时间是正月初一,从王安石的诗也能看的出来,其实描述的…

Apache Doris (五十六): Doris Join类型 - 四种Join对比

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 Doris 支持两种物理算子,一类是…

Linux自定义shell编写

Linux自定义shell编写 一.最终版本展示1.动图展示2.代码展示 二.具体步骤1.打印提示符2.解析命令行3.分析是否是内建命令1.shell对于内建名令的处理2.cd命令3.cd函数的实现4.echo命令的实现5.export命令的实现6.内建命令函数的实现 4.创建子进程通过程序替换执行命令5.循环往复…

RabbitMQ是做什么的

rabbitMQ是做异步通讯的。用于解决同步同讯的拓展性差,级联失败的问题。 异步调用方式其实就是基于消息通知的方式,一般包含三个角色:。 消息发送者:投递消息的人,就是原来的调用方 消息代理:管理、暂存、转发消息,你可以把它理…

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Hadoop之Yarn 详细教程

1、yarn 的基本介绍和产生背景 YARN 是 Hadoop2 引入的通用的资源管理和任务调度的平台,可以在 YARN 上运行 MapReduce、Tez、Spark 等多种计算框架,只要计算框架实现了 YARN 所定义的 接口,都可以运行在这套通用的 Hadoop 资源管理和任务调…

兔子目标检测数据集VOC格式3900张

兔子是一类可爱的哺乳动物,拥有圆润的脸庞和长长的耳朵,身体轻盈柔软。它们通常是以温和和友善的形象出现在人们的视野中,因此常常成为童话故事和卡通形象中的角色。 兔子是草食性动物,主要以各种草本植物为食,包括草…

数字 IC 笔试易混淆整理

signed 扩展 比较以下4段代码,给出W_DATA2的结果(十进制或16进制或二进制); wire signed [3:0] W_DATA1 4b1000; wire signed [7:0] W_DATA2; assign W_DATA2 W_DATA1; wire [3:0] W_DATA1 4b1000; wire signed [7:0] W_DA…

【Docker】添加指定用户到指定用户组

运行Docker ps命令,报错:/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied 创建docker用户组 安装docker时默认已经创建好 sudo groupadd docker添加用户加入docker用户组 此处以用户user为例 sudo usermo…

@Zabbix监控网络设备Trap接口UPDOWN关联告警配置

网络设备Trap接口UPDOWN关联告警配置 文章目录 网络设备Trap接口UPDOWN关联告警配置SNMPTrap描述1.监控平台监控项配置2.监控平台日志接收3.监控平台触发器配置4.监控平台触发器功能测试1)告警触发2)告警恢复 5.告警解析 SNMPTrap描述 在Zabbix中&#x…

作为铭文跨链赛道龙头,SoBit 有何突出之处?

跨链桥赛道将是铭文市场长期的发展的刚需 在比特币网络中,Ordinals铭文铸造的铭文总量已经超过了5100万枚,并累计费用收入超5028 BTC。同时,仅BRC-20叙事方向的市值,就已经超过了30亿美元,并且随着铭文资产种类与数量的…

Java商城 免 费 搭 建:鸿鹄云商实现多种商业模式,VR全景到SAAS,应有尽有!

鸿鹄云商 b2b2c产品概述 【b2b2c平台】,以传统电商行业为基石,鸿鹄云商支持“商家入驻平台自营”多运营模式,积极打造“全新市场,全新 模式”企业级b2b2c电商平台,致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

『JavaScript』全面解析JavaScript中的防抖与节流技术及其应用场景

📣读完这篇文章里你能收获到 理解防抖(Debouncing)和节流(Throttling)的概念:了解这两种性能优化技术如何帮助我们更有效地处理频繁触发的事件掌握防抖与节流的实现方法:学习如何在JavaScript中…

Spark RDD操作性能优化技巧

Apache Spark是一个强大的分布式计算框架,用于处理大规模数据。然而,在处理大数据集时,性能优化成为一个关键问题。本文将介绍一些Spark RDD操作的性能优化技巧,帮助大家充分利用Spark的潜力,并获得更快的处理速度。 …

autosar SJBWY 开发

第一天: 解决tasking 增加任意目录源文件的问题; 展开 Advanced 下面 Browse...选你的源文件目录就好了;

2023启示录丨自动驾驶这一年

图片|《老人与海》插图 过去的20年,都没有2023年如此动荡。 大模型犹如一颗原子弹投入科技圈,卷起万里尘沙,传统模式瞬间被夷为平地,在耀眼的白光和巨大的轰鸣声之下,大公司、创业者、投资人甚至是每一位观…

Vue : v-if, v-show

目录 v-show v-if v-show <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

vue3+ts 代理的使用

简单封装request.ts import axios from "axios";// 1.创建axios对象 const serviceaxios.create();// 2.请求拦截器 service.interceptors.request.use(config>{return config; },error>{Promise.reject(error); })// 3.响应拦截器 service.interceptors…

如何从RTP包的AP类型包,获取h265的PPS、SPS、VPS信息

ffmpeg播放rtp流&#xff0c;为了降低首开延迟&#xff0c;需要在SDP文件中指定PPS、SPS、VPS信息。抓包后发现wireshark无法解析AP包。需要自己进行AP包解析。RTP协议AP包格式如下&#xff1a; 根据如上信息&#xff0c;我们可以解析AP包&#xff0c;效果如下 40 01&#xff…

Linux中账号和权限管理

目录 一.用户账号和组账号&#xff1a; 1.用户账号类型&#xff1a; 2.组账号类型&#xff1a; 3.系统区别用户的方法 &#xff1a; 4.用户账号文件&#xff1a; 二.Linux中账户相关命令&#xff1a; 1.useradd&#xff1a; 2.passwd&#xff1a; 3.usermod&#xff1a…