NFS Network File System
用途:作为服务端向其他服务器提供共享目录.
客户端可以通过网络,将共享目录挂载到本地文件系统上.
挂载方法 mount -t nfs 192.168.1.110:/data/share /mnt
挂载后查看本地基本挂载信息 df -h
这种网络文件系统常用于中小企业(3000WPV),而大型企业可能会用到Moosefs(mfs),glusterfs,FastDFS.
而这些文件系统的主要功能为:存储静态资源文件,如图片,附件,头像
NFS服务有很多子服务,有固定端口的2049 nfs,也有很多非固定端口的服务,这些注册信息被rpcbind
服务管理.所以,在运行NFS服务之前,应先开启rpcbind
服务供其注册,rpcbind
主服务端口为111!
为什么企业集群架构需要共享存储?
在Web服务器集群中,如果没有共享存储,某一台Web服务器上并没有存储其他Web服务器上的静态资源时,
会出现资源访问不到的情况,例如,用户上传到Web1一张图片,而下次请求Web2访问图片时,Web2上并没
有刚刚上传的资源,所以访问不到资源.
解决方案:
1.Web服务器之间时时同步(浪费带宽,空间,资源)
2.共享存储(最优选择)
NFS/rpcbind原理图
安装
规划:
角色 | 名称 | IP |
---|---|---|
服务端 | NFS_Server | * . * . * .1 |
客户端 | LAMP_Server | * . * . * .2 |
客户端 | LNMP_Server | * . * . * .3 |
批量查看环境:
cat /etc/redhat-release
//系统版本
uname -r
//内核版本
uname -m
//操作系统位数
软件列表:
nfs-utils:
NFS主程序
rpcbind
:RPC主程序
安装方法:
yum install -y nfs-utils rpcbind
主客户端均要安装,按理来说客户端无需装nfs-utils,但是客户端会用到showmount命令.
启动:
/etc/init.d/rpcbind start
//启动rpcbind
/etc/init.d/rpcbind status
//查看rpcbind状态
lsof -i :111
//查看端口
netstat -lntup|grep rpcbind
//查看端口
rpcinfo -p localhost
//查看rpc注册端口信息
/etc/init.d/nfs start
//启动nfs并向rpc注册
/etc/init.d/rpcbind status
//查看rpcbind状态
netstat -lnupt | grep 2049
//查看nfs端口信息
将/etc/init.d/rpcbind start
和/etc/init.d/nfs start
写入/etc/rc.loacl
做一个自启动
NFS服务进程说明
ps -ef | egrep "rpc|nfs"
rpc 6668 1 0 19:58 ? 00:00:00 rpcbind
root 6742 2 0 20:00 ? 00:00:00 [rpciod/0]
root 6751 1 0 20:00 ? 00:00:00 rpc.rquotad //磁盘配额进程
root 6756 1 0 20:00 ? 00:00:00 rpc.mountd //权限管理验证
root 6763 2 0 20:00 ? 00:00:00 [nfsd4]
root 6764 2 0 20:00 ? 00:00:00 [nfsd4_callbacks]
root 6765 2 0 20:00 ? 00:00:00 [nfsd]
root 6766 2 0 20:00 ? 00:00:00 [nfsd]
root 6767 2 0 20:00 ? 00:00:00 [nfsd]
root 6768 2 0 20:00 ? 00:00:00 [nfsd]
root 6769 2 0 20:00 ? 00:00:00 [nfsd] //nfs主进程,id身份判定
root 6770 2 0 20:00 ? 00:00:00 [nfsd]
root 6771 2 0 20:00 ? 00:00:00 [nfsd]
root 6772 2 0 20:00 ? 00:00:00 [nfsd]
root 6803 1 0 20:00 ? 00:00:00 rpc.idmapd
NFS配置文件
/etc/exports
格式:
共享目录 + 主机名/地址/通配符 + (参数)
# 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)
共享参数
rw 可读写
ro 只读
sync 同步写入磁盘(性能不好,但不丢数据)
async 异步写入(性能好,断电会丢数据)
no_root_squash 客户端为root,不会压缩root为nfsnobody,权限太大,慎用
root_squash 客户端为root时会压缩root为nfsnobody
all_squash 客户端为任何用户都会压缩为nfsnodoy用户
anonuid=UID 压缩为UID的用户
anongid=GID 压缩为GID的用户
exportfs -rv
/etc/init.d/nfs reload
//两个平缓加载重启NFS的命令
showmount -e IPADDRESS
//查看某主机的共享目录
mount -t nfs localhost:/data
//挂载共享目录
mount
cat /proc/mounts
//查看挂载信息
cat /var/lib/nfs/etab
//显示nfs共享参数
df -h
//查看挂载资源
默认情况下,客户端访问NFS文件系统时,用户被压缩成默认uid65534 nfsnobody的用户.
所以,需要将共享目录的属主数组改为nfsnobody.
常见故障排查
1.确认服务是否启动
2.本地showmount一下,有可能防火墙挡住了
3.ping链路
4.服务启动顺序 rpcbind-->nfs
5.共享目录是否创建
6.如果文件无法创建,查看下nfs共享权限以及服务端本地权限.
7.注意.服务端挂掉,客户端挂载会hang住.
客户端挂载参数
fg/bg(默认fg) 挂载时选择前台/后台(挂载请求会一直持续,后台不会影响前台操作)
soft/hard(默认hard) soft挂载不上不再尝试挂载,hard会持续尝试挂载
intr hard方式在配合intr时,超时可以将挂载程序中断
rsize/wsize 读写块大小,用于提升性能!
proto=tcp/udp 协议,可靠/不可靠
async 异步操作写入磁盘
sync 同步写入磁盘
ro 只读方式挂载
rw 读写方式挂载
auto 能否通过mount -a 自动挂载
default(rw,suid,dev,exec,auto,nouser,async) 默认挂载参数
exec/noexec 文件系统中的二进制程序能否执行(安全优化)
noatime 不更新inode,高并发最好选用这个参数
nodiratime 不更新dirinode,高并发使用
suid/nosuid 支持/不支持suid
remount 用于修复文件系统因fstab修改错误无法启动故障,具体案例见下文
救援模式下,mount -o rw,remount / ,然后修改fstab
建议:默认或以下挂载方式
mount -t nfs -o bg,hard,intr,rsize=131072,wsize=131072 IP_ADDR:/data
一个挂载案例
1. 重启系统看是否可以自动修复。
2. 使用fsck -y /dev/sda1 进行自动修复。(用”-y”选项来执行该命令对硬盘进行检查和修复)
添加参数:fsck -y -C -t ext3 /dev/sda1 (一般情况下修复完成后,所有文件移动到 lost+found目录,文件名会被改变)
(-C 显示进度条 -t 指定文件系统类型 -y 默认自动yes修复)
3. 如果fsck修复完成后,启动系统依然自读。
查看分区结构:
[root@localhost ~]# more /etc/fstab
[root@localhost ~]# more /proc/mounts
[root@localhost ~]# mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
查看ro挂载的分区,如果发现有ro,就重新mount
umount /dev/sda1
mount /dev/sda1 /boot
如果发现有提示“device is busy”,找到是什么进程使得他busy
fuser -m /boot 将会显示使用这个模块的pid
fuser -mk /boot 将会直接kill那个pid
然后重新mount即可。
4. 直接remount
[root@localhost ~]# mount -o rw,remount /dev/sda1
NFS优化
安全挂载:mount -t nfs -o nosuid,noexec,nodev,rw IP_ADDR:/data /mnt
性能挂载:mount -t nfs -o noatime,nodiratime IP_ADDR:/data /mnt
安全+性能:mount -t nfs -o nosuid,nodev,noexec,rw,noatime,nodiratime IP_ADDR:/data /mnt
针对NFS对内核进行优化
//调大套接字接受/发送缓冲区大小,来自官方
cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
NFS硬件选择
SAS/SSD磁盘多块,做raid0/10,网卡至少千兆,多块bond.
强制卸载卸载不掉的文件系统
umount -lf