存储服务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

 

posted @ 2024-11-01 15:34  老虎死了还有狼  阅读(3)  评论(0编辑  收藏  举报