kaixin
Published on 2023-10-10 / 17 Visits
0

文件共享服务

1.FTP服务器搭建

是什么是FTP:

  • 对于使用互联网的用户来说,首要目的就是获取资料,能够获取文件资料的方式有很多,其中一种就是文件传输,如今的互联网机器有各种型号、品牌,类型,如dell、惠普、浪潮、IBM、也分为个人PC、工作站、服务器、大型机、超级计算机等,并且还分为Windows、Linux、Unix、Mac等不同的操作系统。FTP的目的就是为了让这个样多机器之间进行传输文件,FTP(文件传输协议、File Transfer protocol)诞生了。

理解:

  • FTP服务器是提供文件存储于访问服务的计算机,采用的时FTP协议,FTP协议(是File Transfer Protocol)文件传输协议。支持两台计算机值件文件传输操作,可以根据实际情况设置用户登录权限,同时具有夸平台性。即在UNIX、Linux和Windows等操作系统中都可实现FTP客户端和服务器,相互之间可跨平台进行文件的传输。

image-20230827232236418

1-1.FTP的两种模式

1.主动模式(PORT):
    FTP服务器主动向客户端发起连接请求。

2.被动模式(PASV):
    FTP服务器等待客户端发起连接请求。

1-2.主动模式

数据传输建立:
    1.在主动模式下,FTP客户端会向FTP服务器的21号端口发送命令连接请求。
    2.当需要传输数据时,客户端会告诉服务器自己的一个端口(通常是随机的高端口号),然后服务器会主动从自己的20号端口向客户端指定的端口发起数据连接。

特点:
    服务器主动向客户端发起数据连接,因此称为“主动模式”。
    客户端需要开放一个端口供服务器连接,这可能会受到客户端防火墙的限制。
# 客户端的随机数据端口进行确认

image-20230827232324476


1-3.被动模式

数据传输连接:
    1.在被动模式下,FTP客户端同样会向FTP服务器的21号端口发送命令连接请求。
    2.当需要传输数据时,服务器会告诉客户端一个随机的高端口号,客户端主动向服务器的这个端口发起数据连接。

特点:
    1.客户端主动向服务器发起数据连接,因此称为“被动模式”。
    2.服务器不会主动向客户端发起连接,因此不会受到客户端防火墙的限制,但服务器端需要开放多个端口供客户端连接。
# 服务端进行确认

image-20230827232427023


1-4.总结

主动模式:
    由服务端主确认链接客户端,客户端需要开放端口,可能会收到防火墙的限制。

被动模式:
    由客户端主动的确认链接服务端,服务端需要开放多个端口,客户端不会受到防火墙的限制。

1-5.架构图上的位置

bea8f54e0def14dd4e192673271b97eb.image-20230828213431900-171561548515610


2.python文件共享

直接使用SimpleHTTPServer模块可以实现文件共享
    1.占据终端,并将日志打印
        python -m SimpleHTTPServer  8080 # python2的命令
        python -m http.server 8080 # python3的命令
    
    2.后台执行,将日志打印文件中
        1.执行命令
            nohup python -m SimpleHTTPServer >> ./pythonhttp.log
        2.查看程序pid
            job -l # 查看后台执行的程序进程号
        3.关闭
            kill pid # 关闭

# 注意:
    1.是以你当前执行这条命令时所在的目录作为文件共享。
    2.会主动打开某些后缀的文件(不提供下载),例如:.txt .log
    3.如果是文件夹没办法下载,只能tar打包进行下,只针对文件进行下载。

image-20250209222647154


3.nignx文件共享

# nginx提供了一个共享服务的模块:ngx_http_autoindex_module 自动索引目录功能。
需要nginx支持当前 ngx_http_autoindex_module  模块

文档:
    http://nginx.org/en/docs/http/ngx_http_autoindex_module.html

# 功能:
    可以指定某个文件,作为共享文件,显示大小显示创建时间,还可以设置密码。

1.使用nginx -V 确定是否支持模块

2.创建配置文件,编写内容
    vim /etc/nginx/conf.d/shared.conf

    server{
        listen 8000;
        server_name _;
        location / {
            autoindex on; # 开启文件开启目录索引
            autoindex_exact_size off;  # 展示文件大小
            autoindex_localtime on; # 展示时间
            root /opt; # 展示地址
        }
    }

image-20250209224105236


4.vsftp文件共享

说明:

  1. 本地用户模式,基于Linux本地账号密码进行认证(/etc/passwd),配置简单,但是一旦被破解,服务器信息就很危险。
  2. 匿名用户模式,任何人无需密码直接登录。
  3. 虚拟用户模式,单独为FTP创建用户数据库,基于口令验证账户信息,只适用于FTP,不会影响其他用户信息,最为安全。
1.安装
    yum install vsftp -y

2.配置文件:/etc/vsftpd/vsftpd.conf

3.注意对21端口的放行。

4-1.配置文件说明

配置文件所在位置:
    /etc/vsftpd/vsftpd.conf


默认配置查看:
    cat /etc/vsftpd/vsftpd.conf  | grep -vE '#|^$'
    
    anonymous_enable=YES 
        说明:
            yes允许匿名用户登录,可以使用 "anonymous" 或 "ftp" 作为用户名。密码一般留空,直接按 Enter 键即可。
            只能在 /var/ftp/ 文件夹下操作。
            
    local_enable=YES
        说明:
            直接使用linux本地的账户进行登录(需要本地账户有密码)。
            
    write_enable=YES
        说明:
            YES是允许写操作,NO禁止写操作。
            
    local_umask=022
        说明:
            创建时文件或者文件夹的遮罩码。
            
    dirmessage_enable=YES
        说明:
            这个选项确定是否允许 vsftpd 在用户目录中显示自定义的 README 文件。当设置为 YES 时,vsftpd 将在用户目录中寻找并显示名为 README 或 .message 的文件。
            
    xferlog_enable=YES
        说明:
            这个选项确定是否启用传输日志记录,当设置为 YES 时,vsftpd 将记录每个文件传输的详细信息,包括上传和下载的文件、时间戳、用户和 IP 地址等
    
    xferlog_std_format=YES
        说明:
            日志格式,YES标准的日志格式,NO使用扩展的日志格式。
    
    xferlog_file=/var/log/vsftp.log # 默认没有配置,记录日志需要填写。
        说明:
            日志存储文件路径位置。
            
    connect_from_port_20=YES
        说明:
            此选项指定是否允许 FTP 数据连接从 TCP 端口 20 发起。在主动 FTP 模式中,服务器使用端口 20 来发送数据。设置为 YES 将启用这个功能。
    
    listen=NO
        说明:
            这个选项确定 vsftpd 是否应该处于监听模式。当设置为 NO 时,vsftpd 不会监听任何端口。
            
    listen_ipv6=YES
        说明:
            是否启用ipv6监听。
            
    pam_service_name=vsftpd
        说明:
            选项指定用于身份验证的 PAM 服务的名称。在默认情况下,vsftpd 使用名为 "vsftpd" 的 PAM 服务进行用户身份验证。
            
    userlist_enable=YES
        说明:
            这个选项确定是否启用用户列表功能。当设置为 YES 时,vsftpd 将从 userlist_file 中读取用户列表,并根据需要执行访问控制。
            
    tcp_wrappers=YES
        说明:
            此选项确定是否启用 TCP wrappers 支持。当设置为 YES 时,vsftpd 将使用 TCP wrappers 进行访问控制。你可以配置 /etc/hosts.allow 和 /etc/hosts.deny 文件来控制允许或拒绝对 vsftpd 的访问。
            
   local_root=/var/ftp/
        说明:
            这是vsftp的默认访问的目录,可以进行修改为其他的目录。

