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

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或缓存服务器提供服务。

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

原文地址:https://www.cnblogs.com/zoe233/p/12018875.html