NFS详细介绍与企业应用场景结合案例

一、NFS服务简介

  NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

  NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

  NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输

下面是NFS与rpc

部署NFS服务,需要以下软件包

nfs-utils:这个NFS服务主程序

portmap:Centos5.x 下面RPC的主程序

rpcbind:Centos6.x 下面的RPC主程序

在提供NFS服务之前必须启动rpcbind服务

一、查看系统环境信息

[[email protected] ~]# cat /etc/redhat-release

CentOS release 6.5 (Final)

[[email protected] ~]# uname -r

2.6.32-431.el6.x86_64

[[email protected] ~]# uname -m

x86_64

二、查看nfs软件包

[[email protected] ~]# rpm -qa rpcbind

rpcbind-0.2.0-11.el6.x86_64

[[email protected] ~]# rpm -qa  nfs-utils

nfs-utils-1.2.3-54.el6.x86_64

如果没有,执行安装即可

yum install nfs-utils  rpcbind -y

三、 启动

1,先启动rpcbind

[[email protected] ~]# /etc/init.d/rpcbind start

Starting rpcbind:

[[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

此时nfs没有向他注册端口

2,在启动nfs

[[email protected] ~]# /etc/init.d/nfs start

Starting NFS services:                                     [  OK  ]

Starting NFS mountd:                                       [  OK  ]

Starting NFS daemon:                                       [  OK  ]

Starting RPC idmapd:                                       [  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

100005    1   udp  59246  mountd

100005    1   tcp  51850  mountd

100005    2   udp  49388  mountd

100005    2   tcp  51643  mountd

100005    3   udp  47327  mountd

100005    3   tcp  54323  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  59127  nlockmgr

100021    3   udp  59127  nlockmgr

100021    4   udp  59127  nlockmgr

100021    1   tcp  46324  nlockmgr

100021    3   tcp  46324  nlockmgr

100021    4   tcp  46324  nlockmgr

[[email protected] ~]# ^C

加入开机启动

chkconfig nfs   on

chkconfig rpcbind  on

3,客户端配置

[[email protected] ~]# cat /etc/redhat-release

CentOS release 6.5 (Final)

[[email protected] ~]# uname -r

2.6.32-431.el6.x86_64

[[email protected] ~]# uname -m

x86_64

yum install rpcbind -y

[email protected] ~]# /etc/init.d/rpcbind start

Starting rpcbind:

chkconfig rpcbind  on

4,服务器端开始配置nfs的共享目录

[[email protected] ~]# vim /etc/exports

/application 192.168.0.0/24(rw,sync)

[[email protected] ~]# /etc/init.d/nfs reload   平滑重启

[[email protected] ~]# cat /etc/exports

#share directory

/application 192.168.0.0/24(rw,sync)

[[email protected] ~]# showmount -e localhost

Export list for localhost:

/application 192.168.0.0/24

客户端检查是否可挂载

[[email protected] ~]# showmount -e  192.168.0.221

Export list for 192.168.0.221:

/application 192.168.0.0/24

客户端开始挂载

[[email protected] ~]# mount -t nfs 192.168.0.221:/application /mnt

[[email protected] ~]# df -h

Filesystem                    Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root   36G  1.2G   33G   4% /

tmpfs                         242M     0  242M   0% /dev/shm

/dev/sda1                     485M   32M  428M   7% /boot

192.168.0.221:/application     36G  4.8G   29G  15% /mnt

[[email protected] ~]# ^C

[[email protected] ~]# cd /mnt/

[[email protected] mnt]# ls

apache  nginx

[[email protected] mnt]# touch test.txt

touch: cannot touch `test.txt‘: Permission denied  服务器的目录权限

[[email protected] mnt]# ^C

[[email protected] application]# ll -d /application/

drwxr-xr-x. 4 root root 4096 Jul 24 17:56 /application/  此时其他用户没有写权限

服务器端:

[email protected] ~]# cat /var/lib/nfs/etab

/application 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)

找到nfs的默认用户anonuid gid

[[email protected] ~]# cat /etc/passwd | grep 65534

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

此时nfs的默认用户是 nfsnobody

[email protected] ~]# chown -R nfsnobody:nfsnobody /application

此时客户端应该有权限写入数据

[[email protected] mnt]# ll

total 8

drwxr-xr-x. 15 nfsnobody nfsnobody 4096 Jul 17 21:18 apache

-rw-r--r--.  1 nfsnobody nfsnobody    0 Jul 24  2015 ceshi.txt

drwxr-xr-x. 11 nfsnobody nfsnobody 4096 Jul 15 17:58 nginx

[[email protected] mnt]# touch test.tst

[[email protected] mnt]# ll

total 8

drwxr-xr-x. 15 nfsnobody nfsnobody 4096 Jul 17 21:18 apache

-rw-r--r--.  1 nfsnobody nfsnobody    0 Jul 24  2015 ceshi.txt

drwxr-xr-x. 11 nfsnobody nfsnobody 4096 Jul 15 17:58 nginx

-rw-r--r--.  1 nfsnobody nfsnobody    0 Jul 24  2015 test.tst

[[email protected] mnt]#

###NFS 进程

[email protected] ~]# ^C

[[email protected] ~]# ps -ef | grep   -E "nfs|rpc"

rpc      16004     1  0 17:07 ?        00:00:00 rpcbind     rpc服务

root     16106     2  0 17:18 ?        00:00:00 [rpciod/0]

root     16114     1  0 17:18 ?        00:00:00 rpc.mountd  权限管理进程 ,主要管理nfs文件系统

root     16120     2  0 17:18 ?        00:00:00 [nfsd4]

root     16121     2  0 17:18 ?        00:00:00 [nfsd4_callbacks]

root     16122     2  0 17:18 ?        00:00:00 [nfsd]

root     16123     2  0 17:18 ?        00:00:00 [nfsd]

root     16124     2  0 17:18 ?        00:00:00 [nfsd]

root     16125     2  0 17:18 ?        00:00:00 [nfsd]

root     16126     2  0 17:18 ?        00:00:00 [nfsd]

root     16127     2  0 17:18 ?        00:00:00 [nfsd]

root     16128     2  0 17:18 ?        00:00:00 [nfsd]

root     16129     2  0 17:18 ?        00:00:00 [nfsd]   nfs---主进程,管理nfs客户端是否可以登录

root     16152     1  0 17:18 ?        00:00:00 rpc.idmapd

root     16354 16324  0 18:58 pts/0    00:00:00 grep -E nfs|rpc

[[email protected] ~]#

[[email protected] ~]# /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] ~]#

nfs 配置文件

/etc/exports  以行为单位

exportfs -rv  === /etc/init.d/nfs  reload

/var/lib/nfs/etab  nfs配置文件的完整参数设定的文件

/application 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)

MFS  GFS 分布式文件系统

nfs 文件格式

/application 192.168.0.0/24(rw,sync)

/application   要共享的目录  必须存在

192.168.0.0/24    共享目录客户端运行访问的ip或者ip范围   也可以使用域名

rw

async 异步同步  ,数据先存放到内存,等磁盘有空再存入硬盘(使用时候根据情况判断--电商秒杀)

sync  同步 客户端接受服务器的数据后,才算完成一次,实时同步。

ro    只读

重要参数

all_squash :不管访问NFS server共享目录的用户身份如何,它的权限将

被压缩成匿名用户,同时它的UID,GID通常会变成nobody 或nfsnobody账号身份账号

生产环境配置NFS生产重要技巧

1,确保所有服务器对NFS共享目录具备相同的权限

a,加all_squash参数 把所有客户端都压缩成匿名用户

b,就是anonuid,anongid指定的UID和GID的用户

2,所有的客户端和服务端都需要一个相同的UID和GID的用户,即nfsnobody(UID必须相同)

工作场景案例:

实现多台客户端同时挂载一台nfs server时,无论从哪一个客户端写入数据,其他客户端同样也可以读写

,即让所有nfs客户端写入到nfs server 的文件或者目录在nfs server上的用户和组都是同一个名称oldboy

1,在所有客户端和服务端创建一个共享nfs用户 oldboy   UID 必须一样

useradd oldboy -u 555

id oldboy ,

2,修改配置文件

vim /etc/exports

[[email protected] application]# cat /etc/exports

#share directory

/application 192.168.0.0/24(rw,sync,all_squash,anonuid=555,anongid=555)

[[email protected] application]#

/etc/init.d/nfs  reload

chown -R oldboy.oldboy /application

3.客户端挂载

mount -t nfs 192.168.0.221:/application /mnt

[[email protected] media]# df -h

Filesystem                    Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root   36G  1.2G   33G   4% /

tmpfs                         242M     0  242M   0% /dev/shm

/dev/sda1                     485M   32M  428M   7% /boot

192.168.0.221:/application/    36G  4.8G   29G  15% /media

[[email protected] media]#

4,客户端测试权限

touch 111.oldboy.txt

-rw-r--r--.  1 oldboy oldboy    0 Jul 24  2015 oldboy.txt

#########对于客户端要加入开机启动

/etc/rc.local

/bin/mount -t nfs   192.168.0.221:/application/  /mnt/

开机启动加入

/etc/rc.local 和  /etc/fstab

1,加入fstab缺点

fstab 优先于网络启动,NFS服务器端处于不可用状态,那么客户机可能造成开机无法启动 defaults 后两项必须是0 0 ,否则导致无法启动

2,rc.loal

偶尔开机挂载不上,需要手动挂载

所以,不要把网络文件系统放在fstab里,本地的可以,但是要设置 0 0

所以,分别重新测试,放入rc.local  fstab中,最好做监控

针对客户端挂载nfs 共享目录时候,优化的参数有以下(mount):

1,*******async 锁涉及到文件系统i/O的操作都是异步处理,即不会同步写到磁盘,此参数会提高性能,但是会降低数据安全

一般生产环境,不推荐使用,除非性能要求高,数据可靠性不高的场合

2,atime 在每一次数据访问是,同步更新每次的访问的inode的时间,默认是atime,在高并发的情况下,建议加上noatime来取消默认这个选项,以达到IO,优化目的3,auto 能够被自动挂载

4,******defaults 这是缺省值,rw,suid,dev,exec,auto,nouser,async

5,exec  运行可以执行二进制文件,取消这个参数会提升系统安全性

6,nodiratime 不更新文件爱你系统上的directory inode访问时间,高并发时候建议使用此选型

7,noauto  不自动挂载

8,noexec  即使设置了noexec shell php 程序还是可以执行

9.nosuid 禁止已给普通用户挂载文件系统,

10.rsize wsize  如果内存足够大,可以将rsize wsize 设置大点

查看客户端挂载

[[email protected] ~]# grep application /proc/mounts

192.168.0.221:/application/ /mnt nfs4 rw,relatime,vers=4,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.222,minorversion=0,local_lock=none,addr=192.168.0.221 0 0

df -h

mount

是否选择在mount时候优化参数,我们最好是测试,拿数据说话。 不要我以为,自我。

wsize

rsize   可以测试文件系统的读写速度

w,rsize=1024

mount -t nfs nosuid,noexec,rsize=1024,wsize=1024 ,rw 192.168.0.221:/application /mnt

time dd if /dev/zero of=/mnt/testfile bs=9k count=2000

11.3s  16.3M/S

mount -t nfs nosuid,noexec,rsize=65535,wsize=65535 ,rw 192.168.0.221:/application /mnt

w,rsize=65535

time dd if /dev/zero of=/mnt/testiii bs=9k count=2000

1.3s  137M/S

mount -t nfs nosuid,noexec,noatime,nodiratime,rw 192.168.0.221:/application /mnt  效率比较好,节省磁盘读写次数

NFS官方建议

内核优化:

cat >>/etc/sysctl.conf<<EOF

echo 262144 /proc/sys/net/core/rmem_default

echo 262144 /proc/sys/net/core/rem_max

EOF

mount -lf  /mnt  强行卸载

#######NFS优化####################

1,sas ssd磁盘,买多块,raid10 (先做两个raid1,在做一个 raid0),网卡好

2,服务器端:rw,async,all_squash,anonuid,anongid

3, 客户端:   rsize,wsize,natime,nodirtime,(前四个建议加进去)noexec

4,内核的优化

proc/sys/net/core/rmem_default=8388608

/proc/sys/net/core/wmem_default=83388608

net.core.mem_max=16777216

net.core.wmem_max=16777216

NFS 服务器端的防火墙控制

一般NFS在内网环境,一般是关闭iptables

(1)仅允许ip段访问

iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT

(2)允许IP加端口访问

IPTABLES -A INPUT -i eth1 -p tcp -s 10.1.1.0/24  --dport 111 -j ACCEPT

IPTABLES -A INPUT -i eth1 -p udp -s 10.1.1.0/24  --dport 111 -j ACCEPT

##NFS的信息总结

[[email protected] nfs]# pwd

/var/lib/nfs

[[email protected] nfs]# cat etab

/application 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=555,anongid=555)

[[email protected] nfs]#

1,/etc/exports,  /etc/fstab, /var/lib/nfs/etab, /proc/mount

#NFS 优点

1,简单,容易上手

2,部署简单,维护简单

3,数据可靠,耐用

缺点:

1,单点故障,如果nfs server宕机,所有客户端无法连接

2,高并发场合,NFS效率低(2千万的PV/日网站不是瓶颈,除非网站架构性能太差)

3,客户端认证时候基于ip和主机名,权限是根绝ID识别,安全性一般,(放置于内网比较好)

4,NFS数据传输是明文,对数据完整性不做完整

5,多台机器挂载NFS时候,连接管理麻烦,尤其服务器端出问题,所有NFS 客户端都是挂掉状态

解决高并发访问NFS的解决思路

1,分服务 1-2目录分到一个服务器,一次类推

2,读时候弃用NFS(如果web服务器少,可以把nfs内容实时同步到web服务器,这样读的时候就可以访问本地了),写的时候还是写入nfs,此处web服务器没什么压力,瓶颈是上传到的时候同步会延时。

时间: 2024-10-20 23:52:02

NFS详细介绍与企业应用场景结合案例的相关文章

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

常见的七款API聚合平台对比和详细介绍

我们都知道一句话"巧妇难为无米之炊",数据源就是数据产生价值中的那些大米.那大数据时代企业需要哪些数据呢?根据我个人理解我觉得可以大致分为以下几类: 1.(内部)企业自身业务生产经营环节产生的内部数据[包括销售.客服.仓储.财务等] 2.(运营)可以理解为企业发展过程中掌握在第三方手中的数据,如企业的广告供应商以及一些传播与媒体数据[新媒体.H5.app等] 3.(外部)包括传统调研数据和机器数据[搜索.电商.社交等].而对于外部数据的获取上,企业往往会觉得有难度,这时候就可以借助AP

Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

适配器模式,将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 代码实现: //Adapter.h #include "stdafx.h" #include <iostream> class Adaptee

fstab文件详细介绍及修复fstab实战安例(九)

fstab文件详细介绍及修复fstab实战安例 一:fstab文件详细介绍 fstab-static information about the filesystems fstab这个文件中包含了系统中各种各样的文件系统的描述信息.正确维护和创建这个文件是一名系统管理员的职责所在.Fstab文件可以被特殊的工具修改,(如fstab-sync(8))fstab中每一个文件系统描述占一行,每一行中的每个列之间由tab键或空格分隔.文件中以#开头的行是注释信息.Fstab文件中的记录的排序十分重要.因

Storm Trident 详细介绍

一.概要 1.1 Storm(简介) Storm是一个实时的可靠地分布式流计算框架. 具体就不多说了,举个例子,它的一个典型的大数据实时计算应用场景:从Kafka消息队列读取消息(可以是logs,clicks,sensor data):通过Storm对消息进行计算聚合等预处理:把处理结果持久化到NoSQL数据库或者HDFS做进一步深入分析. 1.2 Trident(简介) Trident是对Storm的更高一层的抽象,除了提供一套简单易用的流数据处理API之外,它以batch(一组tuples)

storm详细介绍

Storm应用场景 Twitter列举了Storm的三大类应用: 1. 信息流处理{Stream processing}Storm可用来实时处理新数据和更新数据库,兼具容错性和可扩展性. 2. 连续计算{Continuous computation}Storm可进行连续查询并把结果即时反馈给客户端.比如把Twitter上的热门话题发送到浏览器中. 3. 分布式远程程序调用{Distributed RPC} Storm可用来并行处理密集查询.Storm的拓扑结构是一个等待调用信息的分布函数,当它收

struts详细介绍

Struts2 1. 目录 1.目录 2.MVC 3.STRUTS2解析 4.标签 5.OGNL 6.国际化 7.类型转换 8.校验 9. 拦截器 10.上传与下载 11.STRUTS2与对JSON的支持 2. MVC 把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller).MVC模式最早由Trygve Reenskaug在1978年提出,在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式.MVC模式的目的是实现一种动态的程式设计,使后

企业生产场景下如何对Linux硬盘分区

生产环境: 硬件:华硕PC机,4 Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz,内存4G: 任务:生产场景下如何对Linux硬盘分区,安装CentOS6.9版本,搭建公网环境: 技巧:U盘安装.生产场景分区 1.背景   添加一台新电脑,目前该主机是裸机,没有安装任何操作系统.在安装操作系统之前,先要分区,在这里作者是按企业生产场景环境来分区的,对硬盘分区之前,我们先梳理磁盘分区的相关知识. 2.磁盘分区知识:    为什么硬盘要分区,因为我们要告诉操作系统,从

哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍

哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍 机械键盘 12-08 (4)青轴 最具特点的就是青轴,青轴一般是打字员的梦想,很少用于游戏,不过是本人的最爱,特点是只有当声音响起的时候按键才被触发,因此打字的时候噼里啪啦,无论是指尖还是心理上都得到了极大满足. 但是其"机动性"打字和双击时效果并不是很好,因为触底比"触发"要高,这款特别适合输入文字,但是要注意噪音很大,但这也是我喜欢MX青轴的原因之一. (5)白轴 最后说一下白轴,目前白轴基本已经停产了