NFS是Network File System的缩写,中文意思是网络文件系统html
它的主要功能是经过网络(通常是局域网)让不一样的主机系统之间能够共享文件或目录前端
NFS==网络共享文件系统linux
互联网中小型网站集群架构后端经常使用NFS进行数据共享web
若是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS vim
扩展:NFS网络文件系统很像Windows系统的网络共享,可是没法部署在windows系统上,NFS服务windows
只能应用在Linux系统上,FTP 、Samba服务均都支持Linux和window后端
实现web集群中服务器数据一致性安全
a. 实现数据信息的共享服务器
b. 实现数据信息的一致网络
NFS在网络文件共享服务做用总结:
1. 负载均衡设备会将访问流量,进行分流,但不便于文件和数据的互相访问;
2. 利用服务器间的数据同步可使用户之间数据互访,但同步管理操做过于复杂;
3. 利用NFS服务器能够统一管理数据,使用户之间能够顺利互访
硬件存储:IBM oracle(sun)EMC(去IOE)
软件存储:NFS mfs ftp samba
简单描述NFS工做原理:
1. 部署好NFS服务,在NFS服务端建立一个video共享目录
2. web服务器(NFS客户端)建立一个本地video目录,做为一个挂载点
3. web服务器经过mount命令实现网络挂载,将nfs服务器上video目录挂载到本地video目录挂载点上
4. web服务器(NFS客户端)上在video目录中,增长 删除 修改数据的操做,都等价于在NFS服务端
video 目录中的操做
根据上图能够简单理解RPC至关于中介服务:
默认NFS服务启动会产生多个进程,多个端口号信息,而且产生的多个端口号信息会在服务重启时,发生变化,所以不便于nfs客户端进行链接访问
在拥有rpc服务端以后,可让nfs客户端直接访问rpc服务,提供中介服务,便于nfs客户端进行链接访问
因每一个服务进程对应的端口号不一样,而且是随机的,全部对于客户端来说不知道该访问哪一个端口。
NFS服务端的每一个服务进程都会向RPC服务进程注册,客户端也只需访问RPC服务的111端口便可,由RPC服务来告诉客户端访问服务的端口号。
NFS服务工做流程图:
01. 启动rpc服务,创建中介服务
02. 启动nfs服务,开启进程信息(房源信息),向rpc服务进行注册
03. rpc服务接收到nfs服务进程信息(房源信息)
04. nfs客户端向rpc服务发出请求(访问共享目录)
05. rpc服务响应nfs客户端请求
06. nfs客户端与nfs服务端共享目录创建网络链接,实现数据网络存储
当访问程序经过NFS客户端向NFS服务器存取文件时,其请求数据流程大体以下:
1. 首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会经过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
2. NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)。
3. 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据。
4. NFS客户端把数据存取成功后,返回给前端访问程序,告知用户存取结果,做为网站用户,就完成了一次存取操做。
更多的NFS相关信息能够参考:
http://www.citi.umich.edu/projects/nfsv4/linux/
http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html
http://www.ibm.com/developerworks/cn/linux/l-network-filesystems/
http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install -y nfs-utils rpcbind
[root@nfs01 ~]# rpm -qa|grep -E "nfs-utils|rpcbind" [root@nfs01 ~]# yum install -y nfs-utils rpcbind [root@nfs01 ~]# rpm -qa|grep -E "nfs-utils|rpcbind" nfs-utils-lib-1.1.5-13.el6.x86_64 rpcbind-0.2.0-13.el6_9.1.x86_64 nfs-utils-1.2.3-75.el6_9.x86_64 |
3.1.2 第二个里程:编写nfs服务配置文件
NFS服务的默认配置文件/etc/exports是安装完软件就有的,而且默认是空的,须要用户自行配置。
vim /etc/exports
1. 定义共享目录 ---------> /data
2. 定于容许使用共享目录的主机或网段地址信息
3. 定义共享目录权限信息(注意:“24和(”之间没有空格)
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs01 ~]# vim /etc/exports # 01.定义共享目录 02.定于容许使用共享目录的主机或网段地址信息(03.定义共享目录权限信息) /data 172.16.1.0/24(rw,sync,all_squash) |
3.1.3 第三个里程:建立共享目录
mkdir /data
chown -R nfsnobody.nfsnobody /data/
[root@nfs01 ~]# mkdir /data [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/ [root@nfs01 ~]# ll /data/ -d drwxr-xr-x 2 nfsnobody nfsnobody 4096 Jan 24 12:11 /data/ |
nfsnobody是默认用户
/etc/init.d/rpcbind start
/etc/init.d/nfs start
[root@nfs01 wuhuang]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [root@nfs01 wuhuang]# /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ] |
注意:要先启动rpcbind ,后启动 nfs
rpcinfo -p 172.16.1.31 ---检查rpc服务中是否有注册的进程服务和对应端口号信息
showmount -e 172.16.1.31 ---检查是否有能够共享的目录
[root@nfs01 wuhuang]# rpcinfo -p 172.16.1.31 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 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 62058 mountd 100005 1 tcp 53154 mountd 100005 2 udp 22521 mountd 100005 2 tcp 30878 mountd 100005 3 udp 56674 mountd 100005 3 tcp 12281 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 9976 nlockmgr 100021 3 udp 9976 nlockmgr 100021 4 udp 9976 nlockmgr 100021 1 tcp 24261 nlockmgr 100021 3 tcp 24261 nlockmgr 100021 4 tcp 24261 nlockmgr [root@nfs01 wuhuang]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 |
3.2 NFS客户端部署流程
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install nfs-utils rpcbind -y
[root@backup ~]# rpm -qa|grep -E "nfs-utils|rpcbind" nfs-utils-lib-1.1.5-13.el6.x86_64 rpcbind-0.2.0-13.el6_9.1.x86_64 nfs-utils-1.2.3-75.el6_9.x86_64 |
3.2.2 第二个里程碑:检查局域网中是否存在共享存储服务(目录)
rpcinfo -p 172.16.1.31 ---rpcinfo命令须要安装rpcbind软件才能拥有
showmount -e 172.16.1.31
[root@backup ~]# rpm -qf `which rpcinfo` rpcbind-0.2.0-13.el6_9.1.x86_64 [root@backup ~]# rpm -qf `which showmount` nfs-utils-1.2.3-75.el6_9.x86_64 [root@backup ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 |
3.2.3 第三个里程碑:实现共享目录应用(网络挂载应用)
当客户端没有安装nfs相关软件
挂载失败:没有安装nfs相关软件
[root@wuhuang ~]# mount -t nfs 172.16.1.31:/data/ /mnt/ mount: wrong fs type, bad option, bad superblock on 172.16.1.31:/data/, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so |
当客户端安装了nfs相关软件
挂载成功:安装好nfs先关软件
[root@backup ~]# mount -t nfs 172.16.1.31:/data/ /mnt/ [root@backup ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.5G 17G 9% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot 172.16.1.31:/data/ 20G 1.5G 17G 9% /mnt |
第4章 NFS服务常见进程详解
[root@nfs01 ~]# ps -ef |egrep "rpc|nfs" rpc 1833 1 0 10:41 ? 00:00:00 rpcbind root 1869 2 0 10:41 ? 00:00:00 [rpciod/0] root 1878 1 0 10:41 ? 00:00:00 rpc.rquotad < -磁盘配额进程(remote quote server) root 1883 1 0 10:41 ? 00:00:00 rpc.mountd < - 权限管理验证等(NFS mount daemon) root 1890 2 0 10:41 ? 00:00:00 [nfsd4] root 1891 2 0 10:41 ? 00:00:00 [nfsd4_callbacks] root 1892 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主进程 root 1893 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主进程,管理登陆, ID身份判别 root 1894 2 0 10:41 ? 00:00:00 [nfsd] root 1895 2 0 10:41 ? 00:00:00 [nfsd] root 1896 2 0 10:41 ? 00:00:00 [nfsd] root 1897 2 0 10:41 ? 00:00:00 [nfsd] root 1898 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主进程 root 1899 2 0 10:41 ? 00:00:00 [nfsd] root 1930 1 0 10:41 ? 00:00:00 rpc.idmapd < - name mapping daemon 用户压缩/用户映射(记录) root 2509 1231 0 17:42 pts/0 00:00:00 egrep rpc|nfs |
服务或进程名 |
用途说明 |
nfsd(rpc.nfsd) |
rpc.nfsd的主要功能是管理NFS客户端是否可以登入NFS服务器端主机,其中还包括登入者的ID判别等 |
mountd (rpc mountd) |
注意:这个/etc/exports文件也是咱们用来管理NFS共享目录的使用权限与安全设置的地方,特别强调,NFS自己设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关
|
rpc.lockd (非必要) |
用来锁定文件,用于多客户端同时写入 |
rpc.statd(非必要) |
检查文件的一致性,与rpc.lockd有关。c 、d 两个服务须要客户端,服务器端同时开启才能够;rpc.statd监听来自其余主机重启的通知,而且管理当本地系统重启时主机列表 |
rpc.idmapd |
名字映射后台进程 |
重点掌握:
rpc.statd主要做用:检查数据存储的一致性
rpc.rquotad主要做用:控制磁盘配额
rpc.mountd主要做用:核对/etc/exports配置文件中的权限,和NFS服务器端本地文件系统权限
rpc.idpamd主要做用:实现用户压缩/映射(经用户压缩后,身份转换为nfsnobody)
/etc/exports文件配置格式为:
NFS共享目录 NFS客户端地址1(参数1,参数2,...) 客户端地址2(参数1,参数2,...)
或
NFS 共享目录 NFS客户端地址(参数1,参数2,...)
查看exports语法文件格式帮助的方法为:
执行man exports 命令,而后切换到文件结尾,能够快速查看以下样例格式:
EXAMPLE # sample /etc/exports file / master(rw) trusty(rw,no_root_squash) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub *(ro,insecure,all_squash) /srv/www -sync,rw server @trusted @external(ro) /foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw) /build buildhost[0-9].local.domain(rw) |
为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,若是须要读写共享,必定要让本地目录能够被NFS客户端的用户(nfsnobody)读写。
为NFS服务器端受权的可访问共享目录的NFS客户端地址,能够为单独的IP地址或主机名、域名等,也能够为整个网段地址。还能够用“*”来匹配全部客户端服务器,这里所谓的客户端通常来讲是前端的业务的业务服务器,例如:web服务。
对受权的NFS客户端的访问权限设置。
nfs权限(共享目录) nfs配置的/etc/exports /data 172.16.1.0/24(rw)
本地文件系统权限, 挂载目录的权限rwxr-xr-x root root /data
参数名称 |
参数用途 |
rw < -重点掌握 |
read-write,表示可读可写模式---设置共享目录读写模式 |
ro |
read-only,表示只读权限---设置共享目录只读模式 |
sync < -重点掌握 |
请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。 优势:数据安全不会丢;缺点:性能比不启动该参数要差 ---采用同步方式存储数据,存储数据到硬盘中 |
async < -重点掌握 |
写入时数据会先写到内存缓冲区,直到硬盘有空挡才会写人磁盘,这样能够提高写入效率!风险为若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS,AB(双路电源)不间断电源)! 停电---ups---发电机 ---采用异步方式存储数据,存储数据到内存中 |
no_root_squash |
保持root用户不进行压缩 访问NFS Server共享目录的用户若是是root的话,它对该共享目录具备root权限,这个配置本来是为无盘客户端准备的,用户应避免使用。 |
root_squash |
若是访问NFS Server共享目录的用户是root,则它的权限将被压缩成匿名用户,同时,它的UID和GID一般会变为nfsnobody帐号身份 |
all_squash < -重点掌握 |
无论访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody帐号身份。在早期多个NFS客户端同时读写NFS Server数据时,这个参数颇有用 在生产中配置NFS的重要技巧 1. 确保全部客户端服务器对NFS共享目录具有相同的用户访问权限。 a. all_squash把全部客户端都压缩成固定的匿名用户(UID相同) b. 就是anonuid,anongid指定的UID和GID的用户 2. 全部的客户端和服务器端都须要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同) |
总结:
1. rw参数:可读写
2. ro参数:只读
/data 172.16.1.0(ro,sync,all_squash) :ro权限给开发人员用于读取配置文件,而不能修改
3. sync参数的做用:同步,保证数据的可靠性
4. async参数:ups AB双路电源
1. no_all_squash参数:全部用户都不映射(什么身份过来就是什么身份)
2. all_squash参数:全部用户都映射(成指定nfsnobody)
3. root_squash参数:root用户映射(成指定nfsnobody)
4. no _root_squash参数:不对root用户映射(进来NFS服务器后是root身份,权限 很大)
注意:
/etc/init.d/nfs reload ---平滑重启(只是从新加载了配置文件,已有的链接不会断开)
/etc/init.d/nfs restart ---重启(从新将服务关闭再开启,已有的链接会断开)
1. /data/共享目录权限固定为www用户管理
2. 在nfs配置文件中,设置all_squash所有用户都映射参数
3. 让nfs客户端能够向共享目录存储数据
chown -R www.www /data/
[root@nfs01 ~]# chown -R www.www /data/ [root@nfs01 ~]# ll -d /data/ drwxr-xr-x 2 www www 4096 Jan 25 21:04 /data/ |
5.5.2 第二个里程:编写nfs配置文件
1. 查看www用户的UID,GID信息
id www
[root@nfs01 ~]# useradd -s /sbin/nologin -M www -u 502 [root@nfs01 ~]# id www uid=502(www) gid=502(www) groups=502(www) |
2. 编辑配置文件:vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=502,anongid=502) |
3. 平滑重启:
/etc/init.d/nfs reload |
anonuid和anongid参数做用说明:
将客户端全部用户,映射为指定用户,而再也不是默认nfsnobody用户了
ps:两点注意
01. 客户端要有nfs配置文件anonuid或者anongid指定用户,此处是www
02. 客户端和服务端建立默认映射用户,uid和gid信息须要保持一致,即客户端的www用户的UID和
GID也要是502
(1) 先卸载 umount /mnt
(2) 再挂载 mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt [root@backup ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.5G 17G 9% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot 172.16.1.31:/data 20G 1.5G 17G 9% /mnt |
5.5.4 第四个里程:进行数据存储测试
建立测试文件查看属主信息是否为www
[root@backup mnt]# touch /mnt/wuhuang.txt [root@backup mnt]# ll /mnt/wuhuang.txt -rw-r--r-- 1 www www 0 Jan 25 21:04 /mnt/wuhuang.txt 服务端 [root@nfs01 ~]# ll /data/wuhuang.txt -rw-r--r-- 1 www www 0 Jan 25 21:04 /data/wuhuang.txt |