因为某系统需要部署生产,但是云平台的nas存储资源不足需要重新采购,采购周期较长,需要有一个临时的解决方案,这样时候就需要采用nfs服务来提供网络存储服务了,在部署nfs服务的时候需要考虑生产环境需要有一定的高可用性,经过考虑之后设计为采用keepalived作为的高可用性方案,同时两个nfs节点前面购买一个VIP对外提供服务。

| 序号 | 服务器地址 | Vip |
| 1 | 192.99.27.34(master) | 192.99.27.36 |
| 2 | 192.99.27.35(slave) |
考虑到前期系统使用到存储空间较小,后期使用的存储空间较大,所以这里先申请500G的空间并且是使用lvm制作挂载目录,这样后期空间扩容的时候比较好处理,并且是支持在线扩容的操作。
注:如下的操作需要在两个节点都是一样的操作,切记。如果是有区分的会进行特殊的说明的。
[root@~ /]# mkdir /data
2. 制作lvm存储
这里直接是挂载了一个vdb的500G磁盘的,直接整个磁盘制作lvm即可
[root@~ /]# pvcreate /dev/vdb
[root@~ /]# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb data lvm2 a-- <500.00g 1020.00m
[root@~ /]# vgcreate -n data /dev/vdb
VG #PV #LV #SN Attr VSize VFree
data 1 1 0 wz--n- <500.00g 1020.00m
[root@~ /]# lvcreate -n data data-L 499G
[root@~ /]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data data -wi-ao---- 499.00g
[root@~ /]# mkfs.xfs /dev/data/data
[root@~ /]# vim /etc/fstab
/dev/data/data /data xfs defaults 0 0
[root@~ /]# mount -a
[root@~ /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-data 499G 33M 499G 1% /data
[root@~ /]# yum -y install nfs-utils rpcbind
.............
[root@~ /]# rpm -qa | grep nfs
libnfsidmap-0.25-19.el7.x86_64
nfs-utils-1.3.0-0.68.el7.2.x86_64
[root@~ /]# rpm -qa | grep rpcbind
rpcbind-0.2.0-49.el7.x86_64
[root@~ /]# systemctl start rpcbind && systemctl start nfs
[root@~ /]# systemctl enable rpcbind && systemctl enable nfs
[root@~ /]# systemctl status nfs

[root@~ /]# systemctl status rpcbind

[root@~ /]# systemctl status firewalld

[root@~ /]# getenforce
Disabled
[root@~ /]# vim /etc/exports
/data 192.99.207.0/24(rw,sync,all_squash)
[root@~ /]# systemctl restart rpcbind && systemctl restart nfs
注:如下的操作是在192.99.27.34(master)上操作的。
按照同步服务
[root@~ /]# yum -y install rsync.x86_64
......
创建同步用户
[root@~ /]# useradd data
[root@~ /]# echo data123 | passwd --stdin data
配置rsync配置文件
[root@~ /]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
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 = /data
auth users = data
secrets file = /etc/rsync_master.pass
hosts allow = 192.99.27.35
配置认证文件
[root@~ /]# echo 'data:data123' > /etc/rsync_master.pass
[root@~ /]# chmod 600 /etc/rsync_master.pass
设置权限
[root@~ /]# chown -R nfsnobody:nfsnobody /data/
启动rsync服务
[root@~ /]# rsync --daemon --config=/etc/rsyncd.conf
[root@~ /]# ps -ef | grep rsync
root 19899 1 0 Oct10 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
注:如下的操作在192.99.27.35(slave)上操作
[root@~ /]# yum -y install rsync.x86_64
[root@~ /]# chown -R nfsnobody:nfsnobody /kingdee
配置认证文件
[root@~ /]# echo "data123" > /etc/rsync.pass
[root@~ /]# chmod 600 /etc/rsync.pass
[root@~ /]# cd /data
[root@~ /]# echo "This is test file" > file.2.txt
同步文件
[root@~ /]# rsync -arv /data/ data@100.99.207.34::data --password-file=/etc/rsync.pass
注:如下的操作在192.99.27.34(master)上操作验证
[root@~ /]# cd /data && ll
total 8
-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.2.txt
[root@~ data]# cat file.2.txt
This is test file
注:如下的操作是在192.99.27.35(slave)上操作的。
按照同步服务
[root@~ /]# yum -y install rsync.x86_64
......
创建同步用户
[root@~ /]# useradd data
[root@~ /]# echo data123 | passwd --stdin data
配置rsync配置文件
[root@~ /]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
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 = /data
auth users = data
secrets file = /etc/rsync_master.pass
hosts allow = 192.99.27.34
配置认证文件
[root@~ /]# echo 'data:data123' > /etc/rsync_master.pass
[root@~ /]# chmod 600 /etc/rsync_master.pass
设置权限
[root@~ /]# chown -R nfsnobody:nfsnobody /data/
启动rsync服务
[root@~ /]# rsync --daemon --config=/etc/rsyncd.conf
[root@~ /]# ps -ef | grep rsync
root 1984 1 0 Oct10 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
注:如下的操作在192.99.27.34(master)上操作
[root@~ /]# yum -y install rsync.x86_64
[root@~ /]# chown -R nfsnobody:nfsnobody /data
配置认证文件
[root@~ /]# echo "data123" > /etc/rsync.pass
[root@~ /]# chmod 600 /etc/rsync.pass
[root@~ /]# cd /kingdee
[root@~ /]# echo "This is test file 1" > file.1.txt
同步文件
[root@~ /]# rsync -arv /data/ data@100.99.207.35::data --password-file=/etc/rsync.pass
注:如下的操作在192.99.27.35(slave)上操作验证
[root@~ /]# cd /data && ll
total 8
-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.1.txt
-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.2.txt
[root@~ data]# cat file.1.txt
This is test file 1
以上就完成了nfs的双向同步,但是这里有一个缺点就是,无法做到双向的自动同步,只能是手工的执行,这样的话会出现了两边数据不一致而导致,业务阻断,这样是有需要配置一下自动同步的功能。
将附件上的包上传到/usr/local目录下
注:如下的操作在192.99.27.34(master)上操作验证
[root@~ kingdee]# cd /usr/local
[root@~ local]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@~ local]# mv GNU-Linux-x86/ sersync
[root@~ local]# cd sersync/
修改配置文件
[root@~sersync]# sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/kingdee">#g' confxml.xml
[root@~ sersync]# sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="100.99.207.35" name="kingdee"/>#g' confxml.xml
[root@~ sersync]# sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml
[root@~ sersync]# sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="kingdee" passwordfile="/etc/rsync.pass"/>#g' confxml.xml
[root@~ sersync]# sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml
#启动Sersync
[root@~ sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
注:如下的操作在192.99.27.35(slave)上操作验证
[root@~ kingdee]# cd /usr/local
[root@~ local]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@~ local]# mv GNU-Linux-x86/ sersync
[root@~ local]# cd sersync/
修改配置文件
[root@~ sersync]# sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/kingdee">#g' confxml.xml
[root@~ sersync]# sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="100.99.207.34" name="kingdee"/>#g' confxml.xml
[root@~ sersync]# sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml
[root@~ sersync]# sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="kingdee" passwordfile="/etc/rsync.pass"/>#g' confxml.xml
[root@~ sersync]# sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml
#启动Sersync
[root@~ sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
在master节点上/kingdee目录下创建目录、创建文件、修改文件内容、重命名文件、删除文件、删除文件夹、删除文件内容都能自动同步到slave节点的/kingdee目录下。具体操作这里就不能写了,自行进行验证。
Nfs提供高可用性需要部署一个keepalived来的来提供一个vip,客户端通过这个vip来访问nfs存储。这里需要去申请一个vip地址,这个vip绑定了192.99.27.34,192.99.27.35两个服务器地址。
注:如下的操作在192.99.27.34(master)上操作验证
[root@~ ]# yum install -y keepalived
配置keepalived配置文件
[root@~ ]# cd /etc/keepalived/
先备份keepalived.conf文件
[root@keepalived ]# cp keepalived.conf keepalived.conf_back20221026
[root@keepalived ]# vim keepalived.conf
配置内容如下:
! Configuration File for keepalived
vrrp_script chk_process {
script "/etc/keepalived/check_process.sh"
interval 10
weight 2
}
global_defs {
notification_email {
sys_ft_mw_adm@cmft.com
}
notification_email_from sys_ft_mw_adm@cmft.com
smtp_server mail.cmft.com
smtp_connect_timeout 30
router_id CMFT_WEB
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 53
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass cmft_web
}
track_script {
#run the script
chk_process
}
virtual_ipaddress {
192.99.27.36
}
}
配置keepalived依赖进程的检查脚本
[root@keepalived ]# vim check_process.sh
#!/bin/bash
#间隔的秒数,不能大于60
step=1
for (( i = 0; i < 60; i=(i+step) ));
do
###检查nfs可用性:进程和是否能够挂载
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
###如果服务状态不正常,先尝试重启服务
systemctl restart nfs
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
# 如服务仍不正常,停止 keepalived
systemctl stop keepalived.service
fi
fi
sleep $step
Done
[root@keepalived ]# systemctl start keepalived
[root@keepalived ]# systemctl enable keepalived
注:如下的操作在192.99.27.35(slave)上操作验证
[root@~ ]# yum install -y keepalived
配置keepalived配置文件
[root@~ ]# cd /etc/keepalived/
先备份keepalived.conf文件
[root@keepalived ]# cp keepalived.conf keepalived.conf_back20221026
[root@keepalived ]# vim keepalived.conf
配置内容如下:
! Configuration File for keepalived
vrrp_script chk_process {
script "/etc/keepalived/check_process.sh"
interval 10
weight 2
}
global_defs {
notification_email {
sys_ft_mw_adm@cmft.com
}
notification_email_from sys_ft_mw_adm@cmft.com
smtp_server mail.cmft.com
smtp_connect_timeout 30
router_id CMFT_WEB
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 53
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass cmft_web
}
track_script {
#run the script
chk_process
}
virtual_ipaddress {
192.99.27.36
}
}
配置keepalived依赖进程的检查脚本
[root@keepalived ]# vim check_process.sh
#!/bin/bash
#间隔的秒数,不能大于60
step=1
for (( i = 0; i < 60; i=(i+step) ));
do
###检查nfs可用性:进程和是否能够挂载
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
###如果服务状态不正常,先尝试重启服务
systemctl restart nfs
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
# 如服务仍不正常,停止 keepalived
systemctl stop keepalived.service
fi
fi
sleep $step
Done
[root@keepalived ]# systemctl start keepalived
[root@keepalived ]# systemctl enable keepalived
[root@ keepalived]# cat /etc/services | grep nfs
nfs 2049/tcp nfsd shilp # Network File System
nfs 2049/udp nfsd shilp # Network File System
nfs 2049/sctp nfsd shilp # Network File System
注:所以客户端访问nfs需要开墙到nfs服务端的2049端口即可
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts
我的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、摘录、永久链接等
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我想知道是否有人知道Ruby的rubyzip替代品,它可以处理各种格式,特别是zip/rar/7z?我知道libarchive,但它对我的目的来说并不完整(它是一个很好的gem)。(澄清一下,libarchive-对我不起作用-因为
我爱Sanitize.这是一个了不起的实用程序。我遇到的唯一问题是,它需要永远准备一个开发环境,因为它使用Nokogiri,这对编译时间来说是一种痛苦。是否有任何程序可以在不使用Nokogiri的情况下执行Sanitize的操作(如果没有别的,只是温和地执行它的操作)?这将以指数方式提供帮助! 最佳答案 Rails有自己的SanitizeHelper。根据http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html,它将Thissanitizehe
我尝试在我的应用中只使用: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
我尝试每天在我的Rails应用程序中自动记录一些数据。我想知道是否有人知道一个好的解决方案?我找到了https://github.com/javan/whenever,但我想确保在选择之前了解所有选项。谢谢!艾略特 最佳答案 我真的很喜欢whenever-这是一个很棒的Gem,我已经在生产中使用了它。关于它还有一个很好的Railscasts插曲:http://railscasts.com/episodes/164-cron-in-ruby 关于ruby-on-rails-rails3中c