1. NFS客户端挂载深入

1.1 NFS客户端挂载参数说明

  • 在NFS服务端,可以通过cat /var/lib/nfs/etab查看NFS服务器端配置参数的细节。
  • 在NFS客户端,可以通过cat /proc/mounts 查看mount的挂载参数细节。

1.1.1 mount挂载及fstab文件说明

通过查看/proc/mounts文件查看挂载参数:

[root@web01-8 mnt]# grep "192.168.0.31" /proc/mounts
192.168.0.31:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.8,minorversion=0,local_lock=none,addr=192.168.0.31 0 0
192.168.0.31:/oldboy/ /video nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.8,minorversion=0,local_lock=none,addr=192.168.0.31 0 0

1.1.2 NFS客户端挂载参数说明(mount挂载):

如果考虑以简单、易用为原则,直接选择默认值即可:

mount -t nfs 192.168.0.31:/data/ /mnt

如果想要设置上述参数,则:

mount -t nfs -o fg,hard,intr,rsize=131072,wsize=131072 192.168.0.31:/data/ /mnt

参数说明:

  • fg, bg

    • 默认参数 fg
    • 功能:
      • 当在客户端执行挂载时,可选择是前台(fg)还是在后台(bg)执行。
      • 若在前台执行,则mount会持续尝试挂载,直到成功或挂载时间超时为止;
      • 若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其它程序操作。
      • 如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg比较妥当。
  • soft, hard
    • 默认参数:hard
    • 功能:
      • 当NFS 客户端以soft挂载NFS服务端时,若网络或Server出现问题,造成服务端和客户端之间无法传输资料,Client就会一直尝试,直到timeout后显示错误才停止
      • 若使用soft mount,可能会在timeout出现时造成资料丢失,不建议使用。
      • 若是hard模式挂载硬盘时,与soft相反,客户端会一直尝试连线到server,若服务端有回应则继续刚才的操作,若没有回应,客户端会一直尝试,此时无法umount或kill,所以常常配合intr使用。这是默认值
  • intr
    • 默认参数:无
    • 功能:
      • 当使用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,这避免出问题时系统整个被NFS锁死,建议使用intr
  • rsize, wsize
    • 默认参数:

      • CentOS 5: rsize=1024, wsize=1024
      • CentOS 6: rsize=131072, 维泽=131072
    • 功能:
      • rsize,即readsize,读出的区块大小
      • wsize,即writesize,写入的区块大小
      • 这个设置值可以影响客户端和服务器端传输数据的缓冲存储量
      • 如果在局域网内LAN,并且客户端和服务端都具有足够的内存,这个值可以设置大一点,如65535(bytes)
      • 提升缓冲区块将提升NFS文件系统的传输能力
      • 但设置的值不要太大,最好以网络能够传输的最大值为限
  • proto=udp
    • 默认参数:tcp
    • 功能:
      • proto=udp,使用UDP协议来传输资料,在LAN中会有比较好的性能
      • 默认使用tcp协议,跨越Internet,会有比较好的纠错能力

可以通过man nfs查看上述参数信息。

1.1.3 mount -o 参数对应的选项