image-20250209225436003


4-2.匿名用户设置

# 注意:
    匿名用户只能在 /var/ftp/ 文件夹下进行操作
    注意配置文件的格式,不要多空格也不会要少空格,否则会启动失败。

# 怎么登录:
    使用账户:ftp 或者是 anonymous
    密码:不需要密码,直接回车确认即可。

1.配置: /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES  # 开启允许匿名用户登录
    anon_upload_enable=YES      #允许匿名用户上传文件
    anon_mkdir_write_enable=YES    #允许匿名用户创建目录文件夹
    anon_other_write_enable=YES    #是否允许匿名用户删除、重命名等
    anon_world_readable_only=YES #当为YES时,文件的other用户必须有r权限才允许下载,即使文件的属主为ftp且对文件有r权限也无法下载,为了安全考虑,默认为YES;当为NO时,则只要属主为ftp且对文件有r权限即可下载;

2.重启服务
    systemctl restart vsftpd

3.设置权限 
    chmod 777 -R /var/ftp/pub # 给vsftp目录授权, 让匿名用户能够上传文件到此目录 /var/ftp/pub(默认文件)

image-20250209233311824


4-3.正常用户配置

# 注意:
    1.使用正常用户配置的情况下,需要放开文件访问权限(建议使用sbit特殊权限位,tmp文件权限,当前用户只能删除当前用户创建的文件,其他用户不可操作)。
    2.一定要对共享文件放开权限,不然就算配置好了,因为权限控制的问题,也会导致用户无法上传创建。
    3.只能使用普通用户登录(root用户不允许登录)# 所以需要对访问的文件权限进行控制,不然会被限制的。
    
1.创建文件夹
    mkdir /data
    chmod 1777 /data # 1权限是sbit特殊权限位 就是tmp目录的权限

2.修改配置文件
    anonymous_enable=NO # 关闭匿名用户登录
    allow_writeable_chroot=YES # 允许在共享目录下创建或者添加操作、
    local_root=/data  # 指定本地用户的默认数据根目录 
    chroot_local_user=YES # 禁锢本地用户的默认数据目录(禁止用户切换到其他目录)只能呆在指定目录中(使用ls查看当前目录就是跟目录)
    local_enable=YES # 允许本地用户登录(使用linux的用户)
    
3.重启服务
    chmod 777 -R /var/ftp/pub

image-20250209234731521


4-4.指令命令

1. 连接和断开连接
    open <hostname>:连接到指定的 FTP 服务器。
    close:关闭当前的 FTP 连接。
    bye:退出 FTP 客户端并关闭连接。
    disconnect:断开与服务器的连接,但不退出客户端。
2. 文件和目录操作
    cd <directory>:切换到服务器上的指定目录。
    lcd <directory>:切换到本地客户端的指定目录。
    dir:列出服务器当前目录的内容。
    ls:列出服务器当前目录的内容(与 dir 类似)。
    pwd:显示当前服务器的路径。
    mkdir <directory>:在服务器上创建一个新目录。
    rmdir <directory>:删除服务器上的一个目录。
    delete <file>:删除服务器上的一个文件。
    mdelete <file1> <file2> ...:删除多个文件。
    rename <oldname> <newname>:重命名服务器上的文件或目录。
    recv <remote-file> <local-file>:从服务器接收文件并保存到本地。
    get <remote-file> [local-file]:从服务器下载文件到本地。
    put <local-file> [remote-file]:将本地文件上传到服务器。
    mput <file1> <file2> ...:上传多个文件。
    mget <file1> <file2> ...:下载多个文件。
3. 文件传输模式
    ascii:设置文件传输模式为 ASCII 模式(适合文本文件)。
    binary:设置文件传输模式为二进制模式(适合可执行文件和二进制文件)。
4. 其他命令
    hash:在文件传输过程中显示哈希标记(用于显示传输进度)。
    glob:启用或禁用文件名扩展(通配符匹配)。
    prompt:启用或禁用交互式提示。
    quote <command>:发送原始 FTP 命令到服务器。
    remotehelp:显示服务器支持的命令。
    status:显示当前连接的状态。
    trace:启用或禁用调试模式,显示详细的命令和响应。
    verbose:启用或禁用详细模式。
    type:设置传输类型(ASCII 或二进制)。
    user <username> [password]:登录到 FTP 服务器,指定用户名和密码。
5. 辅助命令
    bell:在完成文件传输时发出蜂鸣声。
    debug:启用或禁用调试模式。
    append:将本地文件的内容追加到服务器上的文件中。
    send:发送文件到服务器(与 put 类似)。
    send?:显示当前的发送队列。

image-20250209235458877


4-5.链接方式

1.使用windows的cmd 或者 linux(需要安装:yum install ftp) 
    ftp 192.168.85.133 # 进行链接

2.使用访问路径
    ftp://192.168.85.133

3.使用三方软件
    winscp 或者 xftp

image-20250210000046107


5.sanba文件共享

说明:

  • FTP文件传输,的确可以让不同主机之间进行文件传输,此方式特点是传输文件,用户想要在客户端直接修改服务器的数据,还是较为麻烦。
  • Linux上有一款应用叫做Samba,是一个能让Linux系统应用微软网络通讯协议的软件,微软为了解决局域网的文件共享,制定了SMB协议,也就是(Server Messages Block,服务器消息块),后来SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。

作用:

  1. Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享。
  2. 可以用于Linux与Linux之间的资源共享。
  3. 由于NFS(网络文件系统)可以很好的完成Linux与Linux之间的数据共享,因而 Samba较多的用在了Linux与windows之间的数据共享上面。

5-1.安装

1.安装:
    yum install samba -y

2.samba配置文件
    [root@shell ~]# ls /etc/samba/*
    /etc/samba/lmhosts  /etc/samba/smb.conf  /etc/samba/smb.conf.example

5-2.默认配置文件解释

[global]:# 这部分包含了全局配置选项。
    workgroup:设置了Samba服务器所在的工作组名称。
    security:设置了安全模式为"user",这意味着用户必须提供有效的用户名和密码才能访问共享资源。
    passdb backend:指定了用于存储用户账户信息的后端数据库。
    printing, printcap name, load printers, cups options:这些选项配置了Samba与CUPS(通用Unix打印系统)集成,以便Samba可以共享打印机。
    
[homes]:# 这是一个特殊的共享,用于用户的家目录。
    comment:描述了这个共享。
    valid users:指定了谁可以访问这个共享。
    browseable:设置为No,表示这个共享在网络上不可浏览。
    read only:设置为No,允许用户对自己的家目录进行读写操作。
    inherit acls:设置为Yes,表示继承ACLs(访问控制列表)。
    
[printers]:# 这是共享打印机的部分。
    comment:描述了这个共享。
    path:指定了打印作业的存储路径。
    printable:设置为Yes,表示这是一个可打印的共享。
    create mask:指定了创建文件时使用的权限掩码。
    browseable:设置为No,表示这个共享在网络上不可浏览。
    
[print$]:# 这是用于共享打印机驱动程序的共享。
    comment:描述了这个共享。
    path:指定了打印机驱动程序的存储路径。
    write list:指定了谁有权限写入这个共享。
    force group:强制使用指定的组。
    create mask和directory mask:指定了创建文件和目录时使用的权限掩码。

