zoukankan      html  css  js  c++  java
  • nfs共享存储+实时同步(结合rsync+inotify)

    RSYNC全集

    NFS共享存储介绍

    # 共享存储概述
    NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
    NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS
    
    # 什么时候需要使用到共享存储
    如集群当中,用户端的访问和存储需要保存在同一目录当中,但当存储时只会保存在自己本地,用户访问也只能访问自己这台服务器,共享存储可帮助用户资源的一个整合,也可以实现多天服务器之间数据共享,保证服务器之间数据一致性
    
    # 原理介绍
    - 本地文件操作方式
    	1.当用户执行mkdir命令, 该命令会调用shell解释器翻译给内核。
    	2.内核解析完成后会驱动对应的硬件设备,完成相应的操作。
    - NFS原理
        1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
        2.NFS客户端通过TCP/IP的方式传递给NFS服务端。
        3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
        4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
        5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
        6.idmap进程实现用户映射和压缩
        7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
    
    # 注意:
    rpc是一个远程过程调用,那么使用nfs必须有rpc服务
    

    服务端配置文件编写要求:

    • 配置文件格式
    # 配置语法	
    共享目录	   NFS客户端地址	        nfs共享参数(参考下方参数表)
    /data		  172.16.1.0/24			........
    

    如:

    /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
    
    
    • 参数表

    执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式:

    nfs共享参数 参数作用
    rw 读写权限
    ro 只读权限
    root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 (保证安全性使用)
    no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
    all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
    no_all_squash 无论NFS客户端使用什么账户访问,都不进行压缩(保证安全性使用)
    sync 同时将数据写入到内存与硬盘中,保证不丢失数据,同步
    async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据,异步
    anonuid 配置all_squash使用,指定NFS的用户UID,必须存在系统
    anongid 配置all_squash使用,指定NFS的用户UID,必须存在系统
    个人建议:
          # 最安全使用操作:
             no_all_squash + root_squash
             no_all_squash: 不将所有用户身份转换,客户端访问是什么用户,就以什么用户进行访问,同理,服务端如果给目录权限对于其他人权限不足,那么用户也无法对此操作
             root_squash: 将root身份进行转换为匿名用户nfsnobody,那么如果服务端目录权限为www.www那么root用户进行转换也是匿名用户,属于其他人的权限,所以对此也是降低了root的权限,保证了其安全性。    
    

    集群实现共享存储

    NFS实现原理

    NFS扩展

    #1.扩展:无需重启NFS服务平滑加载配置文件
    [root@nfs01 r]# cat /etc/exports
    /data/r 172.16.1.0/24(ro)
    /data/p 172.16.1.0/24(ro)
    /data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
    
    [root@nfs01 r]# exportfs -rv
    exporting 172.16.1.0/24:/data/w
    exporting 172.16.1.0/24:/data/p
    exporting 172.16.1.0/24:/data/r
    
    #2.扩展:nfs客户端挂载参数
    [root@backup-41 ~]# mount.nfs4 -o noatime,nodiratime,noexec,nodev,nosuid 172.16.1.31:/data/r /data/r/
    
    #3.扩展:nfs客户端永久挂载参数
    [root@backup-41 ~]# tail -2 /etc/fstab
    172.16.1.31:/data/r /data/r nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
    172.16.1.31:/data/w /data/w nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
    
    #4.扩展:客户端检查挂载参数是否生效
    [root@backup-41 ~]# mount
    #等价于
    [root@backup-41 ~]# cat /proc/mounts 
    

    实验一:

    要求:

    1. 将服务端/data目录进行共享,只有172.16.1.0/24网段主机可以放问
    2. 所有主机对共享目录具备读写权限
    3. 保证数据存储时写入双份,一份保存在硬盘一份保存在内存中,最大力度保证数据不丢失
    4. 将所有访问用户映射为本地匿名用户www
    5. 配合rsync+inotify将/data目录中文件进行备份到backup主机中
    6. 一旦nfs的共享目录发生变化,backup立马进行同步,并保持共享目录和备份目录之间的一致性
    

    1.环境准备

    主机名 wanIP lanIP 角色
    web01 10.0.0.7 172.16.1.7 nfs的客户端
    web02 10.0.0.8 172.16.1.8 nfs的客户端
    nfs 10.0.0.31 172.16.1.31 nfs的服务端
    backup 10.0.0.41 172.16.1.41 backup服务端

    2 nfs客户端前期准备

    # 1. 服务安装(web01和web02同时操作)
    [root@web01 ~]# yum install apache php
    [root@web02 ~]# yum install apache php
    [root@web01 ~]# yum install -y nfs-utils
    [root@web02 ~]# yum install -y nfs-utils
    
    # 2. 创建www用户(作为匿名访问nfs时的用户 web01和web02同时操作)
    [root@web01 ~]# groupadd www -g 666
    [root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
    [root@web02 ~]# groupadd www -g 666
    [root@web02 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
    
    # 3. 修改共享目录的属主和属组信息(web01和web02同时操作)
    [root@web01 /var/www/html]# chown -R www.www /var/www/html
    [root@web01 /var/www/html]# chown -R www.www /var/www/html
    
    # 4. 修改apache配置文件(将apache站点目录属主属组信息进行修改,作为共享目录需要和nfs配置文件中定义用户保持一致)
     [root@web01 /var/www/html]# vim /etc/httpd/conf/httpd.conf 		# 将原本apache改为www
    User www
    Group www
     [root@web01 /var/www/html]# vim /etc/httpd/conf/httpd.conf 		# 将原本apache改为www
    User www
    Group www
     
    

    3 nfs服务端前期准备

    # 1. 服务安装(CentOs7)
    [root@nfs01 ~]# yum install -y nfs-utils
    
    
    # CentOS 6,需要安装nfs和rpc
    [root@nfs ~]# yum install -y nfs-utils rpcbind
    
    # 2. 编辑nfs的配置文件(这里的内容有影响到nfs客户端的用户创建)
    [root@nfs01 ~]# vim /etc/exports
    /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
    
    # 3. 根据配置文件创建对应用户及文件
    [root@nfs01 ~]# groupadd www -g 666
    [root@nfs01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
    [root@nfs01 ~]# mkdir /data
    [root@nfs01 ~]# chown -R www.www /data
    
    # 4. 启动nfs服务(针对CentOS7)
    [root@nfs01 ~]# systemctl start nfs-server
    [root@nfs01 ~]# systemctl enable nfs-server
    #启动rpc,在启动nfs(针对CentOS6,需要多启动一个服务)
    [root@nfs ~]# systemctl start rpcbind nfs-server
    
    

    4 nfs客户端后续操作

    # 1. nfs客户端nfs服务启动(web01和web02同时操作)
    [root@web01 /var/www/html]# systemctl start nfs-server
    [root@web02 /var/www/html]# systemctl start nfs-server
    
    # 2. 查看共享服务器信息
    [root@web01 /var/www/html]# showmount -e 172.16.1.31
    Export list for 172.16.1.31:
    /data 172.16.1.0/24
    
    # 3. 将本地目录挂载至共享存储中(web01和web02同时操作)
    [root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html
    [root@web02 ~]# mount -t nfs 172.16.1.31:/data /var/www/html
    
    # 4. 查看是否挂载(最后一行的信息显示即为实现挂载)
    [root@web02 ~]# df -h
    Filesystem         Size  Used Avail Use% Mounted on
    /dev/sda3           19G  1.3G   18G   7% /
    devtmpfs           476M     0  476M   0% /dev
    tmpfs              487M     0  487M   0% /dev/shm
    tmpfs              487M  7.7M  479M   2% /run
    tmpfs              487M     0  487M   0% /sys/fs/cgroup
    /dev/sda1          497M  120M  378M  25% /boot
    tmpfs               98M     0   98M   0% /run/user/0
    172.16.1.31:/data   19G  1.3G   18G   7% /var/www/html
    
    # 5. nfs客户端上传压缩包(web02不用操作,挂载后站点目录里面文件全部会消失,除非重新卸载)
    [root@web01 /var/www/html]# ll					# 上传考试压缩包(web01和web02同时操作)
    total 28
    -rw-r--r-- 1 www www 26927 May  8 12:46 kaoshi.zip
    
    # 6.  解压即可(web02不用操作,web01和web02同时操作)
    [root@web01 /var/www/html]# unzip kaoshi.zip 	 
    
    # 7. 重启httpd服务(web01和web02同时操作)
    [root@web01 /var/www/html]# systemctl restart httpd
    [root@web02 /var/www/html]# systemctl restart httpd
    

    5 rsync服务端操作

    # 1. 服务安装
    [root@backup ~]# yum install -y rsync
    
    # 2. 修改配置
    [root@backup ~]#  vim /etc/rsyncd.conf 
    uid = rsync												
    gid = rsync												
    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
    #####################################
    [backup]
    comment = welcome to oldboyedu backup!
    path = /backup
    
    # 3. 根据配置文件在backup中创建对应目录和应用等其他信息并启动服务
    	[root@backup ~]# useradd rsync -s /sbin/nologin -M
    	[root@backup ~]# mkdir /backup
    	[root@backup ~]# chown -R rsync.rsync /backup/
    	[root@backup ~]# vim /etc/rsync.passwd
    	rsync_backup:123
    	[root@backup ~]# chmod 600 /etc/rsync.passwd
    	[root@backup ~/.certs]# systemctl start rsyncd
    	[root@backup ~]# systemctl enable rsyncd
    

    6.rsync客户端配置(也就是nfs服务端)

    #1. 安装相关服务
    [root@nfs01 ~]# yum install rsync
    [root@nfs01 /data]# yum -y install inotify-tools
    
    #2. 编写脚本,实现实时监控备份(需要手动执行此脚本)
    [root@nfs01 /]# cat rsync_backup.sh 
    #!/bin/bash
    export RSYNC_PASSWORD=123
    dir=/data
    /usr/bin/inotifywait  -mrq  --format '%w %f' -e create,delete,attrib,close_write  $dir | while read line;do
    	cd  $dir  && rsync -az -R  --delete  .  rsync_backup@172.16.1.41::backup  >/dev/null 2>&1
    done &
    

    7.验证操作

    #1. web01上传数据,看网页访问web02是否具备
    2. 查看web01数据是否同步保存到backup服务端中
    
    • web01数据上传

    • web02尝试访问

    • 查看backup是否存在/date中的文件
  • 相关阅读:
    spring websocket自动断开连接再创建引发的问题解决方案
    解决html5 audio iphone,ipd,safari不能自动播放问题
    spring 4.1.4 发布
    wince程序调用另外一个wince exe程序?
    3种LVS/Nginx/HAProxy负载均衡器的对比分析
    Weblogic12C 集群实现session同步
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 解决
    Spring Framework 4.1.3 还是一样给力
    RabbitMQ与Redis队列对比
    java.util.Vector排序
  • 原文地址:https://www.cnblogs.com/tcy1/p/12852099.html
Copyright © 2011-2022 走看看