老师什么是NFS???

前沿

前几天一直被一个问题困扰着,服务器之间的文件要如何进行共享?一开始想的是通过程序将文件传输过去,但是这样可靠性太低,所以也就pass掉了。

各个方案都被否决之后,我甚至一度想修改架构模式,搭建一个分布式文件存储系统(例如FastDFS),但是采用这种模式时间上面不允许。幸亏柳暗花明又一村,在查阅资料的时候发现一个方案,那就是可以采用nfs进行文件共享,简单方便,不需要写任务代码,只要安装启动即可使用,下面我来给童鞋们详细介绍介绍,什么是nfs文件共享。

image

作者:漠效

https://blog.csdn.net/GX_1_11_real/article/details/82622391

远程挂载网络磁盘

实际上,这个操作与使用nfs共享一个文件的方法是相同的。思路是服务端将一块磁盘空间本地挂载到一个目录,然后通过网络使用nfs将这个目录进行共享,客户端最后将服务端共享的目录挂载到自己本地的一个目录,这样就使客户端拥有了一块网络磁盘。

优点是:服务端的同一块磁盘可以挂载到不同的客户端,实现文件的共享;可以扩充客户端的存储空间。
缺点是:依赖网络,当网络联通失败,客户端挂载的网络磁盘会无法使用。

做网络挂载,服务端与客户端网络要联通,最好是在同一局域网内,还要注意防火墙的设置。

NFS简介

  • Sun公司于1984年发布。
  • NFS 是一种可分散式的网络文件系统。
  • 可以通过网络使不同的机器、不同的操作系统,能够分享资料,使客户端能通过网络访问并分享文件到位于服务端的磁盘中。
  • NFS在文件传送或信息传送过程中依赖于RPC协议。RPC负责负责信息的传输。

服务端操作

【1】安装NFS程序

yum -y install nfs*

rpcbind,在centos6以前自带的yum源中为portmap。
使用yum安装nfs时会下载依赖,因此只要下载nfs即可,无需再下载rpcbind.

【2】查看是否安装了nfs与rpcbind
1
2
rpm -qa |grep nfs
rpm -qa |grep rpcbind

image

【3】创建共享的目录并共享

如要共享的目录已存在请跳过创建

<1>mkdir /mnt/nfs01

<2>vim /etc/exports
/mnt/nfs01 10.10.10.0/24 (rw,no_root_squash,no_all_squash,sync)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

配置


/mnt/nfs01 10.10.10.0/24 (rw,no_root_squash,no_all_squash,sync)

要共享的目录 要分享给的客户端 客户端对此共享目录的权限


----------


客户端指定


192.168.1.125 指定特定的的IP可以共享nfs目录

* 指定所有网段及ip都可以共享nfs目录

192.168.1.0/24 指定子网中的所有主机都可以共享nfs目录

2018fs.wxyonghe.com 指定域名的主机可以共享nfs目录


----------


权限


rw 可读可写

ro 只读(还与文件系统的rwx有关)

sync   数据同步写入到内存与硬盘中

async 数据先暂存于内存当中,不会直接写入硬盘

wdelay 当有写操作,就会检查是否有相关的写操作,并在一起执行(默认设置)

no_wdelay 当有写操作就立即执行,通常要与sync配合使用

root_squash 当客户端登陆NFS的身份为root用户时,将客户端的root用户及所属组都映射为匿名用户或用户组(默认设置)

no_root_squash   使客户端可以使用root身份及权限来操作共享的目录

all_squash 无论客户端登陆NFS的身份为何,都将映射为匿名用户

no_all_squash 无论客户端登陆NFS的身份为何,都将映射为root用户(默认设置)

anonuid 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户

anongid 将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户

secure 使客户端只能从小于1024的tcp/ip端口连接服务端(默认设置)

insecure 允许客户端从大于1024的tcp/ip端口连接服务端

subtree 当共享的目录是一个子目录,服务端会检查其父目录的权限(默认设置)

no_subtree 当共享的目录是一个子目录,服务端不检查其父目录的权限
【4】启动nfs,rpcbind,并设为开机自启
1
2
3
4
5
6
7
8
9
(centos7)
systemctl start nfs
systemctl start rpcbind
systemctl enable nfs
systemclt enable rpcbind

(centos6)
service nfs start
service rpcbind start
【5】查看是否共享成功
1
showmount -e localhost

image

可看到共享的目录及客户端,即为成功

客户端操作

【1】安装NFS程序
1
yum -y install nfs*
【2】启动nfs
1
2
3
4
5
6
7
8
9
10
11
(centos7)
systemctl start nfs
systemctl start rpcbind
systemctl enable nfs
systemctl enable rpcbind

(centos6)
service nfs start
service rpcbind start
chkconfig nfs on
chkconfig rpcbind on
【3】创建挂载目录
1
mkdir /data/nfsone
【4】查看是否共享成功
1
2
3
showmount -e nfs服务端IP

showmount -e 10.10.20.212

image

【5】网络挂载
1
2
mount -t nfs -o nolock 服务端IP:共享目录绝对路径 本地挂载目录
mount -t nfs -o nolock 10.10.20.212:/mnt/nfs01 /data/nfsone

centos7的nfs默认使用的是nfs4,所以mount -t 无需指定nfs4也可以

【6】查看是否成功
1
df -Th

image

【7】卸载网络磁盘

与卸载本地挂载相同

1
2
3
umount /data/nfsone

umount 10.10.20.212:/mnt/nfs01

注意事项

  1. 内网无需考虑防火墙,外网需要注意防火墙是否会阻止nfs
  2. 共享文件权限,最好设置为最高,防止因为权限问题而共享失败
  3. 共享的机器是否ping的通
  4. 为了安全考虑,最好设置为开启自启动

后记

如果文件共享是整个业务的核心,那我们就有必要知道nfs的极限指标是多少?跟哪些因素有关(服务器cpu、内存、硬盘???)。

如果是线上服务,那我们要如何监控nfs健康状态,如果达到峰值又要如何解决???

共享的原理其实也是一种数据传输,既然是数据传输就肯定有一定的失败率,那失败的时候我们要如何进行处理??

上述问题博主也正在思考,如果童鞋们有研究过的,欢迎一起探讨交流呀。下一期给大家介绍一下,docker容器怎么进行文件共享。

林老师带你学编程 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!