image-20250210223810755


5-3.参数详解

workgroup = MYGROUP
    # Samba服务器加入的工作组名,一个局域网内,必须有相同的工作组名。

server string = Samba Server Version %v
    # Samba服务器注释,可以不选,%v代表显示Samba版本号

netbios name = samba
    # 主机NetBIOS名

interfaces = lo eth0
    # 设置Samba服务器端监听网卡,可以写网卡名称或者IP地址

hosts allow/deny = 10.10.10.1 
    # 允许连接到Samba server客户端IP,多个参数用空格分开。可以用一个IP表示,也可以用一个网段表示。

max connections = 0
    # 用来指定连接Samba server服务器最大连接数如果操作则连接请求被拒绝。0表示不限制。

deadtime = 0
    # 来设置断掉一个没有任何文件的链接时间。单位十分钟,0代表Samba server不自动断开任何连接

time server = yes/no
    # 用来设置让nmdb成为Windows客户端的时间服务器

log file = /var/log/samba/%m.log
    # 设置Samba server日志文件存储位置和日志名称。文件后面加一个%m(主机名),每个主机都会有一个主机名.log日志文件

max log size = 50
    # 限制每个日志文件的最大容量为50KB,0代表不限制

Security = user
    # 设置客户端访问Samba服务器的验证方式,Samba4版本已经不使用share和server方式,这里不介绍
        1) user:Samba用户名和密码登录
        2) domain:添加Samba服务器到N域,由NT与控制起来进行身份验证。域安全级别,使用主域控制器(PDC)来完成认证

passdb backend = tdbsam
    # 后台管理用户密码方式
        1)smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户
        2)tdbsam:该方式则是使用一个数据库文件来建立用户数据库。
        3)ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。

smb passwd file = /etc/samba/smbpasswd
    # 用来定义samba用户的密码文件。smbpasswd文件如果没有那就要手工新建。

username map = /etc/samba/smbusers
    # 用来定义用户名映射,比如可以将root换administrator、admin等。

guest account = nobody
    # 用来设置guest用户名。

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
    # 用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度

load printers = yes/no
    # 设置是否在启动Samba时就共享打印机。

5-4.创建samba账户

命令:
    pdbedit

参数:
    -a <user> # 创建账户
    -r <user> # 修改账户
    -x <user> # 删除账户
    -L <user> # 列出用户列表
    -u <user> # 指定一个用户名
    -Lv # 列出Samba用户列表详细信息。
    -c [D] -u <user> # 暂停该Samba用户账号。
    -c [] -u <user> # 恢复该Samba用户账号。

5-5.创建操作

1.修改/etc/samba/smb.conf配置文件 # 不要有注释
    [smb_share] # 名字
        comment= share dir # 说明注释
        path = /data # 共享路径
        guest ok = no #  是否禁止匿名用户
        public = no # 用来指定该共享是否允许guest账户访问
        writable = yes # 用来指定该共享路径是否可写
        
   # 注意 /data目录需要存在

2.创建用户,samba创建的用户必须在linux用户中存在(跟security配置有关系,如果是user那么必须与linux用户关联)
    useradd  wkx # 创建一个linux的用户
    pdbedit -a -u wkx # 使用pdbedit设置samba用户密码

3.修改权限
    chown -R wkx.wkx /data

4.启动或者重启
    systemctl start smb

5.查看端口
    netstat -tunlp | grep smbd

image-20250210225903655


5-6.连接

5-6-1.linux链接

1.安装客户端
    yum install -y samba-client 

2.使用命令链接samba服务端
    -L:显示服务器端所分享出来的所有资源; 
    -U<用户名称>:指定用户名称; 
    语法:
        smbclient -L //ip地址/samba中定义的区块名字 -U 用户名

    smbclient -L //192.168.19.170/smb_share -U wkx # 列出全部资源
    smbclient //192.168.19.170/smb_share -U wkx # 进入交互模式

image-20250210225722371


5-6-2.windows链接

1.打开控制面板

2.点击程序

3.启动或者关闭windows功能

4.勾选smb文件共享支持

5.重启计算机后才能开启

6.进行链接
    \\ip地址\链接的smb名称 # 在输入账户密码即可

image-20250210231208165


NFS网络存储服务

是什么:

  1. samba主要用于linux与windows之间共享文件夹。
  2. 用于Linux之间进行文件共享则是用NFS服务(Network FileSystem)。 NFS服务可以将远程Linux系统上的文件共享资源挂载到本地机器的目录上,NFS很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和Linux系统的samba服务类似。
  3. 一般情况下,Windows网络共享服务或samba服务用语办公局域网共享,而中小型网站集群架构后端通常用NFS数据共享,如果大型网络集群,还会用更复杂的文件系统,如GlusterFS、FastDFS等。
  4. NFS系统已有30年发展历史,代表了一个稳定的网络文件系统,具备可扩展,高性能等特点。由于网络速度的加快和延迟的减少,NFS系统一直是通过网络提供文件系统的不错的选择,特别是在中小型互联网企业用的广泛。

作用:

  • 简单说就是将很多台服务器的数据,都可以保存在同一个存储服务器上。这样可以在服务器集群内,数据统一存储到一台机器上,以实现共享存储。这样在基于负载均衡的web集群下,用户无论请求哪一台机器都可以获取到同样的数据。

理解:

  • 可以理解为它就是一个windows网络网盘的性质相同,任何机器都可以根据要求进行链接。A机器上传数据,B机器可以使用。

出现的原因:

  • 用户A上传了一张图片,被负载均衡服务器分发到了web01上,并存储到web01服务器本地,用户B需要看到用户A上传的图片,但是负载均衡服务器分发到了web02上,web02本地并没有存储用户A上传的图片。那么对用户B的体验就很差。
  • 要不然就是,当用户A上传图片A机器,同时将图片在复制一份B机器上。这样会浪费大量的资源,而且需要考虑到删除更新等操作。

image-20230902193038149

解决:

  • 如果配置了NFS网络存储服务,那么就可以将静态的资源统一的放在网络存储服务中,当进行访问时无论是负载均衡到那个机器上都可以看到图片。

image-20230902193259909

NFS在企业的应用架构作用:

  • 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、静态文件,通常网站用户上传的文件也都会放在NFS共享里,例如BBS产品(论坛)产生的图片、附件、头像等,然后前端所有的节点访问静态资源时都会读取NFS存储上的资源。
  • 阿里云等公有云平台的NAS就是云版的NFS服务应用。例如:奔驰官网,需要展示大量的图片,动态图,html网页文件,这些都是存储在服务器上的。

image-20230902192302746

**红帽文档:**https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/index

1.场景与架构图的位置

作用原理:
    1.NFS主要使用在局域网下,让不同的主机之间可以共享文件、或者目录数据。
    2.主要用于linux系统上实现文件共享的一种协议,其客户端主要是Linux。
    3.没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用。
    4.支持多节点同时挂载及并发写入。

场景:
    1.在服务器集群下,多台web服务器的图片、HTML、视频等静态资源,全都统一保存在NFS服务器上。
    2.以及NFS服务器也可以当做备份服务器。

image-20230902192059774


1-1.使用的协议

# nfs使用就是rpc协议进行数据的传输
    RPC(Remote Procedure Call Protocol): 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务。
   
NFS程序运行后,产生如下组件
    1.rpcbind:负责NFS的数据传输,远程过程调用 tcp/udp协议 端口111。
    2.nfs-utils:控制共享哪些文件,权限管理。

