Linux 数据同步全攻略:NFS 共享、inotify+rsync 与 sersync 实战指南

 目录

一、存储介绍

1、常见存储类型

2、常见存储方式

二、NFS服务

1、NFS工作原理

2、NFS安装和配置

3、NFS常用工具

4、NFS共享实现

三、数据实时同步

1、inotify服务

2、rsync服务

rsync 服务常用配置项

实现rsync daemon服务

3、inotify+rsync 实现数据实时同步

4、sersync 实现数据实时同步


一、存储介绍

1、常见存储类型

⚪直连式存储:Direct-Attached Storage (DAS)

        直连式存储(DAS)就像给服务器“直接装硬盘”——存储设备通过物理接口(如SCSI、SAS、FC)与服务器主板或扩展卡绑定,被识别为本地块设备(类似电脑里的C盘、D盘),数据传输不经过网络,因此速度极快、延迟极低。但它最大的局限是“独占性”:一台DAS通常只能被一台服务器使用,其他服务器无法直接访问,导致存储资源无法共享,扩展时需频繁更换或增加设备,管理成本也会随服务器数量增加而上升。DAS适合对性能要求高、存储需求集中的单服务器场景(如小型数据库、虚拟机),但在需要多服务器协作或数据共享的环境中(如企业集群、云计算),其封闭性会成为明显短板。

⚪存储区域网络:Storage Area Network (SAN)

        存储区域网络(SAN)如同为服务器打造的“高速专用数据公路”——它通过光纤通道(FC)或高速以太网(iSCSI)将多台服务器与独立存储设备(如磁盘阵列、磁带库)连接成专用网络,数据以块级形式传输(类似直接操作本地硬盘)。SAN的核心优势是“共享与高性能”:存储资源从服务器中剥离,形成可被多服务器并发访问的集中池,既避免了DAS的“孤岛”问题,又通过专用网络保障了低延迟、高带宽的数据传输,适合对I/O性能要求严苛的场景(如大型数据库、虚拟化集群)。但SAN的部署成本较高(需专用硬件和网络配置),且技术复杂度大于DAS,通常用于企业级核心业务环境。

⚪网络附加存储:Network-Attached Storage (NAS)

        网络附加存储(NAS)像是一个“带网络功能的共享文件夹”——它是一台独立设备(内置硬盘和简化操作系统),通过标准网络协议(如NFS、SMB/CIFS)接入局域网,为多台设备(电脑、手机、平板等)提供文件级数据共享服务。NAS的精髓在于“便捷与普适”:用户无需关心底层存储细节,只需像访问本地文件夹一样通过网络存取文件,且支持跨平台兼容(Windows、macOS、Linux均可使用)。它部署简单(插网线即用)、管理直观(通常配备Web界面或APP),成本也远低于SAN,但文件级传输的性能和并发能力弱于SAN的块级传输,更适合中小企业的文件共享、多媒体存储或家庭数据中心等轻量级场景。

分类 DAS NAS SAN
传输类型 SCSI、FC IP(NFS/SMB/CIFS) IP、FC、SAS
数据类型 数据块(Block-level) 文件(File-level) 数据块(Block-level)
典型应用 任何需要直接访问存储的场景(如单服务器应用) 文件服务器(存储非结构化数据,如文档、图片、视频) 数据库服务器、虚拟化集群、高性能计算(需低延迟块级存储)
优点 1. 磁盘与服务器物理直连,访问速度快
2. 结构简单,管理直接
1. 不占用服务器资源,独立运行
2. 支持多操作系统跨平台访问
3. 扩展容易,即插即用
4. 安装简单,成本低
1. 高扩展性(支持海量存储)
2. 高可用性(冗余设计)
3. 数据集中管理,便于备份恢复
4. 性能接近本地存储
缺点 1. 连接距离短(通常限于机房内)
2. 数据分散,共享困难
3. 存储利用率低
4. 扩展性有限(依赖服务器接口)
1. 不适合块级应用(如数据库)
2. 大文件传输占用网络带宽
3. 性能受限于以太网速度
1. 成本高(专用硬件+网络)
2. 安装和升级复杂(需专业配置)
3. 技术门槛较高
应用场景 数据量不大、对速度要求高的中小企业(如单服务器数据库、本地应用) 文件共享、多媒体存储、远程访问(如家庭NAS、中小企业文件服务器) 大型企业核心业务(如银行交易系统、电商数据库、云计算资源池)

