存储服务nfs
1. 概述
- 存储: 用于存放用户上传的内容(数据),一般应用在网站集群中.
- 为何用?
- 如果不使用存储,用户上传的数据就直接存放在网站服务器上了,用户下次访问就可能找不到.
- 如果使用存储,用户上传的内容存放在存储上面,用户访问就会访问存储.
- 位置: 网站后排.
2. 存储选型⭐⭐⭐
存储的要求:空间大
温馨提示:服务选型的时候,不是什么NB选择什么,选择适合网站需求的即可.
分类 |
说明 | 选型 |
硬件存储 |
硬件存储,硬盘多,使用的时候挂载即可. SAN存储,NAS存储, 厂商华为,H3C..硬件存储,Dell EMC |
物理服务器使用 |
开源软件 |
普通存储(单点): NFS(linux),Samba(windows) 分布式存储: MinIO,Ceph,GlusterFS,,FastDFS..... |
物理服务器,云服务器,NFS Docker,k8s,选择minio/ceph... |
云产品 |
阿里云OSS(对象存储),七牛云存储,腾讯云COS,华为OSS |
一般云服务器使用,使用最简单. |
3. NFS原理⭐⭐⭐⭐⭐
- NFS (Network File System): 网络文件系统.-
- NFS服务端:2个服务组成
- NFS服务
- rpcbind(portmap)rpc服务(远程调用协议)
关于RPC的说明:
RPC:远程过程调用,本质起到调度作用.
rpc服务从CentOS 6开始叫rpcbind,之前叫portmapper.
4. 上手指南⭐⭐⭐⭐⭐
4.1 环境说明
环境 |
主机 | ip地址 | 说明 |
nfs服务端 |
nfs01 | 10.0.0.68/172.16.1.68 | |
nfs客户端 |
web01 | 10.0.0.69/172.16.1.69 |
通过挂载使用nfs服务 |
nfs客户端 |
web02 | 10.0.0.70/172.16.1.70 |
通过挂载使用nfs服务 |
# 服务端流程
1.部署与检查
2.服务启动,rpcbind,nfs
3.根据共享目录,创建目录,修改权限(nobody)
4.修改配置文件并reload nfs
5.检查(showmount -e )与测试(mount,df -hT) 挂载点/mnt/
# 客户端
1.部署与检查
2.不需要启动(要安装)
3.创建挂载点(不用改权限)
4.mount挂载,df -hT查看,修改/etc/fstab永久挂载
4.2 服务端部署
4.2.1.部署
'''
centos中默认没有安装,麒麟中安装
# ubt下载与使用
apt install rpcbind nfs-common nfs-kernel-server
rpcbind #正常使用即可
systemctl enable nfs-kernel-server
systemctl start nfs-kernel-server
'''
#检查是否安装
[root@nfs01 ~]# rpm -qa | egrep 'nfs|rpcbind'
rpcbind-1.2.5-2.p01.ky10.x86_64
rpcbind-help-1.2.5-2.p01.ky10.noarch
nfs-utils-2.5.1-5.ky10.x86_64
nfs-utils-help-2.5.1-5.ky10.x86_64
[root@nfs01 ~]#
[root@nfs01 ~]# yum install -y rpcbind nfs-utils
上次元数据过期检查:0:29:36 前,执行于 2024年10月11日 星期五 09时48分52秒。
软件包 rpcbind-1.2.5-2.p01.ky10.x86_64 已安装。
软件包 nfs-utils-1:2.5.1-5.ky10.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
4.2.2 启动
启动&检查
# rpcinfo -p 检查nfs服务端的rpc信息. 主要检查是否有NFS信息即可
[root@nfs01 ~]# systemctl enable --now rpcbind
Created symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service → /usr/lib/systemd/system/rpcbind.service.
[root@nfs01 ~]#
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]#
[root@nfs01 ~]# systemctl status rpcbind
● rpcbind.service - RPC Bind
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-10-11 10:18:58 CST; 52s ago
Docs: man:rpcbind(8)
Main PID: 1796 (rpcbind)
Tasks: 1
Memory: 1.3M
CGroup: /system.slice/rpcbind.service
└─1796 /usr/bin/rpcbind -w -f
10月 11 10:18:58 nfs01 systemd[1]: Starting RPC Bind...
10月 11 10:18:58 nfs01 systemd[1]: Started RPC Bind.
[root@nfs01 ~]#
[root@nfs01 ~]# rpcinfo -p 10.0.0.68
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
[root@nfs01 ~]#
[root@nfs01 ~]# rpcinfo -p # 不加参数默认为nfs服务端ip
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
[root@nfs01 ~]#
[root@nfs01 ~]# systemctl enable --now nfs
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@nfs01 ~]#
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]#
[root@nfs01 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Active: active (exited) since Fri 2024-10-11 10:20:52 CST; 21s ago
[root@nfs01 ~]#
[root@nfs01 ~]# rpcinfo -p
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
100024 1 udp 37527 status
100024 1 tcp 55771 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100021 1 udp 36861 nlockmgr
100021 3 udp 36861 nlockmgr
100021 4 udp 36861 nlockmgr
100021 1 tcp 46775 nlockmgr
100021 3 tcp 46775 nlockmgr
100021 4 tcp 46775 nlockmgr
[root@nfs01 ~]#
4.2.2.1 is-enabled 结果为 alias
# 此现象说明服务名为别名,需执行status查看真正的服务名(Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)),然后再is-enabled
root@nfs01:/server/scripts# systemctl is-enabled nfs-kernel-server.service
alias
root@nfs01:/server/scripts# systemctl status nfs-kernel-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
Active: active (exited) since Fri 2024-10-11 09:17:47 UTC; 7min ago
Main PID: 2496 (code=exited, status=0/SUCCESS)
CPU: 5ms
Oct 11 09:17:47 nfs01 systemd[1]: Starting NFS server and services...
Oct 11 09:17:47 nfs01 exportfs[2495]: exportfs: can't open /etc/exports for reading
Oct 11 09:17:47 nfs01 systemd[1]: Finished NFS server and services.
root@nfs01:/server/scripts#
root@nfs01:/server/scripts# systemctl is-enabled nfs-server.service
enabled
root@nfs01:/server/scripts#
4.2.3 配置
# 修改配置文件
[root@nfs01 ~]# vim /etc/exports
#1.共享 /nfsdata目录
/nfsdata/ 172.16.1.0/24(rw)
# 创建共享目录/nfsdata/
[root@nfs01 ~]# mkdir /nfsdata
# 修改/nfsdata所有者为nobody (centos 系统中 nfsnobody)
[root@nfs01 ~]# chown -R nobody.nobody /nfsdata/
[root@nfs01 ~]# cat /etc/exports
#1.共享/nfsdata/目录 用户 nobody
/nfsdata/ 172.16.1.0/24(rw) # 配置表示: 172.16.1.0/24网段对NFS服务端的/nfsdata/目录,拥有rw读写权限.
# 重新加载 restart在nfs中,会导致客户端一段时间的夯住.
[root@nfs01 ~]# systemctl reload nfs
# showmount -e ip 检查nfs服务端共享信息(共享哪些目录)
[root@nfs01 ~]# showmount -e
Export list for nfs01:
/nfsdata 172.16.1.0/24
[root@nfs01 ~]#
[root@nfs01 ~]# showmount -e 10.0.0.68
Export list for 10.0.0.68:
/nfsdata 172.16.1.0/24
[root@nfs01 ~]#
[root@nfs01 ~]# showmount -e nfs01
Export list for nfs01:
/nfsdata 172.16.1.0/24
4.2.4 挂载
#挂载存储
[root@nfs01 ~]# df -h /mnt
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/klas-root 96G 4.2G 92G 5% /
[root@nfs01 ~]#
[root@nfs01 ~]# mount -t nfs 172.16.1.68:/nfsdata /mnt/
[root@nfs01 ~]#
[root@nfs01 ~]# df -h /mnt
文件系统 容量 已用 可用 已用% 挂载点
172.16.1.68:/nfsdata 96G 4.2G 92G 5% /mnt
[root@nfs01 ~]#
[root@nfs01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 963M 0 963M 0% /dev
tmpfs 979M 0 979M 0% /dev/shm
tmpfs 979M 17M 962M 2% /run
tmpfs 979M 0 979M 0% /sys/fs/cgroup
/dev/mapper/klas-root 96G 4.2G 92G 5% /
tmpfs 979M 0 979M 0% /tmp
/dev/sda1 2.0G 176M 1.9G 9% /boot
tmpfs 196M 0 196M 0% /run/user/0
172.16.1.68:/nfsdata 96G 4.2G 92G 5% /mnt
[root@nfs01 ~]#
# 取消挂载
[root@nfs01 ~]# umount /mnt
4.3 客户端部署
#1.安装nfs支持,检查是否安装nfs.
[root@web01 ~]# rpm -qa | egrep 'nfs|rpcbind'
rpcbind-1.2.5-2.p01.ky10.x86_64
rpcbind-help-1.2.5-2.p01.ky10.noarch
nfs-utils-2.5.1-5.ky10.x86_64
nfs-utils-help-2.5.1-5.ky10.x86_64
[root@web01 ~]#
#如果没有安装,则安装
yum install -y rpcbind nfs-utils
#2.挂载
[root@web01 ~]# mkdir -p /mnt/data
[root@web01 ~]#
[root@web01 ~]# mount -t nfs 172.16.1.68:/nfsdata /mnt/data/
[root@web01 ~]#
[root@web01 ~]# touch /mnt/data/{01..03}.txt
[root@web01 ~]#
[root@web01 ~]# ls /mnt/data/
01.txt 02.txt 03.txt
[root@web01 ~]#
[root@web01 ~]# df -T
文件系统 类型 1K-块 已用 可用 已用% 挂载点
devtmpfs devtmpfs 985384 0 985384 0% /dev
tmpfs tmpfs 1001568 0 1001568 0% /dev/shm
tmpfs tmpfs 1001568 9072 992496 1% /run
tmpfs tmpfs 1001568 0 1001568 0% /sys/fs/cgroup
/dev/mapper/klas-root xfs 100610052 4273468 96336584 5% /
tmpfs tmpfs 1001568 0 1001568 0% /tmp
/dev/sda1 xfs 2086912 180180 1906732 9% /boot
tmpfs tmpfs 200312 0 200312 0% /run/user/0
172.16.1.68:/nfsdata nfs4 100610304 4361216 96249088 5% /mnt/data
[root@web01 ~]#
#3.永久挂载到 /etc/fstab
#设备 挂载点 文件系统类型 挂载参数 是否检查 是否备份
#172.16.1.68:/nfsdata/ /mnt/data/ nfs defaults 0 0
故障案例:
mount: wrong fs type 错误的文件系统类型,客户端无法识别nfs.
需要在客户端安装nfs-utils,不用启动.
4.4 总结
温馨提示:如果做了永久挂载,后面开机需要先启动存储服务器,然后web服务器
角色 |
流程 |
服务端 |
1.部署软件nfs-utils,rpcbind 2.创建共享目录,修改所有者(nobody) centos nfsnobody ubt 3.修改配置文件(/etc/exports) 4.启动rpcbind,nfs(重启reload nfs即可) 5.挂载测试(mount) |
客户端 |
1.部署软件nfs-utils,系统可以挂载nfs
2.挂载nfs 3.永久挂载/etc/fstab |
5. NFS服务端配置文件
nfs服务端或客户端 |
说明 |
NFS服务端配置 |
/etc/exports(配置文件里面的) --> /var/lib/nfs/etab(当前使用的nfs服务端配置) |
NFS客户端配置 |
客户端:mount /etc/rc.local 或/etc/fstab --> /proc/mounts(当前系统的挂载情况) |
排错(/proc/mounts)
客户端挂载失败或者挂载夯住时,在/proc/mounts中过滤nfs,找出nfs挂载点,通过umount -lf强制卸载,然后重新挂载即可.
[root@web01 ~]# cat /proc/mounts
172.16.1.68:/nfsdata /mnt/data nfs4 rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.69,local_lock=none,addr=172.16.1.68 0 0
[root@web01 ~]#
nfs管理systemctl命令的背后是在调用exportfs命令
/etc/exports由来
root@nfs01:/server/scripts# systemctl cat nfs-server.service
# /lib/systemd/system/nfs-server.service
[Unit]
Description=NFS server and services
DefaultDependencies=no
Requires=network.target proc-fs-nfsd.mount
Requires=nfs-mountd.service
Wants=rpcbind.socket network-online.target
Wants=rpc-statd.service nfs-idmapd.service
Wants=rpc-statd-notify.service
Wants=nfsdcld.service
After=network-online.target local-fs.target
After=proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service
After=nfs-idmapd.service rpc-statd.service
After=nfsdcld.service
Before=rpc-statd-notify.service
# GSS services dependencies and ordering
Wants=auth-rpcgss-module.service
After=rpc-gssd.service gssproxy.service rpc-svcgssd.service
# 在Service可以查到 -r reload
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/sbin/exportfs -r
ExecStart=/usr/sbin/rpc.nfsd
ExecStop=/usr/sbin/rpc.nfsd 0
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f
ExecReload=-/usr/sbin/exportfs -r
[Install]
WantedBy=multi-user.target
5.1 配置文件格式
/etc/exports |
说明 |
第1部分 |
第2个部分 |
共享目录 |
网段(nfs配置) |
5.2 NFS配置文件中网络配置
网段 |
说明 |
172.16.1.0/24 ✅ |
最常用 |
172.16.1.68 |
指定ip |
baidu.com |
指定域名 |
5.3 服务端核心配置⭐⭐⭐⭐⭐
服务端配置选项 |
说明 |
rw |
read write 可以读写共享目录 |
ro |
只读 read only |
sync |
同步,只要用户上传,就把数据写到磁盘上 |
async
|
异步,用户上传的数据,nfs先临时存放到内存中,过一段时间写入到磁盘. 并发高,数据可能丢失 |
理解:同步与异步⭐ ⭐ ⭐ ⭐ ⭐
幼儿园工作
同步: 挨个小伙伴问,你是否要上wc.
异步: 画了个圈圈,需要去wc的到这个圈圈中,定时去带走圈圈里面的人.
CPU-->内存-->磁盘
同步在网站架构中指的是直接访问对应的资源.
异步在网站架构中利用各种缓存达到用户优先访问缓存,缓存没有再访问对应服务.
5.4 服务端用户压缩 ⭐⭐
在 NFS(网络文件系统)中,用户压缩(User Mapping)是将所有访问 NFS 共享的用户映射到一个特定的用户(通常是匿名用户)
/nfs01data 172.16.1.0/24(rw,all_squash,anonuid=3999,anongid=3999)
# 解释配置选项
/nfs01data: # 这是共享的目录路径。
172.16.1.0/24: # 这是允许访问该共享的客户端网络。
rw: # 允许读写访问。
all_squash: # 所有客户端用户都被映射为匿名用户。
anonuid=3999: # 匿名用户的 UID 被设置为 3999。
anongid=3999: # 匿名用户的 GID 被设置为 3999。
#将用户压缩为 www
如果你想要将所有访问该 NFS 共享的用户压缩为特定的用户(如 www 用户),你需要确保 www 用户的 UID 和 GID 是 3999
5.5 用户压缩案例
6. NFS优化
终极优化目标: ⭐ ⭐ ⭐ ⭐ ⭐
尽可能让用户的请求在访问网站架构之前解决掉。(尽可能把用户的请求往前推)
NFS优化: 硬件(物理服务器+nfs服务)
NFS安全优化: 客户端挂载 只能上传,无法执行
mount -o 指定指定挂载选项
mount -o noexec,nosuid,nodev -t nfs 172.16.1.69:/data/video/
#这几个是客户端挂载选项
noexec 挂载的nfs目录中如果有命令,无法运行。
nosuid 带有suid的命令
nodev 带有特殊属性的文件。
#/etc/fstab
172.16.1.69:/data/ /video/ nfs noexec,nosuid,nodev 0 0
- NFS有单点故障,
- 准备个nfs备用节点(数据),故障的时候进行切换(取决于nfs可以挂多久).
- 分布式存储:GlusterFS(GFS),MinIO,Ceph............,FastDFS,Mfs
- 公有云OSS(阿里云) (对象存储在代码里面调用)
- 有时间研究分布式存储:MinIO
7. 总结
搭建NFS存储,对服务进行配置(比如共享/nfsdata目录)
用户映射选项:all_squash,anonuid,anongid
故障与排查:rpcinfo -p ip ,showmount -e ip
解决nfs服务单点问题: 实时同步lsyncd.
完成项目:全网备份项目,共享存储,nfs存储实时同步(解决单点)
7.1 nfs通用检查脚本
check_nfs.sh
#!/bin/bash
##############################################################
# File Name:check_nfs.sh
# Version:V1.0
# Author:xk
#
# Desc:
#############################################################
# vars
debian=`egrep -i 'ubuntu|debian' /etc/os-release |wc -l`
redhet=`egrep -i 'centos|kylin' /etc/os-release |wc -l`
if [ $debian -gt 0 ];then
dpkg -l | egrep 'nfs'
[ $? -ne 0 ] && apt install -y nfs-common nfs-kernel-server
dpkg -l | egrep 'rpcbind'
[ $? -ne 0 ] && apt install -y rpcbind
# 启动rpc
systemctl enable --now rpcbind
systemctl start rpcbind
# 启动nfs
systemctl enable --now nfs-kernel-server
systemctl start nfs-kernel-server
# 检查rpc
rpc_server_cnt=`rpcinfo -p | egrep -i '2049|nfs' | wc -l`
echo '$rpc_server_cnt: ' $rpc_server_cnt
elif [ $redhet -gt 0 ];then
rpm -qa | egrep 'nfs'
[ $? -ne 0 ] && yum install -y nfs-utils
rpm -qa | egrep 'rpcbind'
[ $? -ne 0 ] && yum install -y rpcbind
# 启动rpc
systemctl enable --now rpcbind
systemctl start rpcbind
# 启动nfs
systemctl enable --now nfs
systemctl start nfs
# 检查rpc
rpc_server_cnt2=`rpcinfo -p | egrep -i '2049|nfs' | wc -l`
echo '$rpc_server_cnt2: ' $rpc_server_cnt2
else
echo "未知系统"
fi
7.2 部署nfs服务端通用脚本
deploy_nfs_server.sh
#!/bin/bash
##############################################################
# File Name:deploy_nfs_server.sh
# Version:V1.0
# Author:xk
#
# Desc:
##############################################################
# 部署nfs服务
debian=`egrep -i 'ubuntu|debian' /etc/os-release |wc -l`
redhet=`egrep -i 'centos|kylin' /etc/os-release |wc -l`
ser_cfg="/etc/exports"
share_data="/nfs01data"
# 配置文件
[ -f $ser_cfg ] && cp $ser_cfg $ser_cfg.bak
cat >/etc/exports<<EOF
/nfs01data 172.16.1.0/24(rw,all_squash,anonuid=3999,anongid=3999)
EOF
# nfs 重新加载
[ $debian -gt 0 ] && systemctl reload nfs-kernel-server || systemctl reload nfs
# 共享目录
[ ! -f $share_data ] && mkdir $share_data
chown www.www $share_data
# 添加用户
groupadd -g 3999 www
useradd -u 3999 -g www -s /sbin/nologin -M www
7.3 部署nfs客户端通用脚本
deploy_nfs_client.sh
#!/bin/bash
##############################################################
# File Name:deploy_nfs_client.sh
# Version:V1.0
# Author:xk
#
# Desc:
##############################################################
# 部署nfs客户端 deploy nfs_client
backup_ip="$1"
share_data="/nfs01data"
mount_point="/mnt"
# 添加用户
groupadd -g 3999 www
useradd -u 3999 -g www -s /sbin/nologin -M www
mount -t nfs $backup_ip:$share_data $mount_point
touch $mount_point/1.txt