1-2.RPC

RPC(Remote Procedure Call,远程过程调用)协议是一种允许一个程序(客户端)通过网络请求另一个程序(服务器)执行某个过程(或函数)的通信协议。RPC 的核心思想是让客户端像调用本地函数一样调用远程服务器上的函数,而隐藏了底层的网络通信细节。


简单理解:
    我在百度上搜索'笔记本排行榜',虽然在我的电脑上的浏览器中搜索的,但是实际是发送给百度的服务器,百度服务器通过解析搜索的内容,将结果发还给我,这就是远程过程调用rpc。

远程调用:
    代码文件放在远程服务器上,在自己笔记本上,远程调用、执行该代码文件,执行结果会通过网络把数据发回来,这就是rpc远程过程调用。

本地过程调用:
    如hello-world.py ,本地运行该程序,这就是本地过程调用(执行程序,拿到结果)。

# 比如:
    同样是洗衣服,一个本地洗,一个远程洗。
    # 本地过程调用
        你在家里,要洗衣服,你直接把衣服放到洗衣机,开启洗衣机开关,这就是本地过程调用。
    # 远程调用
        你不在家里,你打个电话回家里,跟妈说帮忙洗个衣服,这就是远程过程调用。
    一个计算任务,不需要本机完成,交给远程机器完成,然后返回结果,

image-20250211231304588


1-3.NFS与RPC关系

# nfs是通过网络进行传输数据的,因此nfs需要使用port来传输数据

1.nfs的端口是随机的
    nfs是随机端口,就好比银行的窗口,你不知道今天是1号开启业务,还是2号开启业务,nfs在传输数据时,怎么知道nfs服务器使用的端口是那个,需要通过nfs使用的rpc 远程过程调用协议来实现的。

2.nfs结果rpcbind的通信原理
     每次NFS启动它的端口号是动态的,当前启动时,需要启动一个rpcbind程序,这个程序会将nfs启动的端口号进行注册,这样当前访问时,会先从rpcbind程序中拿到nfs的端口,在通过端口号找到nfs服务拿数据。

3.nfs软件启动顺序
    1.启动rpcbind
    2.启动nfs

1-4.NFS建立请求过程

1.启动rpcbind
2.NFS服务端启动后、将自己的端口信息,注册到rpcbind服务中,所以需要先启动rpcbind
3.NFS客户端通过TCP/IP的方式,连接到NFS服务端提供的rpcbind服务,并且从该服务中获取具体的端口信息
4.NFS客户端拿到具体端口信息后,将自己需要执行的函数(linux内核函数),通过网络发给NFS服务端对应的端口
5.NFS服务端接收到请求后,通过rpc.nfsd(基于nfs-utlils工具)进程判断该客户端是否有权限连接
6.NFS服务端的rpc.mount进程判断客户端是否有读写的操作权限
7.最终NFS服务端会将客户端请求的函数,识别为本地可以执行的命令,传递给内核、最终内核驱动硬件

# 第5,6 就是校验当前的链接是否有链接权限,读写需权限。
# 结论:nfs的客户端、服务端之间的通信基于rpc协议,且必须运行rpcbind服务。


如下:
    1.nginx读取nfs服务器的数据
    2.先从rpcbind程序上获取nfs的端口
    3.在通过nfs端口访问nfs服务,访问nfs服务上某些资源
    4.nfs服务调用linux内核函数,在nfs服务的磁盘上找到资源
    5.在将资源返还给nginx

image-20230902233814514


1-5.NFS工作原理

注意:
    1.在启动NFS服务端之前,必须先启动RPC服务,在centos7服务器下为rpcbind服务,否则NFSserver无法向RPC注册信息了。
    2.另外如果RPC服务重启,原来注册的NFS服务端信息也就失效了,也必须重启服务,再次注册信息给RPC服务(rpcbind也需要重启)。
    3.特别要注意的是,修改NFS配置文件后不需要重启NFS,只需要执行exportfs -rv 命令即可或是systemctl reload nfs。

image-20250211233217937


1-6.rpcbind作用

1.该服务是nfs启动时,将nfs端口号注册到rpcbind服务中。
2.nfs的数据传输是通过rpc协议的。NFS服务就是使用RPC协议的帮忙,RPC服务实现的功能是记录每个NFS功能对应的端口号,并且在NFS客户端发出请求的时候,把该功能和对应的端口信息传递给发出请求的NFS客户端,保证客户端能够正确的连接到NFS的端口,达到数据传输的目的。

# RPC就好比是一个中介,处在客户端、服务端之间。
    类似租房子房源在中介手中,房东的资料在中介手中,我们需要找到中介找到心仪的房子,在通过中介找到租房的房东签合同入住。

image-20250211233729060


2.NFS服务端部署

2-1.服务端安装

# 注意/作用:
    1.nfs-utils:NFS服务的主程序,包括了rpc.nfsd、rpc.mountd这两个守护进程以及相关文档,命令。
    2.rpcbind:是centos7/6环境下的RPC程序。

1.安装
    yum install nfs-utils rpcbind -y

2.确认是否安装
    rpm -qa nfs-utils rpcbind

image-20250212222406135


2-2.配置语法说明

1.nfs-utils默认配置文件路径是:
    /etc/exports

2.rpcbind默认配置文件路径:
    /etc/sysconfig/rpcbind 
    # 安装好 rpcbind 后不需要修改其配置文件。rpcbind 的主要作用是将 RPC 程序编号映射到 IP 地址和端口号组合,以便 NFS 服务能够正常通信,大多数标准的 NFS 部署中,使用默认配置即可满足需求。如果需要修改端口(111)可以修改当前配置文件。

3.nfs-utils 配置文件语法如下:
    NFS共享目录  NFS客户端地址(参数1、参数2...) 客户点地址2(参数1、参数2...)
    例如:
        1.共享根目录 使用的host(主机名,只允许hostname2)解析作为读写操作
            /	hostname1(rw)  hostname2(rw,no_root_squash)
            
        2.共享/pub目录 *全部的只要能pind通的都可以访问读写操作
            /pub	*(rw)
        
        3.共享/home/chao文件,指定具体的可以访问地址只读
            /home/chao   123.206.16.61(ro) # 限制只有 123.206.16.61 才可以链接使用。

# 解释:
    1.NFS共享目录:为NFS服务器要共享的实际目录,必须绝对路径,注意目录的本地权限,如果要读写共享,要让本地目录可以被NFS客户端的(nfsnobody)读写。
    2.NFS客户端地址,也就是NFS服务器端授权可以访问共享目录的客户端地址。
    3.权限参数,对授权的NFS客户端访问权限设置。

2-3.NFS客户端地址语法

客户端地址 具体地址 说明
单一客户端 192.168.178.142 只是当前ip可以进行链接访问。
整个网段 192.168.178.0/24 网段下可以进行链接访问。
授权域名客户端 nfs.yuchaoit.cn 弃用,某可客户端的主机名(需要设置hosts文件)。
授权整个域名客户端 *.yuchaoit.cn 弃用,客户端的主机名(需要设置hosts文件)。
全部,不做限时 * 针对全部,只要可以连接服务端都可以连接。
共享主机:
    *   :代表所有主机
    192.168.0.0/24:代表共享给某个网段
    192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享给不同网段
    192.168.0.254:共享给某个IP
    *.xxxx.cn:代表共享给某个域下的所有主机

