zoukankan      html  css  js  c++  java
  • NFS网络文件系统

    第1章 NFS基本概述

    1.1 什么是nfs

    NFS是Network File System的缩写及网络文件系统。

    主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。

    NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS

    1.2 为什么要使用NFS服务进行数据存储

    1.实现多台服务器之间数据共享

    2.实现多台服务器之间数据的一致

    1.3 本地文件操作方式

    当用户执行mkdir命令, 该命令会通过shell解释器翻译给内核,由内核解析完成后驱动硬件,完成相应的操作。

    1.4 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服务

    1.5 NFS存储优点

    1.NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。

    2.NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。

    1.6 NFS存储局限

    1.存在单点故障, 如果构建高可用维护麻烦。(web-》nfs()-》backup)

    2.NFS数据明文, 并不对数据做任何校验。

    3.客户端挂载无需账户密码, 安全性一般(内网使用)

    1.7 生产应用建议

    1.生产场景应将静态数据尽可能往前端推, 减少后端存储压力

    2.必须将存储里的静态资源通过CDN缓存(jpgpngmp4avicssjs)

    3.如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用

    第2章 NFS基本使用

    2.1 环境准备

    服务器系统

    角色

    IP

     主机名

    CentOS 7.5

    NFS服务端

    ens33:192.168.0.220

    server01

    nfs

    CentOS 7.5

    NFS客户端

    ens33:192.168.0.221

    server02

    web01

    2.2 关闭防火墙及selinux(客户端,服务端都要关闭)

    2.3 服务端安装nfs

    [root@server01 ~]# yum -y install nfs-utils

    2.3.1 配置nfs

    我们可以按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式,定义要共享的目录与相应的权限。

    [root@server01 ~]# echo '/data 192.168.0.0/24(rw,sync,all_squash)' > /etc/exports
    [root@server01 ~]# cat /etc/exports
    /data 192.168.0.0/24(rw,sync,all_squash)

    如果想要把/data目录共享给172.16.1.0/24网段内的所有主机

    1.主机都拥有读写权限

    2.在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失

    3.将所有用户映射为本地的匿名用户(nfsnobody)

    2.3.2 创建对应的目录

    [root@server01 ~]#  mkdir /data

    2.3.3 启动服务,并将服务加入开机自启动

    [root@server01 ~]# systemctl enable rpcbind nfs-server
    Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
    [root@server01 ~]# systemctl start rpcbind nfs-server
    [root@server01 ~]# 

    2.3.4 检查端口

    [root@server01 ~]# netstat -lntp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      8096/rsync          
    tcp        0      0 0.0.0.0:35663           0.0.0.0:*               LISTEN      -                   
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      8475/rpcbind        
    tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      8529/rpc.mountd     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7006/sshd           
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7205/master         
    tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -                   
    tcp        0      0 0.0.0.0:39233           0.0.0.0:*               LISTEN      8482/rpc.statd      
    tcp6       0      0 :::873                  :::*                    LISTEN      8096/rsync          
    tcp6       0      0 :::111                  :::*                    LISTEN      8475/rpcbind        
    tcp6       0      0 :::20048                :::*                    LISTEN      8529/rpc.mountd     
    tcp6       0      0 :::22                   :::*                    LISTEN      7006/sshd           
    tcp6       0      0 :::38264                :::*                    LISTEN      8482/rpc.statd      
    tcp6       0      0 ::1:25                  :::*                    LISTEN      7205/master         
    tcp6       0      0 :::2049                 :::*                    LISTEN      -                   
    tcp6       0      0 :::42501                :::*                    LISTEN      -                   
    [root@server01 ~]# 

    2.3.5 检查共享的内容

    [root@server01 ~]# cat /var/lib/nfs/etab
    /data   192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)

    2.3.6 检查匿名用户对应的真实账户,并授权共享目录为nfsnobody

    [root@server01 ~]# grep "65534" /etc/passwd
    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
    [root@server01 ~]# chown -R nfsnobody.nfsnobody /data
    [root@server01 ~]# ll -d /data/
    drwxr-xr-x 2 nfsnobody nfsnobody 6 1月  12 14:04 /data/

    2.4 客户端安装nfs

    [root@server02 ~]# yum install nfs-utils -y

    2.4.1 启动rpcbind服务

    [root@server02 ~]# systemctl enable rpcbind
    [root@server02 ~]# systemctl start rpcbind

    2.4.2 使用showmount -e查看远程服务器rpc提供的可挂载nfs信息

    [root@server02 ~]# showmount -e 192.168.0.220
    Export list for 192.168.0.220:
    /data 192.168.0.0/24

    2.4.3 创建挂载点目录,执行挂载命令

    mount命令并结合-t参数, 指定要挂载的文件系统的类型, 并在命令后面写上服务器的IP地址, 以及服务器上的共享目录, 最后需要写上要挂载到本地系统(客户端)的目录

    [root@server02 ~]# mkdir /data
    [root@server02 ~]# mount -t nfs 192.168.0.220:/data /data/
    [root@server02 ~]# df -h
    文件系统                 容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root   19G  2.6G   17G   14% /
    devtmpfs                 223M     0  223M    0% /dev
    tmpfs                    235M     0  235M    0% /dev/shm
    tmpfs                    235M  5.6M  229M    3% /run
    tmpfs                    235M     0  235M    0% /sys/fs/cgroup
    /dev/sda1                197M  111M   87M   56% /boot
    tmpfs                     47M     0   47M    0% /run/user/0
    192.168.0.220:/data       19G  2.0G   17G   11% /data

    2.4.4 挂载成功后可以进行增删改操作,测试客户端是否拥有写的权限

    [root@server02 ~]# echo "123" > /data/test
    [root@server02 data]# ll /data/
    总用量 4
    -rw-r--r--. 1 nfsnobody nfsnobody 4 1月  13 15:39 test

    2.4.5 检查nfs服务端是否存在数据

    [root@server01 ~]# ll /data/
    总用量 4
    -rw-r--r-- 1 nfsnobody nfsnobody 4 1月  13 15:39 test

    2.4.6 如果希望NFS文件共享服务能一直有效则永久挂载

    (防止服务器重启挂载失效->服务器不会重启)

    [root@server02 data]# echo '172.16.1.31:/data       /data                   nfs     defaults        0 0' >> /etc/fstab
    [root@server02 data]# tail -1 /etc/fstab
    172.16.1.31:/data       /data                   nfs     defaults        0 0

    验证fstab是否ok,前提要先卸载挂载

    [root@server02 ~]# umount /data
    [root@server02 ~]# mount -a
    卸载的时候如果提示”umount.nfs: /data: device is busy” 
    
    1.切换至其他目录, 然后在进行卸载。
    
    2.NFS宕机, 强制卸载umount -lf /data

    第3章 NFS配置参数及验证

    3.1 nfs共享参数及作用

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

    共享参数

    参数作用

    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,必须存在系统

    3.2 验证ro权限

    [root@nfs ~]# echo '/data 172.16.1.0/24(ro,sync,all_squash)' > /etc/export
    
    [root@nfs ~]#cat /etc/exports
    
    /data 172.16.1.0/24(ro,sync,all_squash)

    3.2.1 重载nfs(exportfs)

    [root@nfs ~]# systemctl restart nfs-server

    3.2.2 先卸载客户端已挂载好的共享

    [root@web01 ~]# umount /data/

    3.2.3 重新进行挂载

    [root@web01 ~]# mount -t nfs 172.16.1.31:/data /data/

    3.2.4 测试是否能写数据

    [root@web01 ~]# cd /data/
    
    [root@web01 data]# touch file-test        不允许写入数据
    
    touch: cannot touch 'file-test': Read-only file system

    3.3 验证all_squash,anonuid,anongid权限

    [root@nfs ~]# echo '/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)' > /etc/exports
    
    [root@nfs ~]# cat /etc/exports
    
    /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

    3.3.1 需要添加一个uid是666,gid是666的用户

    [root@nfs ~]# groupadd -g 666 www
    
    [root@nfs ~]# useradd -u666 -g666 www
    
    [root@nfs ~]# id www
    
    uid=666(www) gid=666(www) 组=666(www)

    3.3.2 必须重新授权为www用户,否则无法写入文件

    [root@nfs ~]# chown -R www.www /data/

    3.3.3 重启服务

    [root@nfs ~]# systemctl restart nfs-server

    3.3.4 客户端重新挂载

    [root@web01 /]# umount /data/
    
    [root@web01 /]# mount -t nfs 172.16.1.31:/data /data/
    
    [root@web01 data]# ll
    
    total 4
    
    -rw-r--r-- 1 666 666 4 Sep  6 03:41 test

    3.3.5 测试是否能写入数据

    [root@web01 data]# touch tes1
    
    [root@web01 data]# ll
    
    total 4
    
    -rw-r--r-- 1 666 666 0 Sep  7 10:38 tes1
    
    -rw-r--r-- 1 666 666 4 Sep  6 03:41 test

    3.3.6 为了防止权限不一致导致权限不足,建议在客户端创建一模一样的用户

    [root@web01 ~]# groupadd -g 666 www
    
    [root@web01 ~]# useradd -u666 -g666 www
    
    [root@web01 ~]# id www
    
    uid=666(www) gid=666(www) groups=666(www)

    3.3.7 在此检查文件身份

    [root@web01 ~]# ll /data/
    
    total 4
    
    -rw-r--r-- 1 www www 0 Sep  7 10:38 tes1
    
    -rw-r--r-- 1 www www 4 Sep  6 03:41 test
  • 相关阅读:
    Java数据持久层
    一张图解决ThreadLocal
    类加载器及其加载原理
    手写LRU缓存淘汰算法
    使用归并排序思想解决逆序对数量问题
    Same Origin Policy 浏览器同源策略详解
    如何估算线程池的线程数?
    分布式锁为什么要选择Zookeeper而不是Redis?
    SpringBoot的SpringMVC使用FastJson依赖时LocalDateTime全局配置序列化格式
    数据库中的枚举值如何存储
  • 原文地址:https://www.cnblogs.com/liujunjun/p/14272482.html
Copyright © 2011-2022 走看看