架构图如下:

服务器信息
服务器信息
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-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
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
}
}
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

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端的共享存储
#!/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
#!/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
#查看可用挂载点
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
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
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
客户主机挂载测试:使用当前平台一个节点机,挂载浮动ip地址共享目录,同时做文件读写,观察存储主机两个节点文件生成情况;
主机宕机测试:可直接关闭服务器,或停止nfs和keepalived服务,查看共享目录可用性;
nfs服务终端测试:正常服务的同时,关闭nfs主节点服务进程,测试客户端读写文件功能正常与否,以及浮动IP切换正常与否;
文件同步测试:测试在主节点进行文件增、删、改后,备节点的文件变动情况;
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven
有没有办法在liquidtemplate中输出(用于调试/信息目的)可用对象和对象属性??也就是说,假设我正在使用jekyll站点生成工具,并且我在我的index.html模板中(据我所知,这是一个液体模板)。它可能看起来像这样{%forpostinsite.posts%}{{post.date|date_to_string}}»{{post.title}}{%endfor%}是否有任何我可以使用的模板标签会告诉我/输出名为post的变量在此模板(以及其他模板)中可用。此外,是否有任何模板标签可以告诉我post对象具有键date、title、url、摘录、永久链接等
我尝试在我的应用中只使用:symbols作为关键词。我尝试在:symbol=>logic或string=>UI/languagespecific之间做出严格的决定但我也得到了每个JSON的一些“值”(即选项等),因为JSON中没有:symbols,所以我调用的所有哈希都具有“with_indifferent_access”属性。但是:数组是否有相同的东西?像那样a=['std','elliptic',:cubic].with_indifferent_accessa.include?:std=>true?编辑:将rails添加到标签 最佳答案
我进行了一些谷歌搜索,似乎缺少用于jRuby的IDE。我读过TextMate和Sublime,但它们不提供调试或代码完成功能。有人可以提出建议吗(或者这项技术还处于起步阶段)? 最佳答案 有几个选项;我更喜欢JetBrains'IntelliJ(RubyMine).AptanahasanEclipseplugin.NetBeansusedtohaveofficialsupport,不确定currentstate是什么是。 关于ruby-哪些IDE可用于jRuby?,我们在StackOve
我将guard与rspec和cucumber一起使用。要连续运行选定的规范,我只需使用focus标记来确定我要处理的内容。但问题是,如果没有带有该标签的规范,我想运行所有规范。我该怎么做?注意::我知道所有RSpec选项。因此,请仅在阅读问题后回复。 最佳答案 我通过以下配置实现了您描述的行为:#torunonlyspecificspecs,add:focustothespec#describe"foo",:focusdo#OR#it"shouldfoo",:focusdoconfig.treat_symbols_as_metada
我从事Rails已有一段时间,并且刚刚开始深入研究Ruby元编程,Rails从中获得了强大的力量。我真的想不通这个,这让我发疯。Controller中的实例变量如何提供给Rails中的View(与View共享)?我知道它背后有一些元编程魔法,但我无法弄明白。在此先感谢您的所有帮助。 最佳答案 更新:原来接受的答案是错误的我现在将它留在下面以证明我错了。在获得足够多的反对票后,我决定研究这实际上是如何工作的。我最初的回答是在我对Rails还很陌生之后写的,并且是基于我使用过的其他MVC库(特别是:CodeIgniter)的工作方式的假
对于最近的一个项目,我有几个View是这样的代码:这在开发模式下工作得很好......我将它推出到生产模式并且它爆炸了,说count不是Array的有效方法。我将每个实例都改为使用Array#length,它似乎可以正常工作。1)这种行为差异的原因是什么?2)我应该注意开发模式和生产模式之间的任何其他令人兴奋的差异吗?道德:确保您的生产托管环境使用与本地开发环境相同的Ruby版本。:)谢谢汤姆 最佳答案 count方法仅在Ruby1.9及更高版本中可用。我建议您使用与服务器相同版本的Ruby以避免此类问题-1.9中发生了很多变化
谁能告诉我如何在ruby中获取可用磁盘驱动器的列表?我正在创建一个打开的文件对话并且需要知道!提前致谢,嗯。 最佳答案 Brian给出的文章正确地陈述了以下代码:require'win32ole'file_system=WIN32OLE.new("Scripting.FileSystemObject")drives=file_system.Drivesdrives.eachdo|drive|puts"Availablespace:#{drive.AvailableSpace}"puts"Driveletter:#{drive.D