2、常见存储方式

⚪块存储

        块存储(Block Storage Service)设备不能被操作系统直接访问,需要创建分区或逻辑卷,再创建文件系统 (EXT3, EXT4, NTFS 等),然后再经过挂载,才能使用。对于主机而言,其并不能识别出存储设备是真正的物理设备还是二次划分的逻辑设备(RAID等),块存储不仅仅是直接使用物理设备,间接使用物理设备的也叫块设备。比如虚拟机上创建的虚拟磁盘。

        块存储大多数时候是本地存储,读写速度很快,但不利于扩展,数据不能被共享。

⚪文件存储

        文件存储(File Storage Service)可以分为本地文件存储和网络文件存储。文件存储最明显的特征是支持POSIX的文件访问接口,例如 open、read、write、seek、close 等 (这几个是常用的文件操作API接口 ),与块存储不同,主机不需要再对文件存储进行格式化和创建文件系统,文件管理功能已由文件存储自行管理。
        文件存储的特点是便于扩展和共享,但读写速度较慢。

⚪对象存储

        对象存储(Object Storage Service)也叫基于对象的存储,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务。对象存储和我们经常接触到的块和文件系统等存储形态不同,它提供 RESTful API数据读写接口及丰富的 SDK 接口,并且常以网络服务的形式提供数据的访问。

        对象存储不支持随机读写,只能进行全读和全写操作(无法直接在存储上进行数据更改,只能以文件为单位进行获取和删除),如果要修改数据,需要先在本地编辑完成后整文件上传。

⚪分布式存储

        在海量数据和文件的场景下,单一服务器所能连接的物理介质有限,能提供的存储空间和IO性能也是有限的,所以可以通过多台服务器协同工作,每台服务器连接若干物理介质,再配合分布式存储系统和虚拟化技术,将底层多个物理硬件设备组合成一个统一的存储服务。一个分布式存储系统,可以同时提供块存储,文件存储和对象存储这三种存储方式。

二、NFS服务

1、NFS工作原理

        NFS(Network File System)即网络文件系统,是一种基于TCP/IP协议的分布式文件系统协议,它允许网络中的计算机通过挂载的方式将远程服务器上的共享目录映射到本地文件系统中,从而使用户能够像访问本地文件一样透明地读写远程服务器上的文件,无需关心数据的实际物理位置,主要适用于Linux/Unix系统间的文件共享,也可通过兼容层支持跨平台访问。     

        NFS的工作原理基于客户端-服务器架构,通过远程过程调用(RPC)机制实现通信:服务器端启动NFS服务后,会向RPC(端口111)注册自身端口信息;客户端发起访问请求时,首先通过RPC获取服务器NFS服务的实际端口,随后直接与该端口建立连接;文件操作请求(如读取、写入)被封装为RPC请求发送至服务器,服务器执行后返回结果,整个过程对用户透明,且文件通常以8KB大小的块为单位传输,支持异步写入以提升性能。

        RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,用于在不同计算机或进程间调用服务,RPC允许一个程序(客户端)调用另一个程序(服务器)上的过程或函数,而无需了解底层网络细节,客户端发起一个远程过程调用请求,包含要调用的函数名、参数等信息。服务器接收到请求后,执行相应的函数,并将结果返回给客户端。

2、NFS安装和配置

#rocky安装,包含服务端、客户端
yum install nfs-utils

#ubuntu安装
apt install nfs-kernel-server    #服务端

