NFS存储
NFS是什么?
NFS是网络文件系统,用于共享存储。
NFS能干什么?
NFS可以通过局域网实现不同主机系统之间的目录共享。
为什么要用NFS?
在网站集群架构中如果没有共享存储的话,最有可能导致的问题就是不能保证web服务器上的资源一致。
使用NFS能解决这些问题
- 解决多台web静态资源的共享。
- 能解决多台web静态资源的一致性。
- 解决多个web磁盘空间浪费。
- 快速迭代web服务器的代码。
企业使用NFS注意事项
- 增加NFS服务不能给网站带来访问速度的提升。
- 建议使用cdn对静态资源加速。
NFS原理
本地文件操作方式
- 当用户执行mkdir命令, BashShell无法完成该命 令操作,会将其翻译给内核。
- Kerne l内核解析完成后会驱动对应的磁盘设备,完成创建目录的操作。
NFS实现原理(需要先了解[程序|进程|线程] ) - NFS客户端执行增、删等操作,客户端会使用不同的函数对该操作进行封装。
- NFS客户端会通过TCP/ IP的方式传递给NFS服务端。
- NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
- nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
- Rpc.mount进程判断客户端是否有对应的权限进行验证。
- idmap进程实现用户映射和压缩。
- 最后NFS服务端会将客户端的函数转换为本地能执行的命令,然后将命令传递至内核,由内核驱动硬件。
注意: rpc是一 个远程过程调用, 那么使用nfs必须有rpc服务
NFS配置方法
- 安装
[root@backup /]# yum install rpcbind nfs-utils -y
- 配置:
配置文件为/etc/exports
配置语法为:
本地要共享的目录 在哪个网络中共享(共享参数)
共享参数:
rw:读写权限 *
ro:只读权限
sync:同时将数据写入到内存与硬盘中,保证不丢失数据 *
async:优先将数捆保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
anonuidk:配置all_ squash使用,指定NFS的用户UID。必须存在系统
anongid:配置all_squash使用,指定NFS的用户GID,必须存在系统
root_ squash:当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_ root_ squash:当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
all_ squash:无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
no_ all_squash:无论NFS客户端使用什么账户访问,都不进行压缩
示例:
# 将nfs服务端的/data目录共享给172.16.1.0/24网段内的所有主机
# 1)所有客户端主机都拥有读写权限
# 2)在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失
# 3)将所有用户映射为本地的匿名用户(nfsnobody)
/data 172.16.1.0/24(rw,sync,all_squash)
- 创建目录
mkdir /data
chown -R nfsnobody:nfsnobody /data
- 启动NFS
systemctl start nfs
systemctl enable nfs
- 客户端测试
# 安装
yum install nfs-utils -y
# 检查共享的目录详情
showmount -e 172.16.1.41
# 挂载
mount -t nfs 172.16.1.41:/data /mnt
NFS特点
优点:
- 简单易用,方便部署,数据可靠,服务稳定,满足中小企业的需求。
- 数据都在文件系统上,所有数据都能看得见
存储局限:
1.存在单点故障,不支持集群模式。构建高可用维护麻烦。
2.NFS都是明文,并不对数据做任何校验,没有密码验证(内网使用)
应用建议:
1.生产场景应将静态数据尽可能防止cdn场景进行环绕,以此来减少后端存储的压力。
2.如果没有缓存或架构、代码等,本身历史遗留问题太大,再多存储也没意义。