文章目录
NFS存储概述
什么是NFS
NFS 是 Network File System 的缩写及网络文件系统。 NFS 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS 系统和 Windows 网络共享、网络驱动器类似, 只不过 windows 用于局域网, NFS 用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统
存储工具
FastDFS,glusterfs,HDFS
为什么使用NFS存储服务
- 实现多台服务器之间数据共享
- 实现多台服务器之间数据一致
NFS应用场景
-
没有共享存储
下面我将通过图解给大家展示集群需要共享存储服务的理由
1.A 用户上传图片经过负载均衡,负载均衡将上传请求调度至 WEB1 服务器上。
2.B 用户访问 A 用户上传的图片,此时 B 用户被负载均衡调度至 WEB2 上,因为 WEB2 上没有这张图片,所以 B用户无法看到 A 用户传的图片
-
有共享存储
1.A 用户上传图片无论被负载均衡调度至 WEB1 还是 WEB2, 最终数据都被写入至共享存储
2.B 用户访问 A 用户上传图片时,无论调度至 WEB1 还是 WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了
nfs存储工作原理
1)首先服务器端启动RPC服务,并开启111端口
2)服务器端启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
注意: rpc 是一个远程过程调用,那么使用 nfs 必须有 rpc 服务
RPC与NFS如何通讯
因为NFS支持的功能相当多,,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
- 相关的几个守护进程
- RPC远程过程调用:portmap(CentOS5) , rpcbind(CentOS6,7)
- NFS守护进程:nfsd(端口号一般是2049,/etc/services记录)
- 管理NFS的文件系统:rpc.mountd 当client端顺利通过rpc.nfsd登入主机后,在它可以使用NFS服务器提供规定文件之前,还会经过文件使用权限的认证程序。它会去读取NFS的配置文件/etc/exports来对比客户端的权限,当通过这一关之后,client端也就取得使用NFS文件的权限
nfs服务端部署
安装nfs
yum install nfs-utils -y
配置参数
nfs 服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径允许访问的NFS客户端(共享权限参数)格式书写,定义要共享的目录与相应的权限,具体书写方式如下图所示
共享目录:存在于我们本机上的目录,我们想共享给网络上的其他主机使用。如我要共享/tmp/data目录,那么此选项可以就直接写/tmp/data目录,这个目录可以依照不同的权限共享给不同的主机。
客户端地址:客户端地址能够设置一个网络,也可以设置单个主机。参数:如读写权限rw,同步更新sync,压缩来访账号all_squash,压缩后的匿名账号anonuid=uid,anongid=gid等等;
客户端地址的设置主要有以下几种方式:
1)、 可以使用完整的IP或者是网络号,例如192.168.100.100 或 192.168.8.0/24
2)、 可以使用主机名,但这个主机名必须要在/etc/hosts内,或可以使用DNS找到该名称才行,反正重点是可找到IP就行,如果是主机名的话,还可以支持通配符,例如‘*’或‘?’均可接受;例如:host[1-8].ctos.zu,server?.test.com
- 配置参数详解
配置NFS服务端
- 写入配置文件:注意!IP地址和后面的小括号没有空格
[root@nfs ~]#cat > /etc/exports <<EOF
/data 172.16.1.0/24(rw,sync,all_squash)
EOF
- 创建数据目录和授权
[root@nfs ~]# mkdir /data -p
[root@nfs ~]# chown -R nfsnobody:nfsnobody /data/
启动nfs
[root@nfs ~]#systemctl start nfs-server.service
检查状态
[root@nfs ~]#systemctl status nfs-server.service
[root@nfs ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
设置开机启动
在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call远程过程调用服务将NFS服务器的IP地址和端口号信息发送给客户端。因此,在启动NFS服务之前,需要先重启并启用rpcbind服务程序,同时都加入开机自启动
[root@nfs ~]# systemctl enable rpcbind nfs-server
[root@nfs ~]# systemctl restart rpcbind nfs-server
客户端配置和挂载
- 安装NFS客户端
[root@backup ~]# yum install nfs-utils -y
安装完成后只需要启动rpcbind,不需要启动nfs
[root@backup ~]# systemctl restart rpcbind
使用showmount命令查看nfs共享信息查询 NFS 服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”。
[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
- 挂载NFS文件
- 在 NFS 客户端创建一个挂载目录, 使用 mount 命令并结合-t 参数, 指定要挂载的文件系统的类型, 并在命令后面写上服务器的IP地址,以及服务器上的共享目录, 最后需要写上要挂载到本地系统(客户端)的目录
[root@backup ~]# mkdir /data -p
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
查看是否挂载成功:
[oldboy@backup ~]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 2.4G 15G 14% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 32M 458M 7% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 125M 890M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data/w 17G 2.1G 15G 12% /data/w
测试写入数据是否正常
[root@backup ~]#cd /data/
[root@backup data]#echo "hello star " >back.txt
[root@backup data]#cat back.txt
hello star
写入开机自动挂载
在/etc/fstab里添加下面一行 :
172.16.1.31:/data /data nfs defaults 0 0
卸载命令:注意!卸载的时候如果提示”umount.nfs: /nfsdir: device is busy”先切换到其他目录再卸载
[root@backup ~]# umount /data/
强制卸载
[root@backup ~]# umount -rl /data/
NFS 权限验证
验证ro权限
- 服务端配置:
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs ~]# systemctl restart nfs-server.service
[root@nfs ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
然后挂载到客户端,测试读取写入权限
# 读取权限
[root@backup data]#cat back.txt
hello star
# 写入权限
[root@backup ~]# echo "backup" > /data/star.txt
-bash: /data/star.txt: 权限不够
验证all_squash、 anonuid、 anongid 权限
服务端配置:
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
服务端创建用户及授权:
注意:如果用户组不存在先创建,再创建用户
[root@nfs ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@nfs ~]# id www
uid=666(www) gid=666(www) 组=666(www)
重启NFS服务,更改目录授权
[root@nfs ~]# systemctl restart nfs-server.service
[root@nfs ~]# chown -R www:www /data/
[root@nfs ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月 17 19:50 /data/
客户端操作:
挂载目录,然后查看文件,添加文件,删除文件都没有问题.再查看文件的属性,都变成了设定的用户(anonuid=666,anongid=666)的属主和属组
为了统一,方便日后进行操作,我们把客户端的uid和gid也改成666,用户就是www用户
[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
NFS端口号
查看nfs端口
rpcinfo -p 或者 netstat -ntulp
防火墙配置
- firewall防火墙配置(如果以后在工作中需要开启情况)
firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=mountd --permanent
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --reload
启动nfs会开启如下端口
1)portmapper 端口:111 udp/tcp
2)nfs/nfs_acl 端口:2049 udp/tcp
3)mountd 端口:“32768–65535” udp/tcp
系统 RPC服务在 nfs服务启动时默认会给 mountd 和 nlockmgr 动态选取一个随机端口来进行通讯。
将随机的端口号设置固定
[root@nfs01 ~]# vim /etc/sysconfig/nfs
[root@nfs01 ~]# tail -5 /etc/sysconfig/nfs
RQUOTAD_PORT=4001
LOCKD_TCPPORT=4002
LOCKD_UDPPORT=4002
MOUNTD_PORT=4003
STATD_PORT=4004
重启nfs和rpc服务
CentOS7中只需要重启服务nfs就可以了.重启后可以再查看端口号是否是刚才设置的.
- iptables防火墙配置
-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
-A INPUT -p udp -m udp --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
-A INPUT -p udp -m udp --dport 2049 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4001:4004 -j ACCEPT
-A INPUT -p udp -m udp --dport 4001:4004 -j ACCEPT
NFS故障案例
如果设置了开机自启动,但是系统启动的时候NFS并没有提供服务,就会导致开机自检的时候卡在挂在那一步
开机启动时添加rd.break
ctrl+x
mount -o remount,rw /sysroot/
chroot /sysroot/
网上方法很多,根本目的就是把/etc/fstab中添加的NFS文件不要开机启动,添加注释或者删除