一、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服务
一、查看系统环境信息
[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软件包
[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,先启动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
[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
加入开机启动
chkconfig nfs on chkconfig rpcbind on
3,客户端配置
[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的共享目录
[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/ 此时其他用户没有写权限
服务器端:
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
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 配置文件
/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,在所有客户端和服务端创建一个共享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官方建议
内核优化:
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,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的信息总结
[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服务器没什么压力,瓶颈是上传到的时候同步会延时。