nfs架构(代码片段)

author author     2022-11-18     500

关键词:

title: NFS架构
tags: nfs,rpc,rpcbind
grammar_cjkRuby: true

NFS架构

1. NFS简述

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。注意,如果企业的业务量比较小的时候,单台机器(不使用nfs)的性能是优于集群性能的,但是当业务量大的时候,单台机器支撑不住的时候,集群的优势就体现出来了。

2.为什么要使用NFS

NFS是一种简单方便的,在linux和unix系统中进行共享的网络文件系统,它在linux和unix系统中挂载就像用本地硬盘挂载一样,可以实现,多个用户共同读取,而且把各个用户读写的文件权限都压缩成一个普通用户权限,这样各个主机一起读取写入就不会造成权限问题,非常适合中小型互联网企业应用,而且在读写速度上,如果带宽足够的话,不会有延迟的现象。
在企业集群架构的工作场景中,NFS网络文件系统一般用来存储共享视频、图片、附件等静态资源文件,一般是网站用户上传的文件都放在NFS共享里,例如播客产品的图片、附件、头像、注意网站程序不要放在NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源,所以NFS是当前中小型互联网架构中最常用的数据存储服务之一,大的公司可能会使用比较复杂的分布式文件系统Moosefs,glusterfs,FastDFS等。
如下图:
技术分享图片

3 NFS架构流程

技术分享图片

1 .服务端RPC服务起来,NFS服务再起来
2 待NFS服务起来后将所用的端口后向RPC上注册
3 NFS服务端将端口注册成功后等待连接进来
4 客户端不用起NFS服务,只需要起RPC服务,客户端的RPC服务向服务端的RPC daemon请求访问端口
5 服务端RPC daemon 向客户端RPC反馈NFS端口号
6 NFS客户端携带端口号向NFS服务端请求数据连接

4 NFS服务配置

4.1 NFS 的配置文件为:/etc/exports
配置文件格式为:NFS 共享目录 NFS客户端地址1(参数1,参数2... )NFS客户端地址2(参数1,参数2... )

 [[email protected] www]# cat /etc/exports 
/data   192.168.50.0/24(rw,sync,all_squash)

4.2 NFS和RPC安装,注意先启动rpcbind,再启动nfs服务

