jjzjj

NFS高可用方案:NFS+keepalived+Sersync

jiang0615csdn 2023-09-04 原文

1、背景

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

2、架构设计

3、环境信息

序号

服务器地址

Vip

1

192.99.27.34(master)

192.99.27.36

2

192.99.27.35(slave)

4、nfs服务实施部署

4.1 nfs共享目录实施

       考虑到前期系统使用到存储空间较小,后期使用的存储空间较大,所以这里先申请500G的空间并且是使用lvm制作挂载目录,这样后期空间扩容的时候比较好处理,并且是支持在线扩容的操作。

注:如下的操作需要在两个节点都是一样的操作,切记。如果是有区分的会进行特殊的说明的。

1. 创建共享目录

[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      

3. 格式化lvm存储并挂载  

[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

4.2、部署nfs服务

[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

 

4.3、防火墙和selinux关闭

[root@~ /]# systemctl status firewalld

[root@~ /]# getenforce

Disabled

4.4、nfs配置实施

[root@~ /]# vim /etc/exports

/data 192.99.207.0/24(rw,sync,all_squash)

[root@~ /]# systemctl restart rpcbind && systemctl restart nfs

4.5、nfs共享文件数据同步配置

1. 在 Master 进行同步 slave 数据

注:如下的操作是在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

2. 在 Slave 进行同步 Master 数据

注:如下的操作是在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

3. 配置实时自动同步

以上就完成了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

4. 测试master和slave的自动同步功能

在master节点上/kingdee目录下创建目录、创建文件、修改文件内容、重命名文件、删除文件、删除文件夹、删除文件内容都能自动同步到slave节点的/kingdee目录下。具体操作这里就不能写了,自行进行验证。

4.6、部署keepalived服务

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

5.客户端访问nfs服务开墙

[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端口即可

 

有关NFS高可用方案:NFS+keepalived+Sersync的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在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',

  2. 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

  3. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从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

  4. 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

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

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

  6. ruby-on-rails - 能够处理 rar/tar/zip/7z 的 Ruby/rubyzip 替代方案? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我想知道是否有人知道Ruby的ruby​​zip替代品,它可以处理各种格式,特别是zip/rar/7z?我知道libarchive,但它对我的目的来说并不完整(它是一个很好的gem)。(澄清一下,libarchive-对我不起作用-因为

  7. ruby-on-rails - 对于 Ruby 应用程序,是否有比 Sanitize 更好的替代方案? - 2

    我爱Sanitize.这是一个了不起的实用程序。我遇到的唯一问题是,它需要永远准备一个开发环境,因为它使用Nokogiri,这对编译时间来说是一种痛苦。是否有任何程序可以在不使用Nokogiri的情况下执行Sanitize的操作(如果没有别的,只是温和地执行它的操作)?这将以指数方式提供帮助! 最佳答案 Rails有自己的SanitizeHelper。根据http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html,它将Thissanitizehe

  8. 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添加到标签 最佳答案

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

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

  10. ruby-on-rails - rails3 中 cron 作业的解决方案 - 2

    我尝试每天在我的Rails应用程序中自动记录一些数据。我想知道是否有人知道一个好的解决方案?我找到了https://github.com/javan/whenever,但我想确保在选择之前了解所有选项。谢谢!艾略特 最佳答案 我真的很喜欢whenever-这是一个很棒的Gem,我已经在生产中使用了它。关于它还有一个很好的Railscasts插曲:http://railscasts.com/episodes/164-cron-in-ruby 关于ruby-on-rails-rails3中c

随机推荐