• Linux(10):期中架构(2)--- NFS存储服务 & 实时同步


    1. 共享存储服务概念:

    # NFS是Network File System的缩写,中文意思是网络文件系统,
    # 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。

    2. NFS共享存储服务的应用:

    # 将数据存储到一台服务器上,实现数据统一一致,共享访问
    # NFS存储服务器中主要存储哪些信息:用户上传的图片 音频 视频 附件等信息
    # NFS服务是分为服务端和客户端
    # 存储服务器:NFS服务端   网站web服务器:NFS客户端
    
    # 实现共享存储好处:
    01. 实现数据统一一致
    02. 节省网站磁盘资源
    03. 节省网站访问带宽

    3. NFS共享存储服务的原理:

    ①. nfs服务端创建共享存储目录
    ②. nfs客户端创建远程挂载点目录
    ③. nfs客户端进行远程挂载
    ④. 实现客户端数据信息统一一致

    4. NFS服务重要概念说明:

    4.1 NFS共享文件系统RPC服务介绍

    4.2 NFS共享文件系统RPC服务由来:

    # NFS服务启动进程和端口过程,需要由rpc服务统一管理

    5. NFS服务部署实践过程

    5.1 NFS服务端部署流程:

    # 第一步:检查服务软件是否安装
    [root@nfs01 ~]# rpm -qa|egrep "nfs-utils|rpcbind"    # 检查 nfs 和 rpc 服务是否已经安装 
    
    # 第二步:进行软件服务安装
    [root@nfs01 ~]# yum install -y nfs-utils rpcbind
    ...
    [root@nfs01 ~]# rpm -qa|egrep "nfs-utils|rpcbind"
    nfs-utils-lib-1.1.5-13.el6.x86_64
    rpcbind-0.2.0-16.el6.x86_64
    nfs-utils-1.2.3-78.el6_10.1.x86_64
    [root@nfs01 ~]# 
    
    # 补充说明:nfs-utils 和 rpcbind两个软件大礼包
        rpm -ql nfs-utils    # 查看软件包内容 的命令
        /etc/rc.d/init.d/nfs     <-- nfs服务启动脚本文件
        /usr/sbin/showmount      <-- 检查nfs服务共享目录信息
        
        rpm -ql rpcbind
        /etc/rc.d/init.d/rpcbind   <-- rpcbind服务启动脚本文件
        /usr/sbin/rpcbind          <-- 检查nfs服务向rpc服务注册信息
        
    
    # 第三步:编写nfs服务配置文件
    [root@nfs01 ~]# ll /etc/exports 
    -rw-r--r--. 1 root root 0 Jan 12  2010 /etc/exports
    [root@nfs01 ~]# vim /etc/exports     # 编写服务配置文件; /etc/exports ---> 系统默认的配置共享存储的文件,NFS服务会识别这个文件实现共享存储
    [root@nfs01 ~]# cat /etc/exports
    /data  172.16.1.0/24(rw,sync)        # /data 表示数据存储的目录; 172.16.1.0/24 表示允许哪个网段的主机可以挂载到我这台共享服务器上; (rw,rsync) ---> rw 表示共享目录是可读可写的,rsync 是一个同步参数; 172.16.1.0/24 和 (rw,sync) 之间不能有空格
    [root@nfs01 ~]# 
    
    # 说明:配置文件信息 指定共享目录   指定共享目录访问控制网段或主机信息(共享目录参数信息)
    
    
    # 第四步:创建nfs服务共享目录,并且进行授权
    [root@nfs01 ~]# mkdir /data
    [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/
    [root@nfs01 ~]# 
    
    # 第五步:启动nfs和rpc服务
    [root@nfs01 ~]# /etc/init.d/rpcbind start        # 要先启动 rpc 这个“中介”服务
    Starting rpcbind:                                          [  OK  ]
    [root@nfs01 ~]# /etc/init.d/nfs start            # 再启动 nfs 服务
    Starting NFS services:                                     [  OK  ]
    Starting NFS quotas:                                       [  OK  ]
    Starting NFS mountd:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]
    Starting RPC idmapd:                                       [  OK  ]
    [root@nfs01 ~]# 
    
    
    # 第六步:进行服务配置检查
    # 检查 nfs 是否向 rpc 服务注册
    [root@nfs01 ~]# rpcinfo -p 172.16.1.31   # 检查本地主机(172.16.1.31,也可用10.0.0.31)是否已经向 rpc 注册
    ...
    
    # 检查是否存在可用的共享目录
    [root@nfs01 ~]# showmount -e 10.0.0.31        # showmount -e 服务端的地址  ---> 检查是否有可用的共享目录
    Export list for 10.0.0.31:
    /data 172.16.1.0/24
    [root@nfs01 ~]# 

    5.2 NFS客户端部署流程:

    # 第一步:检查服务软件是否安装
    [root@web01 ~]# rpm -qa|egrep "nfs-utils|rpcbind"
    [root@web01 ~]# 
    
    # 第二步:进行软件服务安装
    
    
    # 第三步:进行共享目录挂载
    [root@web02 ~]# mount -t nfs 172.16.1.31:/data /mnt        # -t nfs 表示挂载 nfs 文件系统类型 ; 172.16.1.31:/data ---> 这个服务器上的 /data 目录; /mnt 表示挂载到 /mnt 目录
    [root@web02 ~]# df -h
    Filesystem         Size  Used Avail Use% Mounted on
    /dev/sda3          8.8G  1.5G  6.9G  18% /
    tmpfs              238M     0  238M   0% /dev/shm
    /dev/sda1          190M   40M  141M  22% /boot
    172.16.1.31:/data  8.8G  1.5G  6.9G  18% /mnt        # 共享目录挂载到了 /mnt 
    [root@web02 ~]# 
    
    # 第四步:进行共享存储测试
    # 网站服务器01上的操作
    [root@web01 ~]# cd /mnt/
    [root@web01 mnt]# ll
    total 0
    [root@web01 mnt]# touch test.txt
    [root@web01 mnt]# ll 
    total 0
    -rw-r--r-- 1 nfsnobody nfsnobody 0 May  3 16:58 test.txt
    [root@web01 mnt]# 
    
    # 存储服务器上的操作
    [root@nfs01 ~]# ll /data/
    total 0
    -rw-r--r-- 1 nfsnobody nfsnobody 0 May  3 16:58 test.txt    # 存储在 网站服务器的 /mnt 目录下的内容 就相当于 存储在了 存储服务器的 /data目录下
    [root@nfs01 ~]# 
    
    # 网站web服务器02 上的操作
    [root@web02 ~]# ll /mnt/
    total 0
    -rw-r--r-- 1 nfsnobody nfsnobody 0 May  3 16:58 test.txt    # 在 web02 上也能看到 web01 上的数据
    [root@web02 ~]# 
    
    # 说明:在web01的mnt目录中创建的数据,在nfs和web02服务器上都可以看到,即已经实现数据共享存储
            客户端上不需要启动NFS服务
    
    # 共享文件系统的工作原理(服务端3步 客户端3步)
        # 服务端做了三件事:
        1. 启动rpcbind服务,创建中介
        2. 启动nfs服务,创建“房源”信息
        3. 将“房源”信息向中介进行注册,在nfs服务稳定运行过程中,“房源”信息只注册一次
        
        # 客户端做了三件事:
        1. 启动rpcbind服务(可选)
        2. 确保客户端和服务端网络连接建立成功
        3. 执行mount命令进行网络存储挂载

    6. NFS服务部署进程信息详述

    [root@oldboy ~]# ps -ef|egrep "rpc|nfs"
    rpc        1564      1  0 09:32 ?        00:00:00 rpcbind
    rpc        1065      1  0 09:32 ?        00:00:00 rpc statd        # <- 检查数据存储一致性
    root       4736      2  0 21:31 ?        00:00:00 [rpciod/0]    
    root       5363      1  0 21:47 ?        00:00:00 rpc.rquotad      # <- 磁盘配额进程(remote quote server)
    root       5368      1  0 21:47 ?        00:00:00 rpc.mountd       # <- 权限管理验证等(NFS mount daemon)
    root       5375      2  0 21:47 ?        00:00:00 [nfsd4]
    root       5376      2  0 21:47 ?        00:00:00 [nfsd4_callbacks]
    root       5377      2  0 21:47 ?        00:00:00 [nfsd]           # <- NFS主进程
    root       5378      2  0 21:47 ?        00:00:00 [nfsd]           # <- NFS主进程
    root       5379      2  0 21:47 ?        00:00:00 [nfsd]           # <- NFS主进程,管理登入,ID身份判别等。
    root       5380      2  0 21:47 ?        00:00:00 [nfsd]        
    root       5381      2  0 21:47 ?        00:00:00 [nfsd]        
    root       5382      2  0 21:47 ?        00:00:00 [nfsd]        
    root       5383      2  0 21:47 ?        00:00:00 [nfsd]        
    root       5384      2  0 21:47 ?        00:00:00 [nfsd]        # <- NFS主进程
    root       5415      1  0 21:47 ?        00:00:00 rpc.idmapd    # <- name mapping daemon
                                                                    # 用户压缩/用户映射(记录)
    root       5512   4670  0 22:02 pts/0    00:00:00 egrep rpc|nfs

    7. NFS共享存储服务配置说明

    7.1 NFS共享文件系统配置文件格式说明:

    # NFS共享目录:
        为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。
        注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
    
    # NFS客户端地址:
        为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址。
        还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务的业务服务器,例如:web服务。具体说明见表10-3
        权限参数集
        对授权的NFS客户端的访问权限设置。参数具体说明见后文。
        nfs权限(共享目录【借给你手机】) nfs配置的/etc/exports /data 172.16.1.0/24(rw)
        本地文件系统权限(【手机密码不告诉你】) 挂载目录的权限rwxr-xr-x root root /data

    NFS共享配置文件语法格式:

    同步和异步(sync 和 async):

    NFS客户端地址配置说明:

    7.2 NFS共享文件系统配置文件案例说明

    # 配置例一    /data 10.0.0.0/24(rw,sync)
    说明:允许客户端读写,并且数据同步写入到服务器端的磁盘里
          注意:24和“(”之间不能有空格
    
    # 配置例二    /data 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)
    说明:允许客户端读写,并且数据同步写到服务器端的磁盘里,并且指定客户端的用户UID和GID。
          早期生产环境的一种配置,适合多客户端共享一个NFS服务单目录,
          如果所有服务器的nfsnobody账户UID都是65534,则本例没什么必要了。
          早期centos5.5的系统默认情况下nfsnobody的UID不一定是65534,此时如果这些服务器共享一个NFS目录,
          就会出现访问权限问题。
    
    # 配置例三    /home/oldboy 10.0.0.0/24(ro)   <-- 是为开发人员想查看线数据准备配置方式
    说明:只读共享
    用途:例如在生产环境中,开发人员有查看生产服务器日志的需求,但又不希望给开发生产服务器的权限,
          那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器的日志目录(NFS共享)的权限,
          当然这不是唯一的方法,
          例如可以把程序记录的日志发送到测试服务器供开发查看或者通过收集日志等其它方式展现

    7.3 NFS共享文件系统配置文件参数设置

    NFS配置权限设置常用参数说明图:

    NFS客户端访问服务端原理

    重启 nfs 的方法:

    # 重启 nfs 的方法: /etc/init.d/nfs reload    # ---> 平滑启动 nfs ;推荐使用这种方法
                      /etc/init.d/nfs restart   # ---> 强制重启 nfs 

    用户压缩映射原理:

    # nfsnobody 用户的 uid 和 gid 值
    [root@nfs01 ~]# id nfsnobody
    uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

    NFS服务访问用户映射原理图:

    7.4 NFS共享文件系统权限参数设置

    # 1)NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限。
    # 2)NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务器端本地目录的安全权限。
    # 3)每台机器对应存在和NFS默认配置UID的相同UID 65534的nfsnobody用户
    #   (确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)

    7.5 NFS共享文件系统相关重要文件说明

       /etc/exports            # nfs服务主配置文件
        /usr/sbin/showmount     # 查看nfs服务共享目录信息
        /usr/sbin/rpcinfo       # 查看rpc服务中是否有“房源”注册信息
        /var/lib/nfs/etab       # 用于查看nfs服务默认配置信息    
                                
        /proc/mounts            # nfs客户端mount挂载参数(可以查看默认挂载参数信息)
       
    
    [root@nfs01 ~]# cat /var/lib/nfs/etab 
    /data    172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)  # () 中的内容,除了 rw 和 sync外,都表示默认配置参数
    # anonuid=65534,anongid=65534 也是默认的    
        

    实时同步服务

    1. 概念介绍

    1.1 为什么要用实时同步服务
        因为定时任务有缺陷,一分钟以内的数据无法进行同步,容易造成数据丢失
        
    1.2 实时同步工作原理
        a 创建要存储数据的目录
        b 利用实时同步的软件监控我们进行备份的数据目录
        c 利用rsync服务进行数据推送传输备份

    2. 实时同步服务软件部署

    # 2.1 inotify+rsync实现实时同步备份
    
    # 第一步:将inotify软件安装成功(安装在存储服务器)
    [root@nfs01 ~]# yum install -y inotify-tools
    
    说明:操作系统的yum源文件中,是否存在epel源
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    
    [root@nfs01 ~]# rpm -ql inotify-tools
    /usr/bin/inotifywait                <--- 实现对数据目录信息变化监控(重点了解的命令)
    /usr/bin/inotifywatch               <--- 监控数据信息变化,对变化的数据进行统计
    
    [root@nfs01 ~]# cd /proc/sys/fs/inotify/
    [root@nfs01 inotify]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 11 19:09 max_queued_events
    -rw-r--r-- 1 root root 0 May 11 19:09 max_user_instances
    -rw-r--r-- 1 root root 0 May 11 19:09 max_user_watches
    [root@nfs01 inotify]# 
    max_user_watches:    设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
                        默认只能监控8192个文件
    
    max_user_instances:    设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
                        默认每个用户可以开启inotify服务128个进程
    
    max_queued_events:    设置inotify实例事件(event)队列可容纳的事件数量
                        默认监控事件队列长度为16384
    
    
    # 第二步:将rsync守护进程模式部署完毕
    rsync服务端部署
    a 检查rsync软件是否已经安装
    b 编写rsync软件主配置文件
    c 创建备份目录管理用户
    d 创建备份目录,并进行授权
    e 创建认证文件,编写认证用户和密码信息,设置文件权限为600
    f 启动rsync守护进程服务
    
    rsync客户端部署
    a 检查rsync软件是否已经安装    
    b 创建认证文件,编写认证用户密码信息即可,设置文件权限为600
    c 利用客户端进行数据同步测试
    
    
    # 第三步:要让inotify软件和rsync软件服务建立连接(shell脚本;在存储服务器上编写该脚本)
    rsync软件应用命令:
    [root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.password
    
    inotify软件应用命令:
    # inotifywait 命令的参数:
        -m|--monitor             始终保持事件监听状态
        -r                       进行递归监控
        -q|--quiet               将无用的输出信息,不进行显示
        --timefmt <fmt>          设定日期的格式
                                 man strftime 获取更多时间参数信息
        --format <fmt>           命令执行过程中,输出的信息格式
                                  
        -e                       指定只监控的事件信息
        
        # man inotifywait 查看所有参数说明和所有可以监控的事件信息
        # 总结主要用到的事件信息:
        create创建、delete删除、moved_to移入、close_write修改
        
        # 命令格式:
        inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data  <-- 相对完整的命令应用
        inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" -e create /data   <-- 指定监控什么事件信息
        
        # 工作中一般用下面的命令格式:
        inotifywait -mrq --format "%w%f" -e create,delete,moved_to,close_write  /data  
        以上为实现实时同步过程,所需要的重要监控命令
        
        
    # 第四步:编写脚本:实现inotify与rsync软件结合
    版本1:
    #!/bin/bash
    inotifywait -mrq --format "%w%f" -e create,delete,moved_to,close_write /data|
    while read line
    do
    rsync -avz $line rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    done
    
    # 第一行代码: /data 表示被监控的目录,  表示 命令的换行
    # 第二行代码: read 表示读取一行; line 是变量
    # 第四行代码: $line 是读取的每行的变量
    
    
    # 版本1 的方式会出错:当删除的时候,储存服务器中已经没有了该文件或目录,此时再推送到备份服务器时便会出错,如下:
    rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
    
    优化版:
    #!/bin/bash
    inotifywait -mrq --format "%w%f" -e create,delete,moved_to,close_write /data|
    while read line
    do
    rsync -az --delete /data/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    done
    
    # 第四行代码: rsync 的 --delete 参数表示 无差异同步 , /data/ 表示同步的目录
    
    ######################################################################################
    
    # sh命令的调试状态(即输出脚本执行过程中都做了什么)的参数: sh -x inotify.sh
    # 让脚本在后台运行的方法 --- 加上 &,如: sh -x inotify.sh &
    
    #  shell循环语法总结:
    #  for循环       for xx in 循环条件内容信息;do xxx;done
    #  while循环     while 循环条件;do xx ;done    <-- 只要条件满足,就一直循环
    #                     while true;do xx ;done        <-- 死循环
    
    # 运维工作中编写自动化脚本规范:
    #     1. 先完成基本功能需求
    #     2. 优化完善脚本内容
    #     3. 写上一些注释说明信息
    #     4. 进行反复测试
    
    
    # 第五步:最终的测试
    [root@nfs01 scripts]# sh -x inotify.sh
    
    
    # 2.2 sersync+rsync实现实时同步备份
    
    # 第一步: 安装软件 -- 略
    # 第二步:编写sersync配置文件:
    
        6     <filter start="false">
        7         <exclude expression="(.*).svn"></exclude>
        8         <exclude expression="(.*).gz"></exclude>
        9         <exclude expression="^info/*"></exclude>
       10         <exclude expression="^static/*"></exclude>
       11     </filter>
       说明:实现同步数据过滤排除功能
    
        12     <inotify>
        13         <delete start="true"/>
        14         <createFolder start="true"/>
        15         <createFile start="false"/>
        16         <closeWrite start="true"/>
        17         <moveFrom start="true"/>
        18         <moveTo start="true"/>
        19         <attrib start="false"/>
        20         <modify start="false"/>
        21     </inotify>
        说明:类似于inotify的-e参数功能,指定监控的事件信息
        
        
        23     <sersync>
        24         <localpath watch="/data">
        25             <remote ip="172.16.1.41" name="backup"/>
        26             <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        27             <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        28         </localpath>
        29         <rsync>
        30             <commonParams params="-az"/>
        31             <auth start="false" users="rsync_backup" passwordfile="/etc/rsync.password"/>
        32             <userDefinedPort start="false" port="874"/><!-- port=874 -->
        33             <timeout start="false" time="100"/><!-- timeout=100 -->
        34             <ssh start="false"/>
        35         </rsync>
         说明:以上内容(23~35)是数据相关的配置信息,是必须进行修改调整配置
    
         
    第三个里程:应用sersync软件,实现实时同步
    sersync 命令参数:
        参数-d:              启用守护进程模式
        参数-r:              在监控前,将监控目录与远程主机用rsync命令推送一遍(测试)
        参数-n:              指定开启守护线程的数量,默认为10个
        参数-o:              指定配置文件,默认使用confxml.xml文件
    
    [root@nfs01 data]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml   # 在储存服务器上执行该命令前,要先在备份作品上启动 rsync --daemon 服务

    inotify 参数示意图:

    sersync参数配置:

    3. 实时同步软件概念介绍

    3.1 inotify软件:
    Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,
    加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,
    利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,
    而inotify-tools正是实施这样监控的软件    
    软件参考链接:https://github.com/rvoicilas/inotify-tools/wiki
    
    3.2 sersync软件
    Sersync项目利用inotify与rsync技术实现对服务器数据实时同步的解决方案,
    其中inotify用于监控sersync所在服务器上文件系统的事件变化,
    rsync是目前广泛使用的本地及异地数据同步工具,
    其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,
    所以其优势大大超过使用挂接文件系统或scp等方式进行镜像同步。
    软件参考链接:https://github.com/wsgzao/sersync
  • 相关阅读:
    清理计算机硬盘
    DIY-组装
    go函数类型的使用
    go同步互斥锁
    Go读写文件
    go mod
    go html
    channel
    arp和rarp协议
    自己实现的反射
  • 原文地址:https://www.cnblogs.com/neozheng/p/10804761.html
Copyright © 2020-2023  润新知