2-4.NFS权限参数说明

参数 说明
ro 只读
rw 读写
root_squash 当nfs客户端root访问时,它的权限映射为NFS服务端的匿名用户,它的用户UID与GID会变成nfsnobody。例如:客户端在文件夹中创建了 123文件夹,那么它的UID与GID就是nfsnobody,使用的是nfsnobody用户权限
no_root_squash 与root_squash相同,但映射客户端的root为服务器的root,不安全,避免使用。例如:客户端在文件夹中创建了 123文件夹,那么它的UID与GID就是root在客户端使用root拥有服务端root的权限。
all_squash nfs客户端用户映射为匿名用户nfsnobody,生产常用参数,降低用户权限,增大安全性。也就是无论是什么样的用户使用,统统在服务端中都是匿名用户。
sync 数据同步写入到内存与硬盘,优点数据安全,缺点性能较差。
async 数据写入到内存,再写入硬盘,效率高,但可能内存数据会丢。
insecure 允许客户端使用非特权端口(大于 1024 的端口)来访问 NFS 共享。NFS 通常要求客户端使用特权端口(1024 以下)进行通信,因为这些端口通常由系统级进程使用,更安全。但某些客户端可能无法使用特权端口,此时可以使用 insecure 参数放宽限制。可以使用非特权的端口,常规端口
anonuid 客户端访问(无论是什么用户)其操作会被映射到这个指定的 UID,用法:anonuid=1000
anongid 客户端访问(无论是什么用户)其操作会被映射到这个指定的 GID,用法:anongid=1000
说明:anonuid和anongid参数和all_squash一起使用。
    这三个参数一起使用,将所有客户端用户映射为同一个用户和同一个用户组,从而限制他们的权限。
    all_squash:将客户端访问的全部用户都转为:nfsnobody
    anonuid:设置用户uid
    anongid:设置用户gid
    # 也就是说,当使用这三个参数后,客户端无论什么用户访问,它的权限就是 uid=anonuid,gid=anongid。

例如:
    /nfsShare 192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
    all_squash:将所有客户端用户映射为匿名用户。
    anonuid=1000:将匿名用户的 UID 设置为 1000。
    anongid=1000:将匿名用户的 GID 设置为 1000。

2-5.示例配置

1.示例
    /home/chaoge/log   192.168.178.0/24(ro)
    解释:
        共享的目录:/home/chaoge/log 
        ip地址:192.168.178.0/24 网段,也就说这个网段都可以进行连接挂载。
        权限:(ro) 只读权限,网段内的机器只能读取/home/chaoge/log内容无法编辑修改。

2.示例
     /nfsShare *(insecure,rw,sync,root_squash)
     解释:
     	共享的目录:/nfsShare
        ip地址:* 代表全部的ip地址,没有任何限制。
        权限:(insecure,rw,sync,root_squash) 可以使用非特权端口(大于1024),读写权限,异步写入操作,客户端使用root用户访问NFS共享时,权限会被压缩为匿名用户。


# 配置解释:
    共享目录        共享选项
    /nfs/share      *(ro,sync)

image-20250212224914018


2-6.配置修改-实际操作

1.创建NFS共享文件目录
    mkdir /nfs-data

2.修改配置文件 /etc/exports
    /nfs-data	192.168.85.0/24(rw,sync,root_squash)
    # 192.168.85.0/24可以连接,可以读写,实时同步,客户端在当前共享文件创建文件的权限都是:usre :nfsnobody group:nfsnobody

3.确定匿名用户都存在
    id nfsnobody

4.对共享文件设置权限
    chown nfsnobody.nfsnobody /nfs-data

image-20250212230732961


2-7.启动服务-实际操作

1.启动rpcbind服务
    systemctl start rpcbind.service
    systemctl start rpcbind.socket

2.启动nfs服务
    systemctl start nfs

3.查看是否启动成功
    showmount -e NFS服务端的ip # 当前命令可以列出服务端的共享文件信息

image-20250212231103827


2-8.配置文件修改后-实际操作

# 注意
    1.果nfs的配置文件修改了,不需要重新启动rpcbind,使用重新加载的方式,防止nfs端口发生变化。
    2.使用nfs服务的链接其他服务器要是多的情况下,重启nfs服务,那么端口号就发生变化,就需要重启其他服务的nfs服务rpcbind。
    
1.方式1
    systemctl reload nfs

2.方式2
    exportfs -r

3.NFS客户端部署

3-1.安装

1.安装 # nfs-utils用于挂载 NFS 共享目录的工具, rpcbind NFS 依赖于 RPC 机制来通信,因此客户端和服务器端都需要安装
    yum install nfs-utils rpcbind -y

2.启动rpcbind工具 # 作用为了与服务端rpcbind服务通信,不用启动nfs服务
    systemctl start rpcbind

3.查看服务端的NFS的状态
    showmount -e NFS服务端的ip

image-20250212233956218


3-2.挂载使用

1.挂载
    # mount -t 指定挂载的文件系统 ip地址:挂载的文件夹 被挂载的文件夹
    mount -t nfs 192.168.85.133:/nfs-data /mnt
    
2.取消挂载:
    umount /tesk-nfs

3.创建文件进行查看
    mkdir /mnt/123_c_test && df -h

4.永久挂载
    # 编辑 /etc/fstab 添加
    192.168.85.133:/nfs-data /mnt nfs defaults 0 0

# 注意:
    挂载的ip是nfs服务器指定好的网段或者ip,如果不是服务器指定的就会报错。
    [root@web-07 ~]$mount -t nfs 10.0.0.31:/nfs-data /tesk-nfs
    mount.nfs: access denied by server while mounting 10.0.0.31:/nfs-data

image-20250212234557974


4.NFS的权限说明

关于NFS配置:

  1. nfs服务的配置文件/etc/exports。
  2. 在配置时确定定义 ro 还是 rw 权限,使用的时 all_squash(全部用户被映射为nfs服务的nfsnobody用户) 还是 root_squash(只有root用户被映射为nfs服务的nfsnobody用户)。
  3. 一般服务端的共享文件夹是不会给 other权限,都是通过配置文件,对客户端用户的身份映射(客户端无论是什么权限,只要在NFS共享文件中操作,就要按照NFS服务端设置的权限来)。

关于匿名用户:

  • 除了默认是nfsnobody用户,还可以指定用户,添加anonuid与anongid配置参数,通过这三个参数的组合,可以指定其他的映射用户。这种操作在生产环境下常用。

注意:

  1. 查看客户端登录的用户是谁,是root还是其他用户,与服务端的参数挂钩(也就是all_saquash,root_saquash)。
  2. 除了nfs配置的参数,共享文件自带的权限本身(rwx),也需要进行修改。
  3. nfsnobody用户或者其他用户,在服务端设置了指定的用户或者还是使用nfsnobody用户,在'客户端'创建还是访问都是以'nfsnobody用户与其他用户'身份进入挂载目录,和客户端的用户权限无关,也就是客户端无论以什么身份进入挂载服务端nfs目录,都是nfs的服务端的设置权限/etc/exports有直接关系。

补充说明:

  • 当前客户端访问nfs服务端时,需要经过两道权限验证。
    1. /etc/exports 中设置的共享文件权限。
    2. 服务端共享文件本身在的权限。

4-1.故障

如果出现NFS卡死的情况,导致无法取消挂载:
    umonut -fl /usr/share/nginx/html # 强制取消挂载

然后再排查nfs服务器是否正常运行即可。

