nfs高可用部署

一、前言

     为了避免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 ]; thenexit 0else         #vip不在当前节点,需要执行关闭同步脚本的命令,因为同步脚本是死循环会一直执行,需要手动关闭ps -fe |grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9ps -fe |grep rsync-inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9fi
elseif [ $inotify_status -eq 0 ]; thennohup sh /opt/nfs-rsync/rsync-inotify.sh &elseexit 0fi
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 ;dorsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$desecho "${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 ]; thenwechat_alertif [ $inotify_status -eq 0 ]; thenexit 0elseps -fe |grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9ps -fe |grep rsync-inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9fi
elseif [ $inotify_status -eq 0 ]; thennohup sh /opt/nfs-rsync/rsync-inotify.sh &elseexit 0fi
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 keepalivedglobal_defs {script_user rootenable_script_securitynotification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_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 ens192virtual_router_id 53priority 90advert_int 1nopreempt         #优先级高的配置非抢占模式authentication {auth_type PASSauth_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 keepalivedglobal_defs {script_user rootenable_script_securitynotification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_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 ens192virtual_router_id 53priority 80      #优先级低的不需要配置非抢占模式advert_int 1authentication {auth_type PASSauth_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 ]; thensystemctl stop keepalived     #检测到nfs不存活时,关掉keepalived服务使vip漂移
elseexit 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://xiahunao.cn/news/2661524.html

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

相关文章

【北亚服务器数据恢复】san环境下LUN Mapping出错导致文件系统一致性出错的数据恢复案例

服务器数据恢复环境: san环境下的存储上一组由6块硬盘组建的RAID6,划分为若干LUN,MAP到跑不同业务的服务器上,服务器上层是SOLARIS操作系统UFS文件系统。 服务器故障: 业务需求需要增加一台服务器跑新增的应用&#xf…

如何实现h5的抽奖功能

示例: 使用的是一个插件可以在多种环境下运行的插件:九宫格 LuckyGrid | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫格 & 老虎机】抽奖插件 安装插件 # npm 安装 npm install lucky-canvas/vuelatest# 或者 yarn 安装 yarn add lu…

秋招复习篇之代码规范

目录 前言 1、变量命名 2、代码空格 1)操作符左右一定有空格, 2)分隔符(, 和;)前一位没有空格,后一位保持空格,例如: 3)大括号和函数保持同一行,并有一个空格…

复数值神经网络可能是深度学习的未来

一、说明 复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。

Frappe Charts:数据可视化的强大工具

一、产品简介: 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化,都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效,体验感很好。不仅支持配置颜色,外观定制也很方便。还支持…

MYSQL分库分表常见问题

什么是分库 分库:是将一个数据库分成多个数据库,但是总表数不变,部署到不同机器,这样可以分担数据库的读写压力,提高系统的吞吐能力。 什么是分表 分表:就是一个表分成多个表,但是总体的库不…

k8s之陈述式资源管理

1.kubectl命令 kubectl version 查看k8s的版本 kubectl api-resources 查看所有api的资源对象的名称 kubectl cluster-info 查看k8s的集群信息 kubectl get cs 查看master节点的状态 kubectl get pod 查看默认命名空间内的pod的信息 kubectl get ns 查看当前集群所有的命…

[Python进阶] 操作注册表:winreg

5.22 操作注册表:winreg 5.22.1 注册表概念 在Windows系统中,注册表本质上就是一个数据库,其中存放着硬件、软件、用户、操作系统以及程序相关设置信息。我们除了使用Windows系统自带的regedit程序,也可以通过Python编程读取并操…

【React】echarts-for-react 的使用

文章目录 echarts-for-react :一个简单的 Apache echarts 的 React 封装配置项手册:https://echarts.apache.org/zh/option.html#title 安装依赖 $ npm install --save echarts-for-react# echarts 是 echarts-for-react的对等依赖,您可以使用自己的版本…

MCEWMDRMNDBootstrap.dll文件丢失,软件游戏无法启动,怎样下载修复

不少小伙伴反馈,在打开某些游戏或软件的时候,Windows会提示“MCEWMDRMNDBootstrap.dll文件丢失,软件无法启动”,不知道应该怎样办? 首先,我们先来了解“MCEWMDRMNDBootstrap.dll文件”是什么? …

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面,通过addrender这种方式添加多个绘制窗体,我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面,原理应该类似,一个地方负责打开解码播放,将画面…

geemap学习笔记037:分析地理空间数据--坐标格网和渔网

前言 坐标格网(Coordinate Grid)简称“坐标网”,是按一定纵横坐标间距,在地图上划分的格网,坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…

请问仿写arkts摇杆功能,为什么我的代码,TouchType.Up 时候摇杆动画不能还原呢?请求大佬指点一下

仿照黑马的arkts 写个摇杆功能,但是为什么我的代码,TouchType.Up 时候摇杆动画不能还原, 请求大佬指点一下 import router from ohos.router import curves from ohos.curvesEntry Component struct ItemPage7 {// 小鱼坐标State fishX: nu…

java代码审计 - OutputStream.write() 期间持续发生 XSS 攻击

** java - OutputStream.write() 期间持续发生 XSS 攻击 ** 1 漏洞概述 我一直在研究有关持久 XSS 攻击的安全问题 将未经验证的数据发送到网络浏览器,这可能会导致浏览器执行恶意代码。 代码采用 Java 语言。 void output(OutputStream out){out.write(byteDa…

中小型企业为什么需要CRM系统?CRM系统功能解析

巴菲特曾说:“设计出的工具越多,使用工具的人就得越聪明。“”如果您是中小企业主,想要企业更好地发展,您都可以考虑使用CRM管理系统。它可以帮助中小企业有效地管理客户,提高业务效率,实现快、稳、准的发展…

Miniconda 3 | 出发,探索Python

介绍 Miniconda 是 Anaconda 的精简版本,是一个轻量级的 Python 包管理工具和环境管理工具。 优势和功能主要包括: 轻量级和快速安装: Miniconda 相比 Anaconda 更小巧,只包含最基本的工具和包管理功能。安装速度更快&#xff0c…

基于图神经网络的动态物化视图管理

本期 Paper Reading 主要介绍了发布于 2023 年 ICDE 的论文《Dynamic Materialized View Management using Graph Neural Network》,该文研究了动态物化视图管理问题,提出了一个基于 GNN 的模型。在真实的数据集上的实验结果表明,取得了更高的…

进行VMware日志管理

随着公司转向虚拟化其 IT 空间,虚拟环境日志监控正在占据日志管理的很大一部分,除了确保网络安全外,虚拟机日志监控还有助于管理虚拟化工具,这是最复杂的任务之一。 对虚拟环境日志的监控分析 当今公司中最受欢迎的虚拟平台之一是 VMware。…

爬虫学习(1)--requests模块的使用

前言 什么是爬虫 爬虫是一种自动化工具,用于从互联网或其他计算机网络上获取数据。它可以模拟人的行为,自动访问网页,提取感兴趣的数据,并将其存储到本地计算机或数据库中。爬虫通常用于搜索引擎、数据分析、信息聚合等领域&…

gin框架使用系列之三——获取表单数据

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》 一、获取get参数 get请求的参数是直接加在url后面的,在gin中获取get请求的参数主要用Query()和DefaultQuery()两个方法,示例代码如下…