apt install nfs-common           #客户端
#服务端依赖包,注册中心,nfs 服务中有大量的组件,部份组件端口并不固定,需要依赖rpcbind发布端口
[root@ubuntu2204-150 ~]# dpkg -l rpcbind
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version       Architecture Description
+++-==============-=============-============-=====================================================
ii  rpcbind        1.2.6-2build1 amd64        converts RPC program numbers into universal addresses

#查看服务端口
[root@ubuntu2204-150 ~]# ss -tunlp | grep rpc
udp   UNCONN 0      0                               0.0.0.0:55260      0.0.0.0:*    users:(("rpc.statd",pid=16114,fd=8))                                        
udp   UNCONN 0      0                               0.0.0.0:56357      0.0.0.0:*    users:(("rpc.mountd",pid=16122,fd=4))                                       
udp   UNCONN 0      0                               0.0.0.0:51266      0.0.0.0:*    users:(("rpc.mountd",pid=16122,fd=12))                                      
udp   UNCONN 0      0                               0.0.0.0:111        0.0.0.0:*    users:(("rpcbind",pid=15492,fd=5),("systemd",pid=1,fd=82))                  
udp   UNCONN 0      0                               0.0.0.0:40499      0.0.0.0:*    users:(("rpc.mountd",pid=16122,fd=8))                                       
udp   UNCONN 0      0                             127.0.0.1:602        0.0.0.0:*    users:(("rpc.statd",pid=16114,fd=5))                                        
udp   UNCONN 0      0                                  [::]:111           [::]:*    users:(("rpcbind",pid=15492,fd=7),("systemd",pid=1,fd=85))                  
udp   UNCONN 0      0                                  [::]:46225         [::]:*    users:(("rpc.mountd",pid=16122,fd=6))                                       
udp   UNCONN 0      0                                  [::]:44193         [::]:*    users:(("rpc.mountd",pid=16122,fd=14))                                      
udp   UNCONN 0      0                                  [::]:45547         [::]:*    users:(("rpc.statd",pid=16114,fd=10))                                       
udp   UNCONN 0      0                                  [::]:55862         [::]:*    users:(("rpc.mountd",pid=16122,fd=10))                                      
tcp   LISTEN 0      4096                            0.0.0.0:57313      0.0.0.0:*    users:(("rpc.mountd",pid=16122,fd=13))                                      
tcp   LISTEN 0      4096                            0.0.0.0:51571      0.0.0.0:*    users:(("rpc.statd",pid=16114,fd=9))                                        
tcp   LISTEN 0      4096                            0.0.0.0:47373      0.0.0.0:*    users:(("rpc.mountd",pid=16122,fd=9))                                       
tcp   LISTEN 0      4096                            0.0.0.0:111        0.0.0.0:*    users:(("rpcbind",pid=15492,fd=4),("systemd",pid=1,fd=61))                  
tcp   LISTEN 0      4096                            0.0.0.0:58393      0.0.0.0:*    users:(("rpc.mountd",pid=16122,fd=5))                                       
tcp   LISTEN 0      4096                               [::]:46811         [::]:*    users:(("rpc.statd",pid=16114,fd=11))                                       
tcp   LISTEN 0      4096                               [::]:35459         [::]:*    users:(("rpc.mountd",pid=16122,fd=15))                                      
tcp   LISTEN 0      4096                               [::]:37163         [::]:*    users:(("rpc.mountd",pid=16122,fd=11))                                      
tcp   LISTEN 0      4096                               [::]:58833         [::]:*    users:(("rpc.mountd",pid=16122,fd=7))                                       
tcp   LISTEN 0      4096                               [::]:111           [::]:*    users:(("rpcbind",pid=15492,fd=6),("systemd",pid=1,fd=84))  

#重启服务
[root@ubuntu2204-150 ~]# systemctl restart nfs-server.service 