5.实践操作

实现nginx静态文件NFS共享

  • 准备3台机器,两台作为nginx,1台是NFS服务器,nginx静态文件存储放在NFS共享的文件夹中。
机器 名称 作用
192.168.85.133 test-1 NSF服务端。提供NFS网络存储服务。
192.168.85.143 test-2 nginx,提供网页访问。
192.168.85.144 test-3 nginx,提供网页访问。
  • 需要保持test-2与test-3的内容相同,只要修改test-1NFS网络存储的静态文件,这两台nginx页面就需要变化。

1.配置NFS共享服务端

1.创建用户与用户组
    groupadd -g 1500 www && useradd -u 1500 -g 1500 www
    
2.创建文件并且授权
    mkdir /www && chown www.www /www

3.修改配置
    /www 192.168.85.143(ro,no_root_squash,anonuid=1500,anongid=1500,sync) 192.168.85.144(ro,no_root_squash,anonuid=1500,anongid=1500,sync)
    # 解释:
        ip:只对这两个ip放开可以连接
        no_root_squash:无论访问的用户是谁,都是匿名用户
        anonuid与anongid:访问用户的uid与gid
        # 将全部的访问的用户限制为同一个udi和gid
        sync:同步
    
4.重启加载配置,验证查看
    exportfs -r  && showmount -e 127.0.0.1

5.写入一个首页文件
    echo "NFS Server" > /www/index.html

image-20250213224237310


2.配置nginx(test-2,test-3)

1.安装nfs(使用nfs)与rpcbind
    yum install nfs-utils rpcbind -y

2.启动rpcbind服务
    systemctl start rpcbind

3.使用命令查看NFS共享服务
    showmount -e 192.168.85.133

4.挂载当前配置
    mount -t nfs 192.168.85.133:/www /mnt

5.安装nginx
    yum install nginx -y 

6.添加配置
    vim /etc/nginx/conf.d/nfs.conf
    server {
        listen 8080;
        server_name _;
        root         /mnt/;
        location / {
            index index.html;
        }
    }
    
7.启动nginx
    systemctl start nginx && netstat -tunlp | grep 8080

8.访问
    192.168.85.143:8080
    192.168.85.144:8080

image-20250213230226532


3-3.注意

注意:
    1.由于NFS设置的权限是只读权限 ro 客户端机器是无法进行创建文件和写入文件内容的。
    2.客户端查看当前NFS共享服务的内容文件内容:
        [root@test-2 mnt]# ls -l /mnt/
        total 4
        -rw-r--r-- 1 1500 1500 11 Feb 13 09:59 index.html
        # 为什么是 1500 而不显示用户名称
            原因:NFS服务端配置 no_root_squash,anonuid=1500,anongid=1500,所以在这个目录下创建的文件或者文件夹的用户id与用户组id都是 1500,为什么只显示1500而不显示用户名,因为在客户端中,没有uid是1500的用户和用户组,所以就会显示NSF服务端设置的id值。

image-20250213230736240


备份实时同步

为什么要用实时备份:

  • NFS 提供了高效的文件共享和访问机制,但它并不能替代数据备份。备份是数据保护的最后一道防线,能够确保数据的安全性、完整性和可用性。因此,即使使用了 NFS 服务,仍然需要定期进行备份,以满足数据保护和合规性要求。
  • NFS只有一台服务器,如果挂了那么就会导致整个业务的使用NFS共享文件内容的机器出现问题,所以需要有一台或者多太机器进行实时备份,防止NFS挂了,导致出现大故障。避免单点故障。

image-20230903222312607

简单架构图:

image-20250213232009656

1.备份方案

备份方案:

  1. 定时备份,周期方案分为两类
    1. 后台程序代码、运维配置文件修改,一般会定时任务执行脚本进行文件备份,然后配置Rsync工具推送到远程服务器备份。
    2. 对于数据库文件用定时任务脚本配合数据库提供的备份工具,定时生成备份文件,配合Rsync备份到远端。
    3. 存在缺陷,最小的时间为1分钟,也就是说1分钟内的数据是无法进行同步,容易导致这一分钟内的数据丢失。
  2. 实时备份
    1. 实施复制是最适合企业备份重要数据的方式,用于用户提交的数据备份,对于用户提交的普通文件(jpg、tar、zip、MP4、txt、html)等待,都可以用Inofity+Rsync实时备份方案。
    2. 对于数据文件,还有更复杂的分布式存储方案,把数据同时备份成多份,如FastDFS、GlusterFS等。
    3. 对于提交到数据库中的数据,还可以用数据库的主从复制(如MySQL),这是软件自带的实时备份。

image-20230903222842600

注意:

  • 使用inotify一类的工具,需要使用rsync中得'密码文件(rsync中虚拟账户的密码写入文件中)'配置的,进行同步时,需要将'密码文件的权限设置为600',不然自动同步会报错(同步工具,手敲的或者是crontab的也需要设置)。

1-1.rsync+crond定时备份

注意:

  • 这种方式不是实时备份,存在一分钟的时间差,如果在这一分钟内NFS挂了那么就会导致少了一分钟的数据。

image-20230903222949708

1-2.rsync+inotify实时同步

  • 属于实时备份,只要有新的数据写入,立马就会被inotify监听执行rsync进行备份。
  • 通过inotify会进行实时监听,新数据写入,立马调用rsync备份。

image-20230903223027323

1-3.结合NFS实时备份

  • 结合 nginx + nfs + inotify +rsync 进行实时备份操作

image-20250213233034671

2.实时同步的难点

1.在什么条件下进行同步,是文件修改了,查看了,增加了(这是linux文件系统的操作机制)。
2.同步哪些文件。
3.多久进行同步。
4.使用什么同步工具。

3.实时同步工具

1.inotify-tools 系统自带的一般的工具 # linux自带工具
2.sersync 金山云的运维通过c++开发的工具 # 了解
3.lsyncd 最新的工具,适用于大规模的服务器环境工具 # 推荐


# 注意:
    同步备份操作,是对服务端的操作进行备份。
    但是客户端也是可以。

4.inotify工具

说明:

  • linux支持inotify机制, 在性能上还可以优化,支持更好的文件并发数, 检测多少文件,文件内容大量的发生变化,inotify机制能同时检查多少文件,需要调整linux的几个参数。

怎么知道机器支持inotufy:

[root@nfs-31 ~]$ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Sep  4 07:14 max_queued_events
-rw-r--r-- 1 root root 0 Sep  4 07:14 max_user_instances
-rw-r--r-- 1 root root 0 Sep  4 07:14 max_user_watches


max_user_watches:   
    设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
    默认只能监控8192个文件

max_user_instances:    
    设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
    默认每个用户可以开启inotify服务128个进程

max_queued_events:    
    设置inotify实例事件(event)队列可容纳的事件数量
    默认监控事件队列长度为16384
    
# 3中同步类型的工具,本质上就是优化这三个文件参数,检测某个目录。发送rsync指令进行备份。

inotyfiy机制:

image-20250215133213002

4-1.安装

1.安装命令:
    yum install inotify-tools -y

# 安装后,会有两个命令:
    inotifywait:
        作用:在被监控的目录等待特定文件系统事件(open、close、delete等事件),执行后处于阻塞状态,适合在Shell脚本中使用,是实现监控的关键 # 主要使用
    
    Inotifywatch:
        作用:
            收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)# 不会使用

4-2.inotifywait命令使用

命令:
    inotifywait

作用:
    用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树

