第1章 NFS介绍
1.1 什么是NFS
NFS是Network File System的缩写,中文意思是网络文件系统
它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录
NFS==网络共享文件系统
互联网中小型网站集群架构后端常用NFS进行数据共享
如果大型网站,那么有可能还会用到更复杂的分布式文件系统,例如:Moosefs(mfs)、GlusterFS、FastDFS
扩展:NFS网络文件系统很像Windows系统的网络共享,但是无法部署在windows系统上,NFS服务
只能应用在Linux系统上,FTP 、Samba服务均都支持Linux和window
1.2 NFS在企业中的应用场景
1.2.1 为什么要用这个NFS软件?
实现web集群中服务器数据一致性
a. 实现数据信息的共享
b. 实现数据信息的一致
NFS在网络文件共享服务作用总结:
1. 负载均衡设备会将访问流量,进行分流,但不便于文件和数据的互相访问;
2. 利用服务器间的数据同步可以使用户之间数据互访,但同步管理操作过于复杂;
3. 利用NFS服务器可以统一管理数据,使用户之间可以顺利互访
1.3 共享存储服务分类
硬件存储:IBM oracle(sun)EMC(去IOE)
软件存储:NFS mfs ftp samba
第2章 NFS共享系统原理
2.1 NFS系统挂载结构
简单描述NFS工作原理:
1. 部署好NFS服务,在NFS服务端创建一个video共享目录
2. web服务器(NFS客户端)创建一个本地video目录,作为一个挂载点
3. web服务器通过mount命令实现网络挂载,将nfs服务器上video目录挂载到本地video目录挂载点上
4. web服务器(NFS客户端)上在video目录中,增加 删除 修改数据的操作,都等价于在NFS服务端
video 目录中的操作
2.2 什么是RPC(Remote Procedure Call)
2.2.1 简单理解
根据上图可以简单理解RPC相当于中介服务:
默认NFS服务启动会产生多个进程,多个端口号信息,并且产生的多个端口号信息会在服务重启时,发生变化,因此不便于nfs客户端进行连接访问
在拥有rpc服务端之后,可以让nfs客户端直接访问rpc服务,提供中介服务,便于nfs客户端进行连接访问
2.2.2 没有RPC服务的状况
因每个服务进程对应的端口号不同,并且是随机的,所有对于客户端来说不知道该访问哪个端口。
2.2.3 有RPC服务的情况
NFS服务端的每个服务进程都会向RPC服务进程注册,客户端也只需访问RPC服务的111端口即可,由RPC服务来告诉客户端访问服务的端口号。
2.2.4 标准工作流程图
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
第3章 NFS网络共享文件系统服务部署流程
3.1 NFS服务端部署流程
3.1.1 第一个里程:检查nfs服务相关软件是否安装
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install -y nfs-utils rpcbind
[[email protected] ~]# rpm -qa|grep -E "nfs-utils|rpcbind" [[email protected] ~]# yum install -y nfs-utils rpcbind [[email protected] ~]# 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)
[[email protected] ~]# 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/
[[email protected] ~]# mkdir /data [[email protected] ~]# chown -R nfsnobody.nfsnobody /data/ [[email protected] ~]# ll /data/ -d drwxr-xr-x 2 nfsnobody nfsnobody 4096 Jan 24 12:11 /data/ |
nfsnobody是默认用户
3.1.4 第四个里程:启动nfs相关服务
/etc/init.d/rpcbind start
/etc/init.d/nfs start
[[email protected] wuhuang]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [[email protected] 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
3.1.5 第五个里程:本地检查测试
rpcinfo -p 172.16.1.31 ---检查rpc服务中是否有注册的进程服务和对应端口号信息
showmount -e 172.16.1.31 ---检查是否有可以共享的目录
[[email protected] 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 [[email protected] wuhuang]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 |
3.2 NFS客户端部署流程
3.2.1 第一个里程碑:确认是否安装nfs服务相关软件
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install nfs-utils rpcbind -y
[[email protected] ~]# 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
[[email protected] ~]# rpm -qf `which rpcinfo` rpcbind-0.2.0-13.el6_9.1.x86_64 [[email protected] ~]# rpm -qf `which showmount` nfs-utils-1.2.3-75.el6_9.x86_64 [[email protected] ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 |
3.2.3 第三个里程碑:实现共享目录应用(网络挂载应用)
当客户端没有安装nfs相关软件
挂载失败:没有安装nfs相关软件
[[email protected] ~]# 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先关软件
[[email protected] ~]# mount -t nfs 172.16.1.31:/data/ /mnt/ [[email protected] ~]# 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服务常见进程详解
[[email protected] ~]# 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) |
rpc.monutd的主要功能则是管理NFS文件系统,当NFS客户端顺利通过rpc.nfsd登入NFS服务器端主机时,在使用NFS服务器提供数据之前,它会读NFS的配置文件/etc/esports来对比NFS客户端的权限,通过这一关之后,还要经过NFS服务器端本地文件系统使用权限(就是owner、group、other权限)等认证程序。如果都通过了,NFS客户端就可以取得使用NFS服务器端文件的权限。 注意:这个/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)
第5章 NFS服务配置文件格式信息说明
/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) |
5.1 NFS共享目录:
为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
5.2 NFS客户端地址
为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址。还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务的业务服务器,例如:web服务。
5.3 权限参数集
对授权的NFS客户端的访问权限设置。
nfs权限(共享目录) nfs配置的/etc/exports /data 172.16.1.0/24(rw)
本地文件系统权限, 挂载目录的权限rwxr-xr-x root root /data
5.3.1 重要配置文件参数说明——权限相关
参数名称 |
参数用途 |
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双路电源
5.3.2 用户压缩映射相关参数
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 ---重启(重新将服务关闭再开启,已有的连接会断开)
5.4 企业生产环境常见NFS案例
5.5 企业实战需求
1. /data/共享目录权限固定为www用户管理
2. 在nfs配置文件中,设置all_squash全部用户都映射参数
3. 让nfs客户端可以向共享目录存储数据
5.5.1 第一个里程:设置/data/权限信息
chown -R www.www /data/
[[email protected] ~]# chown -R www.www /data/ [[email protected] ~]# 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
[[email protected] ~]# useradd -s /sbin/nologin -M www -u 502 [[email protected] ~]# 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
5.5.3 第三个里程:重新挂载共享目录
(1) 先卸载 umount /mnt
(2) 再挂载 mount -t nfs 172.16.1.31:/data /mnt
[[email protected] ~]# mount -t nfs 172.16.1.31:/data /mnt [[email protected] ~]# 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
[[email protected] mnt]# touch /mnt/wuhuang.txt [[email protected] mnt]# ll /mnt/wuhuang.txt -rw-r--r-- 1 www www 0 Jan 25 21:04 /mnt/wuhuang.txt 服务端 [[email protected] ~]# ll /data/wuhuang.txt -rw-r--r-- 1 www www 0 Jan 25 21:04 /data/wuhuang.txt |
原文地址:http://blog.51cto.com/12805107/2065220