参数:

  • suid,nosuid

    • 默认值:suid
    • 说明:
      • 当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能够取消设置SUID的功能
      • 示例:

        # 在nfs服务端的/data目录下创建测试文件,设置suid
        [root@nfs-31 data]# touch test_file_for_suid
        [root@nfs-31 data]# ll test_file_for_suid
        -rw-r--r-- 1 root root 0 Dec 10 21:44 test_file_for_suid
        [root@nfs-31 data]# chmod +s test_file_for_suid
        [root@nfs-31 data]# ll test_file_for_suid
        -rwSr-Sr-- 1 root root 0 Dec 10 21:44 test_file_for_suid
        [root@nfs-31 data]# stat test_file_for_suid
        File: `test_file_for_suid'
        Size: 0 Blocks: 0 IO Block: 4096 regular empty file
        Device: 803h/2051d Inode: 264647 Links: 1
        Access: (6644/-rwSr-Sr--) Uid: ( 0/ root) Gid: ( 0/ root)
        Access: 2019-12-10 21:44:24.393563215 +0800
        Modify: 2019-12-10 21:44:24.393563215 +0800
        Change: 2019-12-10 21:44:40.096563536 +0800 # 在nfs客户端,强制卸载之前挂载好的文件系统
        [root@web01-8 mnt]# umount -fl /mnt # 重新挂载
        [root@web01-8 mnt]# mount -t nfs -o bg,hard,intr,rsize=131072,wsize=131072,nosuid 192.168.0.31:/data/ /mnt
        [root@web01-8 mnt]# grep mnt /proc/mounts
        192.168.0.31:/data/ /mnt nfs4 rw,nosuid,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.8,minorversion=0,local_lock=none,addr=192.168.0.31 0 0 # 在客户端上/mnt下查看文件的权限属性
        # 虽然文件上的suid位还是显示,甚至可以通过chmod进行设置,但是无法使用
        # 如:/bin/cat命令,实验比较麻烦,仅做说明
        [root@web01-8 mnt]# ll
        总用量 4
        drwxr-xr-x 3 nfsnobody nfsnobody 4096 12月 9 18:08 backup
        -rw-r--r-- 1 nfsnobody nfsnobody 0 12月 9 18:08 file
        -rwSr-Sr-- 1 root root 0 12月 10 21:44 test_file_for_suid
      • 注意:在nfs服务端共享目录仍然可以设置文件的suid,并可以使用。具体内容具体分析。
  • rw,ro
    • 默认值:rw
    • 说明:
      • 可以指定文件系统是只读(ro)还是读写(rw)
  • dev,nodev
    • 默认值:dev
    • 说明:
      • 是否可以保留装置文件的特殊功能?
      • 一般来说只有/dev 才会有特殊的装置,因此可以选择nodev
  • exec,noexec
    • 默认值:exec
    • 说明:
      • 是否具有执行文件的权限?
      • 如果想要挂载的仅是普通资源数据区(如:图片,附件),那么可以选择noexec
  • user,nouser
    • 默认值:nouser
    • 说明:
      • 是否允许用户拥有文件的挂载和卸载功能?
      • 如果想要保护文件系统,最要不要为用户提供挂载和卸载功能
  • auto,noauto
    • 默认值:auto
    • 说明:
      • 这个auto指的是mount -a 时会不会被挂载的项目
      • 如果不需要这个分区随时被挂载,可以设置为noauto

下面是mount命令的-o选项后面可以接的参数,注意,有些选项只有出现在/etc/fstab 里面才有效。

下面这些选项可以应用在绝大多数文件系统上,但是sync仅适合ext2,ext3,fat,vfat和ufs等文件系统。

  • async

    • 异步,涉及文件系统的I/O的操作都是异步处理。即不会同步写到磁盘。
    • 此参数提高性能,但会降低数据安全。
    • 不推荐生产使用,除非对性能要求很高,对数据可靠性不要求的场合。
  • sync
    • 与async相反。
    • I/O同步,即把数据同步写入硬盘。
    • 牺牲一部分I/O性能,但是可以确保停电后数据的安全性。
  • atime
    • 在每一次数据访问时,同步更新访问文件的inode时间戳。
    • 是默认选项。
    • 在高并发情况下,建议通过noatime,取消这个默认项,以提升I/O性能。
  • ro
    • 只读
  • rw
    • 读写
  • auto
    • 能够被自动挂载通过-a选项
  • noauto
    • 不会自动挂载文件系统
  • defaults
    • 这是fstab里的默认值,包括:rw,suid,dev,exec,auto,nouser,async
    • 默认情况下,大部分都是默认值
  • exec
    • 允许文件系统执行二进制文件
    • noexec可以提升系统安全性
  • noexec
    • 在挂载的文件系统中,不允许直接执行任何二进制的程序
    • 注意,仅对二进制程序有效
    • 即使是设置了noexec,shell,php程序还是可以执行的。
  • noatime
    • 访问文件时不更新文件的inode时间戳
    • 高并发情况下,推荐应用该选项,提升系统I/O性能
  • nodiratime
    • 不更新文件系统上的directory inode时间戳
    • 高并发环境,推荐显式应用该选项,可以提升系统I/O性能
  • nosuid
    • 不允许set-user-identifier or set-group-identifier 位生效
    • 即,suid和sgid设置不生效
  • suid
    • 允许设置suid和sgid,并允许生效
  • nouser
    • 禁止一个普通用户挂载该文件系统
    • 默认挂载的默认选项
  • remount
    • 尝试重新挂载一个已经挂载了的文件系统
    • 通常被用来改变一个文件系统的挂载标志,从而使得一个只读文件系统变得可写
    • 这个动作不会改变设备或者挂载点
    • 当系统故障时进入single或rescue模式修复系统时,会发现根文件系统经常会变成只读文件系统,不允许修改,该命令就派上用场了
    • 具体的命令为:mount -o remount,rw /,表示将根文件系统重新挂载,使得可写
    • single或rescue模式修复系统时,这个命令十分重要。
  • dirsync
    • 目录更新时同步写入磁盘

其中,

  • sync,rw,noatime,nodiratime 为性能优化重要选项,
  • noexec,nosuid,dirsync 为安全优化重要选项。

remount实际案例:

  • fstab修改错误导致系统无法启动故障修改案例:

    • 维护模式或救援模式:
    • mount -o rw,remount
    • 然后修改/etc/fstab
  • 文件系统只读故障修复案例

    • 可能出现问题的原因:

      • rsync bug
      • 文件系统内部自动一致性(只读)
    • 维护模式或救援模式:
    • mount -o rw,remount /

1.2 NFS客户端挂载优化

在企业生产环境中,NFS客户端挂载有没有必须要加某些参数,比如:noexec,nosuid,nodev,bg,soft,rsize,wsize等参数。在生产环境中如何做呢?

解答:

这个问题属于mount挂载优化内容(有些参数也适合其它文件系统),一般来说要适当加挂载参数,但是,最好是先做好测试,用数据来说话,才能更好地确定到底是挂载还是不挂载。

1.2.1 有关系统安全性挂载参数选项:nosuid,noexec

在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片,附件,视频),不需要执行suid,exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。

例如:

很多木马篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。

因此,挂载的时候,用下面的命令很有必要:

mount -t nfs -o nosuid,noexec,nodev,rw 192.168.0.31:/data /mnt

通过mount -o 指定挂载参数与在/etc/fstab里指定挂载参数的效果是一样的。

网络文件系统和本地的文件系统效果也是一样的。

1.2.2 mount挂载性能优化参数选项

下面介绍几个在企业生产环境下,NFS性能优化挂载的例子。

  • 禁止更新目录和文件时间戳挂载

    • mount -t nfs -o noatime,nodiratime 192.168.0.31:/data /mnt
  • 安全加优化的挂载方式
    • mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.0.31:/data /mnt
  • 默认的挂载方式
    • mount -t nfs 192.168.0.31:/data /mnt

如果是本地文件系统,使用如下命令:mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0

本地文件系统挂载时,如果加nodirtime会报错。

根据前面的测试我们知道,默认情况下,NFS Server 共享目录的参数默认配置为wsize和rsize,它们设定了NFS服务端和客户端之间传输的数据块大小。

wsize和rsize的大小最好是1024的倍数,对于NFSV2来说,8192是rsize和wsize的最大数值,如果使用的是NFSV3,则可以尝试设置32768,如果是NFSV4可以到65536或更大。

如果在客户端挂载时使用了这两个参数,可以让客户端在读取和写入数据时,一次性读写更多的数据包,这可以提升访问性能和效率。

noatime和nodiratime性能优化选项,这两个选项在读写此案时候,不更新文件和目录的时间戳(即不更新文件系统中文件对应的inode信息),这样可以减少和磁盘系统的交互,提升读取和写入磁盘的效率,因为磁盘是机械的, 每次读写都会消耗磁盘I/O,而更新文件时间戳对于工作数据必要性不大,最大问题是增加了访问磁盘I/O的次数,拖慢系统性能。

以下是NFS网络文件系统优化挂载的参数建议。

在CentOS6服务器和客户端环境下,可使用如下命令参数:

  mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=131072,wsize=131072 192.168.0.31:/data /mnt

经过实际测试,CentOS 6默认的挂载参数性能还是不错的。

注意:

非性能的参数越多,速度可能会越慢。根据具体的业务需要以及实际测试效果选择挂载参数。

1.2.3 NFS内核优化建议

下面是优化选项说明:

  • /proc/sys/net/core/rmen_default

    • 该文件指定了接收套接字缓冲区大小的默认值(以字节为单位),默认设置:124928
  • /proc/sys/net/core/rmen_max
    • 该文件指定了接收套接字缓冲区大小的最大值(以字节为单位),默认设置:124928
  • /proc/sys/net/core/wmen_default
    • 该文件指定了发送套接字缓冲区大小的默认值(以字节为单位),默认设置:124928
  • /proc/sys/net/core/wmen_max
    • 该文件指定了发送套接字缓冲区大小的最大值(以字节为单位),默认设置:124928
[root@nfs-31 data]# head /proc/sys/net/core/*mem*
==> /proc/sys/net/core/optmem_max <==
20480 ==> /proc/sys/net/core/rmem_default <==
124928 ==> /proc/sys/net/core/rmem_max <==
124928 ==> /proc/sys/net/core/wmem_default <==
124928 ==> /proc/sys/net/core/wmem_max <==
124928

上述文件对应的具体内核优化命令如下(在NFS服务器端进行配置修改):

cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
sysctl -p

查看修改结果:

[root@nfs-31 data]# tail -4 /etc/sysctl.conf
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

1.2.4 企业生产场景NFS共享存储优化小结

  • 硬件:sas/ssd硬盘,买多块盘,raid10,硬RAID。网卡吞吐量要大,至少千兆(多块bond)
  • NFS服务器端配置:/data 192.168.0.0/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
  • NFS客户端挂载优化配置命令:
    • mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,rsize=131072,wsize=131072 192.168.0.31:/data/ /mnt
  • 对NFS服务的所有服务器内核进行优化时,执行如下命令:
    • cat >>/etc/sysctl.conf<<EOF
      net.core.wmem_default = 8388608
      net.core.rmem_default = 8388608
      net.core.rmem_max = 16777216
      net.core.wmem_max = 16777216
      EOF
    • 执行sysctl -p生效

  • 如果卸载的时候提示“umount:/mnt: device is busy”,需要退出挂载目录再进行卸载,如果是NFS服务器宕机了,则需要强制卸载。

    • 强制卸载命令:umount -lf /mnt
  • 大型网站NFS网络文件系统的替代软件为分布式文件系统Moosefs(mfs),GlusterFS,FastDFS

2. NFS系统应用的优缺点说明

NFS服务可以让不同的客户端挂载使用同一个共享目录,也就是将其作为共享存储使用,这样可以保证不同节点客户端数据的一致性,在集群架构环境中经常会使用到。

如果是Windows和Linux混合环境的集群系统,可以用samba来实现。

优点:

  • 简单,容易上手,容易掌握
  • NFS文件系统内数据是在文件系统之上的,即数据是能看得见的。
  • 部署快速,维护简单方便,且可控,满足需求就是最好的
  • 可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
  • 服务非常稳定。

局限:

  • 存在单点故障,如果NFS服务端宕机了,所有客户端都不能访问共享目录。这个在后期会通过负载均衡及高可用方案弥补
  • 在大数据高并发的场合,NFS效率,性能有限(2千万/日以下PV的网站不是瓶颈,除非网站架构设计太差)
  • 客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)
  • NFS数据是明文的,NFS本身不对数据完整性进行验证。
  • 多台客户机挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其当NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可使用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)
  • 涉及了同步(实时等待)和异步(解耦)的概念,NFS服务器端和客户端相对来说,就是耦合度有些高。网站程序也是一样,尽量不要耦合度太高,系统和程序架构师的重要职责就是为程序及架构解藕,让网站的扩展性变得更好。

应用建议:

对于大中小型网站(参考点2000万/日PV以下)线上应用,都有用武之地。

门户网站也会有应用,生产场景应该多将数据的访问往前推,即尽量将静态存储里的资源通过CDN或缓存服务器提供服务。

如果没有缓存服务或架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差。

【集群实战】NFS网络文件共享服务2-mount挂载(参数,优化)的更多相关文章

  1. Linux实战教学笔记22:企业级NFS网络文件共享服务

    目录 第二十二节 企业级NFS网络文件共享服务 第一章 NFS网络文件共享服务 1.1 NFS介绍 1.2 NFS系统原理介绍 1.3 NFS服务端部署环境准备 1.4 NFS server端的设置 ...

  2. (转)企业级NFS网络文件共享服务

    企业级NFS网络文件共享服务 原文:http://www.cnblogs.com/chensiqiqi/archive/2017/03/10/6530859.html --本教学笔记是本人学习和工作生 ...

  3. 企业级NFS网络文件共享服务_【all】

    1.1. 什么是NFS(1台机器提供服务) Network File System(网络文件系统)通过局域网让不同的主机系统之间共享文件或目录. NFS客户端可以通过挂载的方式将NFS服务器端共享的数 ...

  4. 搭建企业级NFS网络文件共享服务说明[一]

    1.1.0. 概述: 共享/NFS目录给整个192.168.25.0/24网段主机读写 man nfs 可以查看mount的信息 rpc端口111 nfs主端口2049 1.1.1. 搭建NFS环境 ...

  5. 【集群实战】NFS网络文件共享服务

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

  6. 【集群实战】NFS网络文件共享服务3-相关知识补充(showmount,exports,rpc)

    1. showmount命令说明 showmount命令一般用于从NFS客户端检查NFS服务器端共享目录的情况. 参数说明: -e,--exports 显示NFS服务器输出的目录列表 [root@we ...

  7. NFS网络文件共享服务

    NFS-网络文件系统,它的主要功能是通过网络让不同的主机系统之间可以彼此共享文件或目录. NFS在企业中得应用场景 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频.图片.附件等静 ...

  8. 搭建企业级NFS网络文件共享服务[二]

    1.1.8 NFS问题总结 1.问:使用showmount -e 127.0.0.1后报clnt_create: RPC: Program not registered错误 答:顺序不对,重启nfs服 ...

  9. 搭建企业级NFS网络文件共享服务

    NFS服务简介 NFS是Network  File System(网络文件系统).主要功能是通过网络让不同的服务器之间可以共享文件或者目录.NFS客户端一般是应用服务器(比如web,负载均衡等),可以 ...

随机推荐

  1. Html 慕课园编程练习10-1

    23:10:25 2019-08-14 自己写的这个好丑.... 题目:利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: (另外 这个动图是怎么插入的 用url就行 复制就 ...

  2. 九九乘法表 C语言

    无需输入,直接输出九九乘法表,特别简单. 运行结果如下: #include<stdio.h> int main() { ; ; , j = ; ; i < ; i++,b++) { ...

  3. js之ES6的Class类

    JavaScript ES6之前的还没有Class类的概念,生成实例对象的传统方法是通过构造函数. 例如: function Mold(a,b){ this.a=a; this.b=b; } Mold ...

  4. 部署并测试动态WSGI站点

                                                            部署并测试动态WSGI站点 5.1问题 本例要求为站点webapp0.example.c ...

  5. Shell:homework

    1.判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否则显示”/etc/inittab is a small file.”# ...

  6. pyecharts数据可视化模块

    目录 安装 柱状图-Bar 饼图-Pie 箱体图-Boxplot 折线图-Line 雷达图-Rader 散点图-scatter 我们都知道python上的一款可视化工具matplotlib,而前些阵子 ...

  7. 【Debug记录】Exeption thrown by glCreateVertexArrays

    继在机场丢失笔记本后又一大灾难--小组项目无法在老电脑上运行. 位置:glCreateVertexArrays函数 报错:Exception thrown at 0x00000000 in Clien ...

  8. Unity - 旋转方法

    前言 本文梳理了Unity中常用的旋转方法,涉及两大类:Transform.Quaternion. Transform 类 Rotate() 此方法重载多,易理解,在连续动态旋转中较为常用. /* o ...

  9. Linux 压缩备分篇(一 备份数据)

    备份文件                dump dump: -S                    仅列出待备份数据需要多少磁盘空间才能够备份完毕 -u                    将 ...

  10. Go gRPC进阶-TLS认证+自定义方法认证(七)

    前言 前面篇章的gRPC都是明文传输的,容易被篡改数据.本章将介绍如何为gRPC添加安全机制,包括TLS证书认证和Token认证. TLS证书认证 什么是TLS TLS(Transport Layer ...