语法格式:
    inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]

参数:
    -m: 即“–monitor” 表示始终保持事件监听状态。
    -d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数
    -r: 即“–recursive” 表示递归查询目录
    -q: 即“–quiet” 表示打印出监控事件
    -o: 即“–outfile” 输出事情到一个文件而不是标准输出
    -s: 即“–syslog” 输入错误信息到系统日志
    -e: 即“–event”, 通过此参数可以指定要监控的事件,
        常见的事件:
            modify、
            delete、
            create、
            close_write、
            move、
            close、
            unmount、
            attrib等
    -format:指定输出格式
        常用的输出格式:
            %w:表示发生事件的目录
            %f:表示发生事件的文件
            %e:表示发生的事件
            %Xe:事件以“X”分隔
            %T:使用由-timefmt定义的时间格式
            -timefmt:指定时间格式,用于-format选项中的%T格式

4-3.支持的监控事件

# 利用Inotify软件监控的事件主要是如下,使用命令,需要指定的那些事件,指的就是你想监控文件内容变化了,还是被删了,还是正在被编辑,被修改,等情况。

也就是inotiry 的 -e 参数指定。
事件名称 含义
access 文件或目录被读取
modify 文件或目录内容被修改
attrib 文件或目录属性被改变
close 文件或目录封闭,无论读/写模式
open 文件或目录被打开
moved_to 文件或目录被移动至另外一个目录
move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create 文件或目录被创建在当前目录
delete 文件或目录被删除
umount 文件系统被卸载
close_write 文件被关闭或者写入被监听

4-4.监控事件解释

可监控事件:
    有几种事件能够被监控。比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。
名称 说明
IN_ACCESS 被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
IN_MODIFY 被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
IN_ATTRIB 被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
IN_CLOSE_WRITE 一个打开的,等待写入的文件或目录被关闭。
IN_CLOSE_NOWRITE 一个以只读方式打开的文件或目录被关闭。
IN_CLOSE 一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行的逻辑操作
IN_OPEN 文件或目录被打开。
IN_MOVED_FROM 被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
IN_MOVED_TO 文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
IN_MOVE 可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
IN_CREATE 在被监控目录中创建了子目录或文件。
IN_DELETE 被监控目录中有子目录或文件被删除。
IN_DELETE_SELF 被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
IN_MOVE_SELF 监控项目本身被移动。

4-5.inotiywait语法

命令:
    inotifywait -mrq   --timefmt "%d/%m/%y %H:%M" --format "%T %w %f %e" -e create /监控目录

解释:
    -m 保持事件监听状态
    -r 递归查看监控目录
    -q 打印监控事件,输出到面板中
    --timefmt "%d/%m/%y %H:%M" # 指定时间格式
    --format "%T %w %f %e" # 指定打印时间格式和事件输出格式。
    -e create # 事件,监控创建事件
     /监控目录 # 被监控的目录路径

如果被监控的目录内创建文件,那么就会触发当条命令。

image-20250215141023557


4-6.实践操作

4-6-1.所有事件监控

命令:
    默认不指定 -e 参数,就是监控全部,无论是查询,创建,删除等等只要在当前目录进行操作,就会被inotiry命令监控到。

1.创建一个文件夹
    mkdir /data

2.使用inotify监控这个文件
    inotifywait -mrq --timefmt "%F" --format "%T %w %f 捕获到的事件是:%e" /data
    解释:
        --timefmt "%F" :%F 输入年月日
        --format "%T %w %f 捕获到的事件是:%e":输出定义的格式 %w 输出发生事件的目录 %f:发生事件的文件 %e:发生事件的是什么	
        # 因为没有具体指定哪个事件,默认是监控全部的事件

image-20250215140136636


4-6-2.cerate/delete事件使用

# 使用create 与 delete 的,那么只会对创建于删除进行监控

1.命令
    inotifywait -mrq --timefmt "%F" --format "%T %w %f 捕获到的事件是:%e" -e create,delete /data

image-20250215141912903


4-6-3.move事件使用

# 使用move事件,只有文件或者文件夹被移动才会触发

1.命令:
    inotifywait -mrq --timefmt "%F" --format "%T %w %f 捕获到的事件是:%e" -e move /data

image-20250215142250041


4-7.总结

优点:
    1.linux内核本身支持inotiry
    2.多种的事件,可以灵活监控文件变化的神器

缺点:
    1.如果并发修改的文件超过200个,同步会延迟,以及会丢掉部分文件,这是inotifywait软件的bug,官网有说明。
    2.该脚本监控到事件后,调用rsync是单进程执行,一次cpu只会同步一次rsync命令,效率很低,大数据量下没法使用。
    3.自己写的脚本,其实问题还是很多的,简单场景没问题,高并发,复杂场景下,要求多的情况下,那就有点羞涩了。
    

4-8.使用inotiry备份脚本

#!/bin/bash

# 监控的目录
WATCH_DIR="/data"

# 备份目录
BACKUP_DIR="/data_backup"

# 确保备份目录存在
mkdir -p "$BACKUP_DIR"

# 监控目录变化并执行备份操作
inotifywait -m -r -e create,modify,delete,moved_to "$WATCH_DIR" |
while read -r directory events filename; do
    echo $directory $events $filename
    # 获取完整文件路径
    FILE_PATH="${directory}${filename}"

    # 获取当前时间戳
    TIMESTAMP=$(date +%Y%m%d%H%M%S)

    # 根据事件类型进行备份
    if [[ "$events" =~ (CREATE|MODIFY|MOVED_TO) ]]; then
        # 创建备份目录
        BACKUP_PATH="$BACKUP_DIR/${filename}_$TIMESTAMP"
        mkdir -p "$(dirname "$BACKUP_PATH")"

        # 复制文件到备份目录
        cp -p "$FILE_PATH" "$BACKUP_PATH" # 可以不是用cp可以使用rsync增量备份操作
        echo "创建 $FILE_PATH 备份 $BACKUP_PATH"
    elif [[ "$events" =~ DELETE ]]; then
        echo "删除: $FILE_PATH 不备份"
    fi
done


# inotifywait -m -r -e create,modify,delete,moved_to "$WATCH_DIR" |while read -r directory events filename; do
    inotifywait 通过管道将每次捕获到事件时,会输出一行文本:<目录路径> <事件类型> <文件名>
    while read -r 接受这行文本的三个变量参数。

5.serssync工具

网址:

说明:

  1. 提到数据同步就必然会谈到rsync,一般简单的服务器数据传输会使用ftp/sftp等方式,但是这样的方式效率不高,不支持差异化增量同步也不支持实时传输。针对数据实时同步需求大多数人会选择rsync+inotify-tools的解决方案。
  2. sersync是国人基于前两者开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。Sersync项目利用Inotify和Rsync工具技术实现对服务器数据实时复制。当事件发生变化后,利用rsync命令把变化的数据复制到远端服务器上。

特点:

  1. 使用C++编写,支持对监控事件的过滤,Sersync采用xml配置文件,由守护进程启动,配置起来比起简易的inotify+rsync更简单。
  2. 使用多线程复制,可以并发复制多个不同文件,效率更高,Sersync自带异常检测机制,可以通过失败队列对出错的文件重新复制。
  3. 自带crontab功能,实现对失败队列中的文件定时整体复制,自带socket和HTTP协议扩展,定制特殊需求,二次开发。

缺点:

  • 缺少了后期的维护,性能存在问题,小规模生产环境已经可以直接使用了。

