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

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

 

<think>嗯,用户问的是NFS高可用中使用sersync是否需要两台NFS服务器都配置。我需要先理清楚NFS高可用的常见架构和sersync的作用。 首先,NFS本身是网络文件系统,但单点故障是个问题。高可用通常通过主备或双活实现。sersync用于实时同步数据,保证两边数据一致。 那用户的问题核心是,是否两边都要装sersync。可能用户的理解是单向同步,比如主到备,所以可能觉得只需要主服务器配置。但实际情况可能更复杂。 接下来要考虑sersync的工作模式。sersync一般是单向同步,从源到目标。如果是主备模式,主服务器作为源,备服务器作为目标,只需要在主服务器配置sersync同步到备服务器。备服务器可能不需要运行sersync,除非需要双向同步。 但如果是双活架构,两边都需要读写,可能需要双向同步,这时候两边都要装sersync,分别监控各自的目录并同步到对方。不过这样可能会有冲突风险,比如两边同时修改同一个文件,导致数据不一致。这时候可能需要额外的机制,比如文件锁或冲突解决策略。 还需要考虑数据一致性的问题。单向同步简单,但双向的话需要处理冲突,这可能比较复杂。用户可能需要根据实际业务需求选择架构。 另外,rsync+inotify组合和sersync的区别,sersync优化了性能,更适合实时同步。但无论哪种方式,同步方向是关键。 总结:是否需要两台都做sersync取决于架构设计。主备模式通常只需主到备同步,而双活可能需要双向,但需注意冲突。因此,回答时要分情况讨论,帮助用户理解不同场景下的配置方式。</think>在NFS高可用架构中使用sersync时,是否需要两台NFS服务器都部署sersync,需根据具体架构设计分情况讨论: ### 一、基础逻辑分析 1. **sersync核心作用** 通过`inotify`监控文件系统事件,触发增量数据实时同步,解决`rsync`全量同步的性能瓶颈。 2. **NFS高可用典型架构** - **主备模式**:单点写入,备机热备 - **双活模式**:双节点同时提供读写 --- ### 二、主备模式下的配置 1. **单向同步场景** - 仅需在主NFS服务器部署sersync,向备机同步数据 - 备机无需运行sersync(被动接收数据) - **优势**:架构简单,避免双向同步冲突 - **拓扑示例**: ``` 主NFSsersync) --> 备NFS(rsync daemon) ``` 2. **双向同步需求** - 若需主备切换后新主节点继续同步,需双向部署 - 两节点均需安装sersync,但**不同时运行** - **切换逻辑**: ```bash 主节点故障 --> 停止主sersync进程 --> 启动备机sersync ``` --- ### 三、双活模式下的特殊考量 1. **强制双向同步场景** - 需在两台NFS服务器同时部署sersync - **风险点**: $$ \exists 文件冲突风险 \Rightarrow 需额外设计防冲突机制 $$ - **同步策略优化**: - 分目录同步(如/app/data1、/app/data2分区同步) - 使用文件锁机制(如`flock`) - 业务层规避并发写 2. **性能影响公式** 同步延迟时间$T_{sync}$主要取决于: $$ T_{sync} = \max\left(\frac{文件大小}{网络带宽}, 磁盘IO延迟\right) $$ --- ### 四、生产环境建议 1. **推荐方案** ```mermaid graph LR A[客户端] -->|挂载| B(VIP) B --> C[主NFS] B --> D[备NFS] C <-.sersync单向同步.-> D ``` - 主节点单点同步至备节点 - 通过keepalived维护VIP漂移 2. **必须双向同步时的保护措施** - 设置同步过滤列表(`exclude`特殊临时文件) - 增加同步日志审计 - 定期校验`checksum`: $$ \sum_{i=1}^{n} md5(file_i) $$ --- ### 五、验证方法 1. **基础功能测试** ```bash # 在主节点创建测试文件 touch /nfs_share/testfile # 在备节点验证是否存在 ls /nfs_backup/ | grep testfile ``` 2. **性能压测工具** ```bash # 使用fio测试同步对IO的影响 fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k \ --numjobs=32 --size=1G --runtime=60 --time_based --end_fsync=1 ``` --- ### 六、最终结论 是否需要两台NFS都部署sersync,取决于: 1. 业务是否要求双写(双活必须双向同步) 2. 故障切换后是否需要维持同步能力 3. 数据一致性级别要求 对于常规生产环境,建议优先采用**主备架构+单向同步**,通过VIP实现高可用,在保证可靠性的同时降低复杂度。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiang0615csdn

你对鼓励是我最大的动力来源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值