博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NFS详细介绍与企业应用场景结合案例
阅读量:6247 次
发布时间:2019-06-22

本文共 11317 字,大约阅读时间需要 37 分钟。

  一、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服务

一、查看系统环境信息

1
2
3
4
5
6
[root@localhost ~]
# cat /etc/redhat-release 
CentOS release 6.5 (Final)
[root@localhost ~]
# uname -r
2.6.32-431.el6.x86_64
[root@localhost ~]
# uname -m
x86_64

二、查看nfs软件包

1
2
3
4
5
6
[root@localhost ~]
# rpm -qa rpcbind
rpcbind-0.2.0-11.el6.x86_64
[root@localhost ~]
# rpm -qa  nfs-utils
nfs-utils-1.2.3-54.el6.x86_64
如果没有,执行安装即可
yum 
install 
nfs-utils  rpcbind -y

三、 启动

1
2
3
4
5
6
7
8
9
10
11
12
1,先启动rpcbind
[root@localhost ~]
# /etc/init.d/rpcbind start
Starting rpcbind:      
[root@localhost ~]
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@localhost ~]
# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[root@localhost ~]
# 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
[root@localhost ~]
# ^C

加入开机启动

1
2
3
  
chkconfig nfs   on
chkconfig rpcbind  on

3,客户端配置

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]
# cat /etc/redhat-release 
CentOS release 6.5 (Final)
[root@localhost ~]
# uname -r
2.6.32-431.el6.x86_64
[root@localhost ~]
# uname -m
x86_64
yum 
install 
rpcbind -y
root@localhost ~]
# /etc/init.d/rpcbind start
Starting rpcbind:  
chkconfig rpcbind  on

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@localhost ~]
# vim /etc/exports
/application 
192.168.0.0
/24
(rw,
sync
)  
  
[root@localhost ~]
# /etc/init.d/nfs reload   平滑重启
[root@localhost ~]
# cat /etc/exports 
#share directory
/application 
192.168.0.0
/24
(rw,
sync
[root@localhost ~]
# showmount -e localhost
Export list 
for 
localhost:
/application 
192.168.0.0
/24
客户端检查是否可挂载
[root@localhost ~]
# showmount -e  192.168.0.221
Export list 
for 
192.168.0.221:
/application 
192.168.0.0
/24
客户端开始挂载
[root@localhost ~]
# mount -t nfs 192.168.0.221:/application /mnt
[root@localhost ~]
# 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
[root@localhost ~]
# ^C
 
[root@localhost ~]
# cd /mnt/
[root@localhost mnt]
# ls
apache  nginx
[root@localhost mnt]
# touch test.txt 
touch
: cannot 
touch 
`
test
.txt': Permission denied  服务器的目录权限
[root@localhost mnt]
# ^C
[root@localhost application]
# ll -d /application/
drwxr-xr-x. 4 root root 4096 Jul 24 17:56 
/application/  
此时其他用户没有写权限

服务器端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@localhost ~]
# cat /var/lib/nfs/etab 
/application192
.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 
[root@localhost ~]
# cat /etc/passwd | grep 65534
nfsnobody:x:65534:65534:Anonymous NFS User:
/var/lib/nfs
:
/sbin/nologin
此时nfs的默认用户是 nfsnobody
root@localhost ~]
# chown -R nfsnobody:nfsnobody /application
  
此时客户端应该有权限写入数据
[root@localhost 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
[root@localhost mnt]
# touch test.tst
[root@localhost 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
[root@localhost mnt]
#

###NFS 进程

o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
t@localhost ~]
# ^C
[root@localhost ~]
# 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
[root@localhost ~]
 
[root@localhost ~]
# /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  ]
[root@localhost ~]
#

nfs 配置文件

1
2
3
4
/etc/exports  
以行为单位
exportfs -rv  === 
/etc/init
.d
/nfs  
reload
/var/lib/nfs/etab  
nfs配置文件的完整参数设定的文件
/application192
.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    只读

重要参数 

root_squash 对于访问NFS server共享目录的用户如果是root的话,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nobody或者nfsnobody

all_squash   不管访问NFS server共享目录的用户身份如何,它的权限将被压缩成匿名用户,,同时它的UID和GID通常会变成nobody或者nfsnobody。在多个NFS客户端读写NFS 

SERVER 数据时候,这个参数很有用

生产环境配置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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1,在所有客户端和服务端创建一个共享nfs用户 oldboy   UID 必须一样  
 
useradd 
oldboy -u 555 
 
id 
oldboy ,
2,修改配置文件
vim 
/etc/exports
[root@localhost application]
# cat /etc/exports 
#share directory
/application 
192.168.0.0
/24
(rw,
sync
,all_squash,anonuid=555,anongid=555) 
[root@localhost application]
/etc/init
.d
/nfs  
reload
chown 
-R oldboy.oldboy 
/application
3.客户端挂载
mount 
-t nfs 192.168.0.221:
/application 
/mnt
[root@localhost 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
[root@localhost 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 设置大点

查看客户端挂载

[root@localhost ~]# 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 noatime,nodiratime 192.168.0.221:/application /mnt  效率比较好,节省磁盘读写次数,一般规模的站点够用

 NFS官方建议

内核优化:

1
2
3
4
5
6
cat 
>>
/etc/sysctl
.conf<<EOF
echo 
262144 
/proc/sys/net/core/rmem_default
echo 
262144 
/proc/sys/net/core/rem_max
EOF
如果nfs server 出现问题,客户端无法卸载,咋使用以下命令强制卸载
umount 
-lf  
/mnt  
强行卸载

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1,sas ssd磁盘,买多块,raid10 (先做两个raid1,在做一个 raid0),网卡好
2,服务器端:rw,async,all_squash,root_squash
3, 客户端:   rsize,wsize,natime,nodirtime,(前四个建议加进去) 
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的信息总结

1
2
3
4
5
6
7
[root@localhost nfs]
# pwd
/var/lib/nfs
[root@localhost nfs]
# cat etab
/application192
.168.0.0
/24
(rw,
sync
,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=555,anongid=555)
[root@localhost 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服务器没什么压力,瓶颈是上传到的时候同步会延时。

      本文转自crazy_charles 51CTO博客,原文链接:http://blog.51cto.com/douya/1681449,如需转载请自行联系原作者

你可能感兴趣的文章
总结性博客作业
查看>>
Windows Phone 8初学者开发—第11部分:设置SounBoard应用程序
查看>>
欧拉图和哈密顿图
查看>>
解线性方程组
查看>>
Python:pandas之DataFrame常用操作
查看>>
Appium移动自动化测试之—基于java的iOS环境搭建
查看>>
NOIP前的刷题记录
查看>>
洛谷P1973 [NOI2011]Noi嘉年华(决策单调性)
查看>>
书签(Bookmarks)
查看>>
Java 信号量 Semaphore 介绍
查看>>
Ubuntu常用软件安装与使用
查看>>
Anroid开发中常用快捷键
查看>>
RecyclerView分隔线定制
查看>>
文本处理(CSS,JS)
查看>>
VBScript 函数
查看>>
shell编程学习
查看>>
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误解决
查看>>
apache源码安装
查看>>
使用TensorFlow遇到的若干问题
查看>>
poj2187
查看>>