5-1.安装使用

# sersync工具是需要借助rsync命令

1.安装下载
        cd /opt && wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz

2.解压
    tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz

3.修改配置文件即可
    cd  GNU-Linux-x86
    vim confxml.xml

5-2.命令参数

参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序

5-3.使用

机器 作用
test-2 192.168.85.143 作为rsync服务端,NFS备份服务器
test-3 192.168.85.144 作为rsync客户端,NFS的服务端,安装sersync

5-3-1.rsync服务端,NFS备份服务器

# 配置rsync服务端
1.安装命令
    yum install rsync -y

2.修改配置文件
    vim /etc/rsyncd.conf
    uid = www 
    gid = www 
    port = 873
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 600
    ignore errors
    read only = false
    list = false
    auth users = rsync_backup # 虚拟用户
    secrets file = /etc/rsync.passwd # 虚拟用户的密码文件
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    [backup] # 备份目录
    comment = about rsync
    path = /backup
 
3.创建备份目录,设置权限
     mkdir /backup && chown -R www:www /backup
 
4.对定义的虚拟用户创建密码
    touch /etc/rsync.passwd && echo rsync_backup:123456 > /etc/rsync.passwd

5.对密码文件修改权限
    chmod 600 /etc/rsync.passwd

6.启动rsync服务
    systemctl start rsyncd

image-20250215150109066


5-3-2.作为rsync客户端,NFS的服务端

1.下载安装解压 sersync 服务

2.安装rsync命令 # 因为sersync是借助rsync命令进行备份的
    yum install rsync -y
    
3.修改配置文件
    cd  GNU-Linux-x86 && vim confxml.xml # vim 打开配置文件
        <sersync>
    <localpath watch="/data"> # 监听的目录
        <remote ip="192.168.85.143" name="backup"/> # 同步的ip 与同步的rysnc模块名称
    </localpath>
    <rsync>
        <commonParams params="-az"/> # rsync 的参数
         # start 状态是否启动 user rsync虚拟用户名  passwordfile 存储虚拟用户的密码文件
        <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.passwd"/>

4.创建一个密码账户文件
    echo '123456' > /etc/rsync.passwd && chmod 600 /etc/rsync.passwd

5.在/data目录下创建文件
    touch /data/{1..10}.png

6.启动sersync服务
    ./sersync2 -rdo confxml.xml
        参数解释:
            r : 在监控前,将监控目录与远程主机用rsync命令推送一遍
            d : 启用守护进程模式
            o : 指定配置文件,默认使用confxml.xml文件

7.在备份服务器上查看

image-20250215152156622


5-4.注意

1.serssync是借助rsync命令来执行备份的

2.需要再备份服务器上安装rsync服务端来接受备份。

image-20250215152624197


6.lsyncd工具

文档:

说明:

  1. Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。
  2. 它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。
  3. 另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。实现简单高效的本地目录同步备份(网络存储挂载也当作本地目录),一个命令搞定。

推荐使用,操作简单,配置简单。

1.安装与配置

机器 作用
test-2 192.168.85.143 作为rsync服务端,NFS备份服务器
test-3 192.168.85.144 作为rsync客户端,NFS的服务端,安装lsyncd
1.安装
    yum install lsyncd -y

2.创建一个密码账户文件
    echo '123456' > /etc/rsync.passwd && chmod 600 /etc/rsync.passwd

3.配置文件所在的位置
     /etc/lsyncd.conf 

4.修改配置如下:
settings {
    logfile      ="/var/log/lsyncd/lsyncd.log",
    statusFile   ="/var/log/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 8,
    }

sync {
    default.rsync,
    source    = "/data", # 监听目录 本机
    target    = "rsync_backup@192.168.85.143::backup", # 备份同步到远端
    delete= true,
    exclude = {".*"},
    delay=1,
    rsync     = {
        binary    = "/usr/bin/rsync", # rsync程序路径
        archive   = true,
        compress  = true,
        verbose   = true,
        password_file="/etc/rsync.passwd", # 虚拟账户密码文件路径
        _extra={"--bwlimit=200"}
        }
    }

5.启动服务
    systemctl start lsyncd

image-20250215154416992


2.配置参数说明

syncd.conf配置选项说明
settings
    里面是全局设置,--开头表示注释,下面是几个常用选项说明:

logfile 定义日志文件
stausFile 定义状态文件
nodaemon=true 表示不启用守护模式,默认
statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒
inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
sync
里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。一般第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式:

default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;
default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份;
default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证

source 同步的源目录,使用绝对路径。

target 定义目的地址.对应不同的模式有几种写法:
/tmp/dest :本地目录同步,可用于direct和rsync模式
172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步
172.29.88.223::module :同步到远程服务器目录,用于rsync模式
三种模式的示例会在后面给出。

init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true

delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件)

excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST。
这里的排除规则写法与原生rsync有点不同,更为简单:

监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo
如果规则以斜线/开头,则从头开始要匹配全部
如果规则以/结尾,则要匹配监控路径的末尾
?匹配任何字符,但不包括/
*匹配0或多个字符,但不包括/
**匹配0或多个字符,可以是/
delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。

rsync
(提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)

bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
perms 默认保留文件权限。
其它rsync的选项
其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file,见后文示例。rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持。

lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。

3.多个监控目录配置

3-1.单个监控

 # /etc/rsync.passwd 这rsync的密码文件权限为600,内部为rsync账户的密码即可不要需要账户
 
 
 
 settings {    # 全局
        logfile      ="/var/log/lsyncd/lsyncd.log",  # 日志
        statusFile   ="/var/log/lsyncd/lsyncd.status", # 状态
        inotifyMode  = "CloseWrite", # 监听的事件
        maxProcesses = 8, # 开启的工作进程
    }

    sync { # rsync同步
        default.rsync,
        source    = "/data", # 监听的文件
        target    = "rsync_backup@172.16.1.41::data", # 同步的rsync服务器与设置的文件
        delete= true, # 是否开启无差异同步
        exclude = {".*"}, # 排除的文件
        delay=1,
        rsync     = {
            binary    = "/usr/bin/rsync",  # rsync命令
            archive   = true, # 参数-a
            compress  = true, # 参数-z 
            verbose   = true, # 参数-v
            password_file="/etc/rsync.passwd", # 命令中得--password-file 指定的密码文件
            _extra={"--bwlimit=200"} # rsync中的 额外参数 bwlimit限速参数
        }
    }

3-2.多个监控

    settings {
        logfile      ="/var/log/lsyncd/lsyncd.log",
        statusFile   ="/var/log/lsyncd/lsyncd.status",
        inotifyMode  = "CloseWrite",
        maxProcesses = 8,
        }

    sync {
        default.rsync,
        source    = "/data",
        target    = "rsync_backup@172.16.1.41::data",
        delete= true,
        exclude = {".*"},
        delay=1,
        rsync     = {
            binary    = "/usr/bin/rsync",
            archive   = true,
            compress  = true,
            verbose   = true,
            password_file="/etc/rsync.passwd",
            _extra={"--bwlimit=200"}
        }
    }

    sync {
        default.rsync,
        source    = "/backup",
        target    = "rsync_backup@172.16.1.41::backup",
        delete= true,
        exclude = {".*"},
        delay=1,
        rsync     = {
            binary    = "/usr/bin/rsync",
            archive   = true,
            compress  = true,
            verbose   = true,
            password_file="/etc/rsync.passwd",
            _extra={"--bwlimit=200"}
        }
    }