草庐IT

nfs+keeep+rsync高可用

su酥饼 2023-03-28 原文

架构图如下:


image.png

服务器信息

服务器信息
10.10.5.156  nfs-service1
10.10.5.157  nfs-service2
10.10.5.158  nfs-client

安装相关服务 两个service 节点

yum install -y nfs-utils
yum install -y keepalived
yum install -y rsync
yum install -y inotify

安装nfs client 节点

yum install -y nfs-utils

2.配置nfs服务

2-1两个service节点配置nfs,并启动服务

mkdir -p /data/nfs
echo "/data/nfs  *(insecure,rw,sync,no_root_squash,no_all_squash)" > /etc/exports
systemctl restart nfs
systemctl enable nfs

2-2client节点配置nfs,并启动服务

systemctl restart nfs
systemctl enable nfs

3.配置keepalived

修改master节点

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id lb01
}

vrrp_instance VI_1 {
    state BACKUP          #两个节点均为BACKUP
    nopreempt             #非抢占模式
    interface eth0       #主节点对应ip地址的网卡名称
    virtual_router_id 66  #修改默认id
    priority 102
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.5.164       #浮动ip
    }
}

修改buckup节点

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP          #两个节点均为BACKUP
    nopreempt              #非抢占模式
    interface eth0       #对应ip地址的网卡名称
    virtual_router_id 66  #修改默认id
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.5.164       #浮动ip
    }
}

启动服务keepalived

systemctl restart keepalived
systemctl enable keepalived

查看是否有eth0网卡上是否有对应的vip

image.png

4.配置rsync+inotify(2service 节点)

1.rsync 同步文件需要对应用户和密码,这里直接使用root,两台服务器之间做免密操作即可:
免密操作:
略

inotifywait 参数说明:

-m,–monitor:始终保持事件监听状态   # 重要参数
-r,–recursive:递归查询目录     # 重要参数
-q,–quiet:只打印监控事件的信息     # 重要参数
-exclude:排除文件或目录时,不区分大小写
-t,–timeout:超时时间
–timefmt:指定时间输出格式  # 重要参数
–format:指定时间输出格式       # 重要参数
-e,–event:后面指定删、增、改等事件 # 重要参数

inotifywait events 事件说明:
access:读取文件或目录内容
modify:修改文件或目录内容
attrib:文件或目录的属性改变
close_write:修改真实文件内容   # 重要参数
close_nowrite:文件或目录关闭,在只读模式打开之后关闭的
close:文件或目录关闭,不管读或是写模式
open:文件或目录被打开
moved_to:文件或目录移动到
moved_from:文件或目录从移动
move:移动文件或目录移动到监视目录  # 重要参数
create:在监视目录下创建文件或目录  # 重要参数
delete:删除监视目录下的文件或目录  # 重要参数
delete_self:文件或目录被删除,目录本身被删除
unmount:卸载文件系统

编写脚本用来监控并同步两个service端的共享存储

本脚本为157服务器内容
#!/bin/bash
#监控本地目录,有变动则输出
cd /usr/local/sbin/ 
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib /data/nfs/ |  while read file
do
    #将本地同步到远程目录,这里要根据实际情况修改
    rsync -avz --delete  /data/nfs/ root@10.10.5.156:/data/nfs/
    echo "  ${file} was rsynced" >>/tmp/rsync.log 2>&1
done
本脚本为156服务器内容
#!/bin/bash
#监控本地目录,有变动则输出
cd /usr/local/sbin/
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib /data/nfs/ |  while read file
do
    #将本地同步到远程目录,这里要根据实际情况修改
    rsync -avz --delete  /data/nfs/ root@10.10.5.157:/data/nfs/
    echo "  ${file} was rsynced" >>/tmp/rsync.log 2>&1
done

加入到开启自启

echo "nohup /usr/local/sbin/sync_nfs.sh & ">> /etc/rc.local

5.client 挂载共享存储

#查看可用挂载点
showmount -e 10.10.5.164
#创建挂载目录
mkdir /nfs/158 -p
#写入配置文件并挂载 
echo "10.10.5.164:/data/nfs /nfs/158   nfs  defaults 0  0">> /etc/fstab
mount -a
#查看挂载情况
df -h

6.编写端检查nfs服务脚本

6-1 service 脚本,判断nfs服务是否正常可用
cat check_service.sh
#!/bin/bash
#nfs check
#if no nfsserver then start nfs
#if start nfs fail then stop keepalived

for i in `seq 14`;do
counter=`ps -aux | grep '\[nfsd\]' | wc -l`
if [ $counter -eq 0 ];then
systemctl restart nfs
fi 
sleep 2
counter=`ps -aux | grep '\[nfsd\]' | wc -l`
if [ $counter -eq 0 ];then
systemctl stop keepalived.service
fi
sleep 2
done
6-2 client 端脚本,当vip飘移后保证服务可用
cat check_client.sh
#!/bin/bashz
#用for循环设置每两秒检查一次 2*(29+1)检查一分钟 可用性
for i in `seq 29`;do
df -Th &> /dev/null
if [ `echo $?` -ne 0 ];then 
umount -lf /nfs/158 &&  mount -a 
fi
sleep 2
done

编写定时任务配置 定时执行检查脚本