[[email protected] www]# mkdir /data
[[email protected] www]# chown 65536:65536 /data
[[email protected] mnt]# ls -ld /data
drwxr-xr-x. 2 nfsnobody nfsnobody 98304 May 18 17:28 /data
[[email protected] www]# yum install nfs-utils rpcbind -y
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 [[email protected] www]# /etc/init.d/rpcbind restart  
Stopping rpcbind:                                          [  OK  ]
Starting rpcbind:                                          [  OK  ]
[[email protected] www]# 
[[email protected] www]# /etc/init.d/nfs restart    
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS services:                                [  OK  ]
Shutting down RPC idmapd:                                  [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

4.3 nfs服务端确定nfs端口已向rpcbind注册,并在服务端尝试挂载

[[email protected] www]# /etc/init.d/prcbind restart
-bash: /etc/init.d/prcbind: No such file or directory
[[email protected] www]# /etc/init.d/rpcbind restart  
Stopping rpcbind:                                          [  OK  ]
Starting rpcbind:                                          [  OK  ]
[[email protected] www]# 
[[email protected] www]# /etc/init.d/nfs restart    
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS services:                                [  OK  ]
Shutting down RPC idmapd:                                  [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[[email protected] www]# 
[[email protected] www]# exportfs -av
exporting 192.168.50.0/24:/data
[[email protected] www]# showmount -e localhost
Export list for localhost:
/data 192.168.50.0/24
[[email protected] www]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp  45209  mountd
    100005    1   tcp  58457  mountd
    100005    2   udp  54966  mountd
    100005    2   tcp  37880  mountd
    100005    3   udp  40224  mountd
    100005    3   tcp  49630  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  50773  nlockmgr
    100021    3   udp  50773  nlockmgr
    100021    4   udp  50773  nlockmgr
    100021    1   tcp  46835  nlockmgr
    100021    3   tcp  46835  nlockmgr
    100021    4   tcp  46835  nlockmgr
[[email protected] www]# ifconfig eth0 |awk -F ‘[ :]+‘  ‘NR==2 print $4‘
192.168.50.1
[[email protected] www]# mount -t nfs 192.168.50.1:/data /mnt
[[email protected] www]# df -k |grep "mnt"
192.168.50.1:/data    18241408 2077888  15230240  13% /mnt
[[email protected] www]# cd /mnt
[[email protected] mnt]# touch file1..100
[[email protected] mnt]# ls |wc -l

4.4 NFS客户端安装nfs和rpcbind套件
一般来说客户端只需要安装rpcbind,但是因为nfs-utils里含有一些工具,如showmount等,因此最好在客户端也安装nfs但是不启动服务,如:

[[email protected] ~]# yum install nfs-utils rpcbind -y
Loaded plugins: fastestmirror
Setting up Install Process
Determining fastest mirrors
 * base: mirrors.aliyun.com
 [[email protected] ~]# /etc/init.d/rpcbind restart
Stopping rpcbind:                                          [  OK  ]
Starting rpcbind:                                          [  OK  ]
[[email protected] ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    [[email protected] ~]# /etc/init.d/rpcbind restart
Stopping rpcbind:                                          [  OK  ]
Starting rpcbind:                                          [  OK  ]
[[email protected] ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
[[email protected] ~]# showmount -e 192.168.50.1
Export list for 192.168.50.1:
/data 192.168.50.0/24
[[email protected] ~]# mkdir nfs
[[email protected] ~]# mount -t nfs 192.168.50.1:/data ~/nfs
[[email protected] ~]# df -hk |grep "nfs"
192.168.50.1:/data    18241408 2077920  15230208  13% /nfspool
192.168.50.1:/data    18241408 2077920  15230208  13% /root/nfs

4.5 配置完成后在客户端查看挂载参数,确认所需权限是不是对的,然后换成普通用户看可不可正常读写,服务端用root写数据,客户端用普通用户看可不可以修改删除。

[[email protected] mnt]# touch file
[[email protected] mnt]# ls -l
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 May 18 18:12 file
[[email protected] nfs]# ls -l
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 May 18  2018 file
[[email protected] nfs]# echo "hello" >>file 
[[email protected] nfs]# cat file 
hello
[[email protected] nfs]# cat /proc/mounts |grep "root/nfs"
192.168.50.1:/data/ /root/nfs nfs4 rw,relatime,vers=4,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.50.3,minorversion=0,local_lock=none,addr=192.168.50.1 0 0
[[email protected] mnt]# cat /var/lib/nfs/etab
/data   192.168.50.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,all_squash)

5 配置参数详解及注意事项

5.1 服务端要注意,一定要先启动rpcbind再启动nfs,因为nfs需要向rpcbind注册端口。
5.2 常用命令解释
showmount -e 127.0.0.1 显示可以挂载的文件系统
rpcinfo -p localhost 查看nfs注册的端口号
mount -t nfs 192.168.50.1:/data /mnt 挂载nfs文件系统
/etc/init.d/nfs reload 平滑重启服务
cat /proc/mounts |grep "root/nfs" 客户端查看挂载参数
cat /var/lib/nfs/etab 服务端查看nfs配置参数
5.3 如果nfs客户端查不到挂载项,排错思路,首先确认ping服务端是否通,然后telnet服务端ip看端口是否可以连接
5.4 服务一般我们用rc.local来管理,把rc.local 文件作为本机的重要文件,所有服务的开机自动启动项都放入/etc/rc.local内,这样规范的好处是,一旦服务器的运维人员离职或者业务迁移时都可以通过/etc/rc.local很容易查到服务器的相关服务,方便运维管理。例如:

[[email protected] ~]# tail -5 /etc/rc.local 
/etc/init.d/rpcbind start
/etc/init.d/nfs start
sh /service/scripts/inotify.sh & 
rsync --daemon
Starting SMB services: 
[[email protected] ~]#

5.5 服务端配置文件中的yu允许客户端访问的ip可以设置为单个ip也可以整个网段,如
10.0.0.0/24

6 NFS 服务端设置参数详解

  1. rw,ro:读写与只读
  2. sync:同步客户端往服务端写数据,写成功后才返回OK,安全不会丢数据,但是性能没async那么好。
  3. async: 异步请求写入数据时,先返回请求,再将数据写入到内存,如果服务器中途断电,可hui能内存内的数据来不及向硬中写入,所以可能会丢数据,但是效率高,因为是往对方内中写数据,电商秒杀是异步,短时间内数据会稍微延迟。
  4. no_root_squash:如果对于访问NFS server共享目录用户是root的话,那这个客户端对这个共享目录具有root权限
  5. root_squash:如果对于访问NFS server共享目录用户是root的话,那被写入的数据的权限会被压缩成匿名用户,UID和GID通常会变成nfsnobody,这个用户是可以改的,只是通常默认是这个。
  6. all_squash:不管访问NFS server共享目录用户是root还是普通用户都会被压缩成匿名用户,UID和GID通常会变成nfsnobody,这个用户是可以改的,只是通常默认是这个。

7 NFS客户端挂载参数

  1. 挂载时最好选择hard +intr :为了防止整个系统被NFS锁死,因为hard连接的时候,即使服务端NFS没起来,客户端也是一直在尝试进行连接,导致df -h无输出,如果添加了intr,可以按ctrl+c中断
  2. rsize和wsize:性能优化参数,这个设置可以影响客户端和服务端传输数据的缓冲存储量,一般来说在局域网内,并且客户端和服务端都足够大内存可以设置大一点,比如65535或者131072,提升缓冲区可提升NFS文件系统传输能力,但是也不要太大了,最好是在网络能传输的最大值,一般默认是:32768。
  3. 客户端挂载加参数命令格式为:
    mount -t nfs -o bg,hard,intr,rsize=131072,wsize=131072 10.0.0.7:/data /mnt
  4. async:异步
  5. sync:同步
  6. ro:只读
  7. rw:读写
  8. auto:可以通过mount -a 自动挂载,但是前提要写入/etc/fstab文件
  9. defaults:fstab的缺省值包括:rw,suid,dev,exec,auto,nouser,async
  10. exec:允许文件系统执行二进制文件,取消这个参数可以提升安全,因为木马即使被上传也不能被执行,适用于那种仓库存储
  11. noatime:不更新文件系统上的inode访问时间,高并发环境推荐,可以显著提高性能
  12. nodiratime:不更新文件系统上的目录节点访问时间,高并发环境推荐,可以显著提高性能
  13. nosuid:不允许权限位生效,可以提高安全
  14. noexec:不允许文件系统执行二进制文件
  15. remount:mount -o remount,rw(当系统出错进入救援模式时无法写系统,可利用remount参数
  16. 客户端的安全挂载命令:
    mount -t nfs -o nosuid,noexec,nodev,rw 192.168.50.1:/data /mnt
  17. 客户端的性能挂载命令:
    mount -t nfs -o noatime,nodiratime,rw 192.168.50.1:/data /mnt
  18. 客户端的安全加性能参数为:
    mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rw,hard,intr,rsize=131072,wsize=131072 192.168.50.1:/data /mnt
  19. 本地文件系统挂载:
    mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0
  20. 如果卸载文件系统时,有用户或者进程在访问,导致卸载的时候提示设备忙,则可以使用umount -lf /mnt

8 NFS内核优化

  1. /proc/sys/net/core/rmem-default :指定接收套接字缓冲区大小的缺省值,缺省值为124928,对应优化是将值设置为最大8388608
    [[email protected] ~]# cat /proc/sys/net/core/rmem_default 
    124928
    [[email protected] ~]# echo "8388608" > /proc/sys/net/core/rmem_default 
    [[email protected] ~]# cat /proc/sys/net/core/rmem_default              
    8388608
  2. /proc/sys/net/core/rmem_max:指定接收套接字缓冲区大小的最大值,缺省值为124928,对应优化是将值设置为最大16777216
    [[email protected] ~]# cat /proc/sys/net/core/rmem_max 
    124928
    [[email protected] ~]# echo "16777216" > /proc/sys/net/core/rmem_max 
    [[email protected] ~]# cat /proc/sys/net/core/rmem_max               
    16777216

    3 . /proc/sys/net/core/wmem_default :指定发送套接字缓冲区大小的缺省值,缺省值为124928,对应优化是将值设置为最大8388608

    [[email protected] ~]# cat /proc/sys/net/core/wmem_default 
    124928
    [[email protected] ~]# echo "8388608" > /proc/sys/net/core/wmem_default 
    [[email protected] ~]# cat /proc/sys/net/core/wmem_default              
    8388608
  3. /proc/sys/net/core/wmem_max: 指定发送套接字缓冲区大小的最大值,缺省值为124928,对应优化是将值设置为最大16777216
    [[email protected] ~]# cat /proc/sys/net/core/wmem_max 
    124928
    [[email protected] ~]# echo "16777216" > /proc/sys/net/core/w
    warnings      wmem_default  wmem_max      
    [[email protected] ~]# echo "16777216" > /proc/sys/net/core/wmem_max 
    [[email protected] ~]# cat /proc/sys/net/core/wmem_max               
    16777216

    以上是临时修改,如果需要永久修改则必须写入配置文件,依次追加以上4条到/etc/sysctl.conf,然后执行,sysctl -p 使之生效,如:

    [[email protected] ~]# echo "net.core.rmem_max = 16777216" >>/etc/sysctl.conf  
    [[email protected] ~]# echo "net.core.wmem_max = 16777216" >>/etc/sysctl.conf   [[email protected] ~]# echo "net.core.wmem_default = 8388608" >>/etc/sysctl.conf [[email protected] ~]# echo "net.core.rmem_default = 8388608" >>/etc/sysctl.conf  [[email protected] ~]# tail -4 /etc/sysctl.conf 
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608
    [[email protected] ~]# sysctl -p
    net.ipv4.ip_forward = 0
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.default.accept_source_route = 0
    kernel.sysrq = 0
    kernel.core_uses_pid = 1
    net.ipv4.tcp_syncookies = 1
    kernel.msgmnb = 65536
    kernel.msgmax = 65536
    kernel.shmmax = 68719476736
    kernel.shmall = 4294967296
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608

linux(10):期中架构---nfs存储服务(代码片段)

1.共享存储服务概念:#NFS是NetworkFileSystem的缩写,中文意思是网络文件系统,#它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。2.NFS共享存储服务的应用:#将数据存储到一台服务器上,实现... 查看详情

nfs网络文件共享系统-综合架构no.2(代码片段)

相信可能成就一切可能,相信不可能就是自废武功!!!nfs服务器搭建文档1.先打印系统版本cat/etc/redhat-releaseuname-runame-m2.在所有需要使用nfs的服务器上安装nfs-utilsrpcbindyuminstallnfs-utilsrpcbind-yrpm-qanfs-utilsrpcbind安装好nfs系统会创建... 查看详情

002.kickstart部署之nfs架构(代码片段)

一准备1.1完整架构:Kickstart+DHCP+NFS+TFTP+PXE1.2组件应用Kickstart服务端IP:172.24.8.12DHCP:提供客户端IP,网关,镜像路径等;TFTP:共享pxelinux.0、initrd.img、vmlinux、isolinux.cfg、boot.msg、vesamenu.c32、splash.png文件NFS:共享ks.cfg、及所有光盘... 查看详情

nfs(代码片段)

...支持多节点挂载并发写入特点:单台,适合小型网络集群架构,非常稳定;大型公司使用(mfs,glusterfs,fastdfs)nfs优点:部署和维护简单;数据是在文件系统之上,是能看见真实的数据,大型分布式文件系统都是看不到数据的;可... 查看详情

nfs共享存储服务部署(代码片段)

...网络驱动器类似,只不过windows用于局域网,NFS用于企业集群架构中,如果是大型网站,会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS1.2为什么要使用NFS服务实现多台服务器之间数 查看详情

nfs网络文件系统详解(代码片段)

...网络驱动器类似,只不过windows用于局域网,NFS用于企业集群架构中,如果是大型网站,会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS1.2为什么要使用NFS服务进行数据存 查看详情

keepalived+lvs+tomcat+nfs架构部署(代码片段)

目录一、实验环境准备二、配置负载调度器lvs(主192.168.59.11,备192.168.59.10)安装ipvsadm工具配置VIP地址(主192.168.59.100)调整内核(proc)响应参数配置负载分配lvs2(备192.168.59.10)相同配置(把上面再执行一遍)三、部... 查看详情

nfs4使用中的防火墙配置(代码片段)

...calhostlib]#cat/etc/redhat-releaseCentOSLinuxrelease8.1.1911(Core)说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里获取: https://github.com/liuhongdi/ 说明:作者:刘... 查看详情

inotify+rsync实现实时同步部署(代码片段)

1.1.架构规划1.1.1架构规划准备服务器系统角色IPCentos6.7x86_64NFS服务器端(NFS-server-inotify-tools)192.168.1.14Centos6.7x86_64rsync服务器端(rsync热备服务器)192.168.1.17   1.1.2架构图 2.1部署前检查2.1.1检查rsync热备服务器daemon是 查看详情

nfs网络文件系统详解(代码片段)

...网络驱动器类似,只不过windows用于局域网,NFS用于企业集群架构中,如果是大型网站,会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS1.2为什么要使用NFS服务进行数据存储1.实现多台服务器之间数据共享2.实现多台服务器之间数据的... 查看详情

elasticsearch:为snapshot设置nfs共享(代码片段)

...Elasticsearchbackup管理中最关键的部分。由于其原生分布式架构,快照(snapshot)和恢复过程以集群方式设计。在快照期间,分片被复制到定义的存储库。如果此存储库是节点本地的,则备份数据分布在所有节点... 查看详情

kubernetes集群搭建zabbix监控平台(代码片段)

...、zabbix介绍1.zabbix简介2.zabbix特点3.zabbix的主要功能4.zabbix架构图二、检查本地k8s环境1.检查系统pod运行状态2.检查node节点状态三、配置nfs共享存储1.安装nfs2.创建共享目录3.配置共享目录4..启动相关服务5.使配置生效6.查看nfs7.其他... 查看详情

渗透测试-nfs安全(代码片段)

...件系统,不过,相对比较稳定,由服务端和客户端组成[即C/S架构],服务端主要负责提供共享目录[一般为web的用户数据存放目录,专门用来存放用户上传的各类静态数据],而客户端则负责存取该共享目录中的数据0x02NFS容易产生安全问题... 查看详情

轻松搭建web网站架构服务(代码片段)

学习目标:搭建lnmp网站架构,实现负载均衡、高可用,以及https,并通过NFS优化数据存储。服务器IP地址web1192.168.2.137web2192.168.2.136mysql192.168.2.133PHP192.168.2.130lb(keepalived)1192.168.2.135lb(keepalived)2192.16 查看详情

nfs--共享存储(代码片段)

...网络驱动器类似,只不过windows用于局域网,NFS用于企业集群架构中,如果是大型网站,会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS1为什么使用共享存储?1.实现多台服务器之间数据共享2.实现多台服务器之间数据一致二:NFS应用... 查看详情

centeros下使用nfs远程目录挂载(代码片段)

...0c;而实际上却是远端的NFS服务器的目录。二、NFS搭建整体架构:主机角色192.168.40.160NFS服务器192.168.40.161NFS客户端1192.168.40.162NFS客户端2本篇文章达 查看详情

nfs共享存储(代码片段)

目录环境准备NFS服务端NFS客户端httpd服务环境准备主机名wanIPlanIP角色web0110.0.0.7172.16.1.7nfs的客户端web0210.0.0.8172.16.1.8nfs的客户端nfs10.0.0.31172.16.1.31nfs的服务端NFS服务端NFS(NetworkFileSystem)和RPC(RemoteProcedureCall)部署NFS服务端,需要... 查看详情

nfs(代码片段)

 当访问程序通过NFS客户端向NFS服务器存取文件时,其请求数据流程大致如下:01.首先用户访间网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过... 查看详情