#端口发生变化
[root@ubuntu2204-150 ~]# ss -tunlp | grep rpc
udp   UNCONN 0      0                               0.0.0.0:55260      0.0.0.0:*    users:(("rpc.statd",pid=16114,fd=8))                                        
udp   UNCONN 0      0                               0.0.0.0:111        0.0.0.0:*    users:(("rpcbind",pid=15492,fd=5),("systemd",pid=1,fd=82))                  
udp   UNCONN 0      0                               0.0.0.0:53422      0.0.0.0:*    users:(("rpc.mountd",pid=16579,fd=12))                                      
udp   UNCONN 0      0                               0.0.0.0:43367      0.0.0.0:*    users:(("rpc.mountd",pid=16579,fd=4))                                       
udp   UNCONN 0      0                               0.0.0.0:39411      0.0.0.0:*    users:(("rpc.mountd",pid=16579,fd=8))                                       
udp   UNCONN 0      0                             127.0.0.1:602        0.0.0.0:*    users:(("rpc.statd",pid=16114,fd=5))                                        
udp   UNCONN 0      0                                  [::]:111           [::]:*    users:(("rpcbind",pid=15492,fd=7),("systemd",pid=1,fd=85))                  
udp   UNCONN 0      0                                  [::]:35033         [::]:*    users:(("rpc.mountd",pid=16579,fd=6))                                       
udp   UNCONN 0      0                                  [::]:36146         [::]:*    users:(("rpc.mountd",pid=16579,fd=10))                                      
udp   UNCONN 0      0                                  [::]:50603         [::]:*    users:(("rpc.mountd",pid=16579,fd=14))                                      
udp   UNCONN 0      0                                  [::]:45547         [::]:*    users:(("rpc.statd",pid=16114,fd=10))                                       
tcp   LISTEN 0      4096                            0.0.0.0:34573      0.0.0.0:*    users:(("rpc.mountd",pid=16579,fd=9))                                       
tcp   LISTEN 0      4096                            0.0.0.0:46071      0.0.0.0:*    users:(("rpc.mountd",pid=16579,fd=13))                                      
tcp   LISTEN 0      4096                            0.0.0.0:51571      0.0.0.0:*    users:(("rpc.statd",pid=16114,fd=9))                                        
tcp   LISTEN 0      4096                            0.0.0.0:111        0.0.0.0:*    users:(("rpcbind",pid=15492,fd=4),("systemd",pid=1,fd=61))                  
tcp   LISTEN 0      4096                            0.0.0.0:46113      0.0.0.0:*    users:(("rpc.mountd",pid=16579,fd=5))                                       
tcp   LISTEN 0      4096                               [::]:46811         [::]:*    users:(("rpc.statd",pid=16114,fd=11))                                       
tcp   LISTEN 0      4096                               [::]:55677         [::]:*    users:(("rpc.mountd",pid=16579,fd=15))                                      
tcp   LISTEN 0      4096                               [::]:111           [::]:*    users:(("rpcbind",pid=15492,fd=6),("systemd",pid=1,fd=84))                  
tcp   LISTEN 0      4096                               [::]:50273         [::]:*    users:(("rpc.mountd",pid=16579,fd=7))                                       
tcp   LISTEN 0      4096                               [::]:46151         [::]:*    users:(("rpc.mountd",pid=16579,fd=11)) 

#由于服务端监听的端口会发生变化,所以需要依赖rpcbind对客户端提供注册服务,rpcbind端口不会发生变化

NFS服务本身并不固定在某个特定的端口上运行,而是动态地选择可用的端口。客户端在发起NFS请求时,需要知道服务器上NFS服务监听的端口号。
rpcbind服务用于管理RPC服务的端口映射,允许NFS服务在启动时注册其提供的RPC程序号、版本号以及所使用的端口号。客户端通过查询rpcbind服务,可以获取到NFS服务当前监听的端口号,从而建立连接。

#查看服务端使用的端口
[root@ubuntu2204-150 ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper    #rpcbind,早期叫portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  55260  status
    100024    1   tcp  51571  status
    100005    1   udp  43367  mountd
    100005    1   tcp  46113  mountd
    100005    2   udp  39411  mountd
    100005    2   tcp  34573  mountd
    100005    3   udp  53422  mountd
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值