crontab -e
#服务端定时任务
* * * * *  /usr/local/sbin/chenk_service.sh &> /dev/null
#客户端定时任务
* * * * *  /usr/local/sbin/chenk_client.sh &> /dev/null

7.高可用测试

客户主机挂载测试:使用当前平台一个节点机,挂载浮动ip地址共享目录,同时做文件读写,观察存储主机两个节点文件生成情况;
主机宕机测试:可直接关闭服务器,或停止nfs和keepalived服务,查看共享目录可用性;
nfs服务终端测试:正常服务的同时,关闭nfs主节点服务进程,测试客户端读写文件功能正常与否,以及浮动IP切换正常与否;
文件同步测试:测试在主节点进行文件增、删、改后,备节点的文件变动情况;

有关nfs+keeep+rsync高可用的更多相关文章

  1. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  2. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  3. ruby-on-rails - self 在 Rails 模型中的值(value)是什么?为什么没有明显的实例方法可用? - 2

    我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven

  4. ruby - 输出液体模板中的可用对象和属性 - 2

    有没有办法在liquidtemplate中输出(用于调试/信息目的)可用对象和对象属性??也就是说,假设我正在使用jekyll站点生成工具,并且我在我的index.html模板中(据我所知,这是一个液体模板)。它可能看起来像这样{%forpostinsite.posts%}{{post.date|date_to_string}}»{{post.title}}{%endfor%}是否有任何我可以使用的模板标签会告诉我/输出名为post的变量在此模板(以及其他模板)中可用。此外,是否有任何模板标签可以告诉我post对象具有键date、title、url、摘录、永久链接等

  5. ruby-on-rails - 是否有类似 'with_indifferent_access' 的数组可用于包含? - 2

    我尝试在我的应用中只使用:symbols作为关键词。我尝试在:symbol=>logic或string=>UI/languagespecific之间做出严格的决定但我也得到了每个JSON的一些“值”(即选项等),因为JSON中没有:symbols,所以我调用的所有哈希都具有“with_indifferent_access”属性。但是:数组是否有相同的东西?像那样a=['std','elliptic',:cubic].with_indifferent_accessa.include?:std=>true?编辑:将rails添加到标签 最佳答案

  6. ruby - 哪些 IDE 可用于 jRuby? - 2

    我进行了一些谷歌搜索,似乎缺少用于jRuby的IDE。我读过TextMate和Sublime,但它们不提供调试或代码完成功能。有人可以提出建议吗(或者这项技术还处于起步阶段)? 最佳答案 有几个选项;我更喜欢JetBrains'IntelliJ(RubyMine).AptanahasanEclipseplugin.NetBeansusedtohaveofficialsupport,不确定currentstate是什么是。 关于ruby-哪些IDE可用于jRuby?,我们在StackOve

  7. ruby-on-rails - 如果没有可用标签,则运行标记规范或全部 - 2

    我将guard与rspec和cucumber一起使用。要连续运行选定的规范,我只需使用focus标记来确定我要处理的内容。但问题是,如果没有带有该标签的规范,我想运行所有规范。我该怎么做?注意::我知道所有RSpec选项。因此,请仅在阅读问题后回复。 最佳答案 我通过以下配置实现了您描述的行为:#torunonlyspecificspecs,add:focustothespec#describe"foo",:focusdo#OR#it"shouldfoo",:focusdoconfig.treat_symbols_as_metada

  8. ruby-on-rails - Controller 中的实例变量如何可用于 Rails 中的 View - 2

    我从事Rails已有一段时间,并且刚刚开始深入研究Ruby元编程,Rails从中获得了强大的力量。我真的想不通这个,这让我发疯。Controller中的实例变量如何提供给Rails中的View(与View共享)?我知道它背后有一些元编程魔法,但我无法弄明白。在此先感谢您的所有帮助。 最佳答案 更新:原来接受的答案是错误的我现在将它留在下面以证明我错了。在获得足够多的反对票后,我决定研究这实际上是如何工作的。我最初的回答是在我对Rails还很陌生之后写的,并且是基于我使用过的其他MVC库(特别是:CodeIgniter)的工作方式的假

  9. ruby-on-rails - 为什么 Array.count 在开发模式下可用但在生产模式下不可用? - 2

    对于最近的一个项目,我有几个View是这样的代码:这在开发模式下工作得很好......我将它推出到生产模式并且它爆炸了,说count不是Array的有效方法。我将每个实例都改为使用Array#length,它似​​乎可以正常工作。1)这种行为差异的原因是什么?2)我应该注意开发模式和生产模式之间的任何其他令人兴奋的差异吗?道德:确保您的生产托管环境使用与本地开发环境相同的Ruby版本。:)谢谢汤姆 最佳答案 count方法仅在Ruby1.9及更高版本中可用。我建议您使用与服务器相同版本的Ruby以避免此类问题-1.9中发生了很多变化

  10. Ruby 获取可用的磁盘驱动器 - 2

    谁能告诉我如何在ruby​​中获取可用磁盘驱动器的列表?我正在创建一个打开的文件对话并且需要知道!提前致谢,嗯。 最佳答案 Brian给出的文章正确地陈述了以下代码:require'win32ole'file_system=WIN32OLE.new("Scripting.FileSystemObject")drives=file_system.Drivesdrives.eachdo|drive|puts"Availablespace:#{drive.AvailableSpace}"puts"Driveletter:#{drive.D

随机推荐