NFS共享存储实战

2023-07-29,,

NFS共享存储实战

目录
NFS共享存储实战
NFS基本概述
为什么要使用共享存储
企业中文件服务器(共享存储)
NFS应用场景
集群没有共享存储时
集群有共享存储
NFS实现原理
NFS的函数
本地文件操作方式
NFS原理
NFS服务实战
环境准备
NFS服务部署(服务端操作)
客户端操作
NFS配置详解
企业实战
NFS客户端部署web站点
如何将nfs的客户端做成开机自动挂载
nfs卸载
增加挂载安全性
验证nfs的ro权限
企业中一定要统一用户权限
NFS小结
NFS实践案例
环境准备

NFS基本概述

NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。

NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS

NFS一般用于文件服务器(共享存储)

为什么要使用共享存储

1.实现多台服务器之间数据共享

2.实现多台服务器之间数据一致

企业中文件服务器(共享存储)

NFS
GFS
FastDFS
HDFS
Ceph
NAS

NFS应用场景

集群没有共享存储时

1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。

2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所

以B用户无法看到A用户传的图片。

集群有共享存储

1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储

2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这

样就可以访问到资源了

NFS实现原理

NFS的函数

Read			#读取数据(访问)
write #写入(原本自己有的,写进共享存储)
create #创建(原本自己没有,在共享存储中创建出来)
remove #删除
rename #改名

注意:rpcbind是管理nfs的

portmap:端口映射,rpcbind端口号是111

rpc.nfsd:是验证客户端IP是否在IP段

rpc.mount:检测是否有权限挂载共享目录

本地文件操作方式

1.当用户执行mkdir命令, 该命令会调用shell解释器翻译给内核。

2.内核解析完成后会驱动对应的硬件设备,完成相应的操作

NFS原理

1.用户进程访问NFS客户端,使用不同的函数对数据进行处理(这里NFS客户端就是web服务器)

2.NFS客户端通过TCP/IP的方式传递给NFS服务端。

3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射(rpcbind端口号111)

4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。

5.Rpc.mount进程判断客户端是否有对应的权限进行验证。

6.idmap进程实现用户映射和压缩

7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件

注意: rpc是一个远程过程调用,那么使用nfs必须有rpc服务

NFS服务实战

环境准备

主机名 主机角色 外网IP 内网IP
web01 NFS客户端 10.0.0.7 172.16.1.7
web02 NFS客户端 10.0.0.8 172.16.1.8
nfs NFS服务端 10.0.0.31 172.16.1.31

NFS服务部署(服务端操作)

NFS服务安装

[root@nfs ~]$ yum -y install nfs-utils rpcbind

查看nfs匿名用户

[root@web01 ~]$ cat /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

修改配置文件

[root@nfs ~]$ vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
#NFS服务配置文件语法:/data(NFS共享目录) 172.16.1.0/24(NFS客户端IP段) (rw,sync,all_squash)(参数1,参数2......)
#PS:下面有参数详解

创建共享目录

[root@nfs ~]$ mkdir /data
#/data就是nfs服务端的共享存储目录

修改目录权限

[root@nfs ~]$ chown nfsnobody.nfsnobody /data
#将目录属主属组修改后,因为我们用的是(all_squash:无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户),这样不管哪个客户端需要访问nfs服务端都有权限操作

启动服务

[root@nfs ~]$ systemctl start nfs-server

加入开机自启

[root@nfs ~]$ systemctl enable nfs-server

检查进程

[root@nfs ~]$ ps -ef|grep [n]fs
root 7168 2 0 18:31 ? 00:00:00 [nfsd4_callbacks]
root 7174 2 0 18:31 ? 00:00:00 [nfsd]
root 7175 2 0 18:31 ? 00:00:00 [nfsd]
root 7176 2 0 18:31 ? 00:00:00 [nfsd]
root 7177 2 0 18:31 ? 00:00:00 [nfsd]
root 7178 2 0 18:31 ? 00:00:00 [nfsd]
root 7179 2 0 18:31 ? 00:00:00 [nfsd]
root 7180 2 0 18:31 ? 00:00:00 [nfsd]
root 7181 2 0 18:31 ? 00:00:00 [nfsd]

检查rpcbind端口号

[root@nfs ~]$ netstat -lntup|grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5571/rpcbind
tcp6 0 0 :::111 :::* LISTEN 5571/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 5571/rpcbind
udp6 0 0 :::111 :::* 5571/rpcbind

客户端操作

安装nfs-utils

[root@web01 ~]$ yum -y install nfs-utils

查看nfs服务端可用的挂载点(共享目录)

root@web01 ~]$ showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
#/data目录可用

创建一个用户上传数据的目录

[root@web01 ~]$ mkdir /user_pic

挂载nfs服务端的共享目录

[root@web01 ~]$ mount -t nfs 172.16.1.31:/data /user_pic
#将nfs服务端的/data目录挂载至客户端/user_pic目录
#-t:type,类型 [root@web01 ~]$ df -h
172.16.1.31:/data 19G 1.4G 18G 8% /user_pic [root@web01 ~]$ ll /user_pic/ -d
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Jul 7 18:29 /user_pic/
#此时的/user_pic/目录已经是nfs服务端的/data目录了,所以属组属主也变了

NFS配置详解

nfs共享参数 参数作用
rw 读写权限(客户端可以上传)
ro 只读权限(客户端只能读取)
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
no_all_squash 无论NFS客户端使用什么账户访问,都以自身账户操作NFS(肯定没权限操作)
sync* 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
anonuid* 配置all_squash使用,指定NFS的用户UID,必须存在系统
anongid* 配置all_squash使用,指定NFS的用户UID,必须存在系统

企业实战

NFS客户端部署web站点

安装网站服务

[root@web01 ~]$  yum install -y httpd php
[root@web02 ~]$ yum install -y httpd php

查找http服务的站点目录

[root@web01 ~]$ rpm -ql httpd
/var/www/html
#httpd是http的守护进程

部署代码

[root@web01 ~]$ cd /var/www/html/			#进入/var/www/html/中
[root@web01 /var/www/html]$
[root@web01 /var/www/html]$ rz -E #上传桌面的作业网站的代码文件
rz waiting to receive.
[root@web01 /var/www/html]$ ll
total 28
-rw-r--r--. 1 root root 26927 Jul 7 11:21 kaoshi.zip [root@web01 /var/www/html]$ systemctl start httpd

解压代码

[root@web01 /var/www/html]$ unzip kaoshi.zip
Archive: kaoshi.zip
inflating: info.php
inflating: upload_file.php
inflating: bg.jpg
inflating: index.html
#解压该压缩文件

修改了php代码,改了里面上传目录

[root@web01 /var/www/html]$ vim upload_file.php
$wen="/var/www/html/pic";

查看httpd服务的匿名用户

[root@web01 /var/www/html]$ ps -ef|grep httpd
root 8272 1 0 01:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8273 8272 0 01:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8274 8272 0 01:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8275 8272 0 01:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8276 8272 0 01:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 8277 8272 0 01:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 8288 7023 0 01:49 pts/0 00:00:00 grep --color=auto httpd
#用户是apache

修改目录的权限

[root@web01 /var/www/html]$ chown apache.apache /var/www/html/

关闭selinux服务

[root@web01 /var/www/html]$ setenforce 0
[root@web01 /var/www/html]$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux

启动服务

[root@web01 /var/www/html/]$ systemctl start httpd
#此时就可以通过IP10.0.0.7(web01)进入网站并上传文件,并且在/var/www/html/pic中创建的文件也能在网页中10.0.0.7/pic查看到

将用户上传文件的路径做成共享存储

mount -t nfs 172.16.1.31:/data /var/www/html/pic/
#开启共享存储后10.0.0.8(web02)也可以上传文件至10.0.0.7/pic目录下,实现共享

查看挂载

df -h

如何将nfs的客户端做成开机自动挂载

# 编辑开机挂载的配置文件(不建议)
vim /etc/fstab
172.16.1.31:/data /var/www/html/pic nfs defauts 0 0
注意:如果NFS服务端出现问题,客户端一直挂载不上,可能会导致系统起不来,如果挂载不上只能进入救援模式

nfs卸载

umount /var/www/html/pic
umount -f :强制卸载

增加挂载安全性

在企业工作场景,通常情况NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。例如: 很多木马篡改站点文件都是由上传入口上传的程序到存储目录。然后执行的

#通过mount -o指定挂载参数,禁止使用suid,exec,增加安全性能
mount -t nfs -o nosuid,noexec,nodev 172.16.1.31:/data 挂载点

验证nfs的ro权限

[root@nfs ~]# vim /etc/exports
/pic 10.0.0.0/24(ro,sync,all_squash) 客户端验证:
# 挂载
[root@nfs ~]$ mkdir /pic
[root@web01 ~]$ mount -t nfs 10.0.0.31:/pic /mnt/ # 查看
[root@web01 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.4G 18G 8% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 497M 120M 378M 25% /boot
tmpfs 98M 0 98M 0% /run/user/0
10.0.0.31:/pic 19G 1.4G 18G 8% /mnt # 创建文件报错,显示只是一个只读文件
[root@web01 ~]$ touch /mnt/1.txt
touch: cannot touch ‘/mnt/1.txt’: Read-only file system # 查看etab配置文件是否生效
[root@nfs ~]# cat /var/lib/nfs/etab

企业中一定要统一用户权限

#统一用户,一定要保证uid和gid一样
[root@nfs ~]$ groupadd www -g 666
[root@nfs ~]$ useradd www -u 666 -g 666 -s /sbin/nologin -M [root@backup ~]$ groupadd www -g 666
[root@backup ~]$ useradd www -u 666 -g 666 -s /sbin/nologin -M [root@web01 ~]$ groupadd www -g 666
[root@web01 ~]$ useradd www -u 666 -g 666 -s /sbin/nologin -M [root@web02 ~]$ groupadd www -g 666
[root@web02 ~]$ useradd www -u 666 -g 666 -s /sbin/nologin -M #1.统一apache服务用户
[root@web01 ~]$ vim /etc/httpd/conf/httpd.conf
[root@web02 ~]$ vim /etc/httpd/conf/httpd.conf
1)修改前
66 User apache
67 Group apache
2)修改后
66 User www
67 Group www
#更改/var/www/html目录的属主属组为www
[root@web01 ~]$ chown www.www /var/www/html/
[root@web01 ~]$ ll /var/www/html/ -d
drwxr-xr-x. 3 www www 106 Jul 8 01:56 /var/www/html/ [root@web02 ~]$ chown www.www /var/www/html/
[root@web02 ~]$ ll /var/www/html/ -d
drwxr-xr-x. 2 www www 6 Nov 17 2020 /var/www/html/ #再重启httpd服务
[root@web01 ~]$ systemctl restart httpd #2.统一nfs服务用户
[root@nfs ~]$ vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
#更改共享目录的属主属组
[root@nfs ~]$ chown www.www /data/
[root@nfs ~]$ ll -d /data/
drwxr-xr-x. 2 www www 19 Jul 8 01:02 /data/ #再重启nfs-server服务
[root@nfs ~]$ systemctl restart nfs-server #3.rsync服务的用户
[root@backup ~]$ vim /etc/rsyncd.conf
uid = www
gid = www
#更改同步目录的属主属组
[root@backup ~]$ chown www.www /backup/
[root@backup ~]$ ll -d /backup/
drwxr-xr-x. 5 www www 108 Jul 8 01:00 /backup/ #再重启rsyncd服务
[root@backup ~]$ systemctl restart rsyncd

NFS小结

1.NFS存储优点

1)NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。

2)NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。

2.NFS存储局限

1)存在单点故障, 如果构建高可用维护麻烦web->nfs()->backup

2)NFS数据明文, 并不对数据做任何校验。

3)客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)

3.NFS应用建议

1)生产场景应将静态数据尽可能往前端推, 减少后端存储压力

2)必须将存储里的静态资源通过CDN缓存jpg\png\mp4\avi\css\js

3)如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用

NFS实践案例

环境准备

主机名 角色 外网IP 内网IP
nfs nfs服务端,rsync的客户端 10.0.0.31 172.16.1.31
backup rsync服务端 10.0.0.41 172.16.1.41
web01 nfs客户端,rsync的客户端 10.0.0.7 172.16.1.7
web02 nfs客户端,rsync的客户端 10.0.0.8 172.16.1.8

要求:

1.目录名$hostname_$ip_$date

2.无差异同步

1.将三台rsync客户端的数据同步到rsync服务端

1.web01:
[root@web01 ~]$ vim tb1.sh
#!/bin/bash
bak_dir=/backup/
HOSTNAME=$(hostname)
IP=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F-%T)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
echo '123' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
mkdir -p $tar_dir
cd /etc
tar zcf $tar_dir/passwd.tgz passwd
rsync -avz --delete $bak_dir/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd 2.web02:
[root@web01 ~]$ vim tb2.sh
#!/bin/bash
bak_dir=/backup01/
HOSTNAME=$(hostname)
IP=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F-%T)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
echo '123' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
mkdir -p $tar_dir
cd /etc
tar zcf $tar_dir/passwd.tgz passwd
rsync -avz --delete $bak_dir/ rsync_backup@172.16.1.41::backup01 --password-file=/etc/rsync.passwd
#在backup服务端创建/backup01目录,并指定属组属主为www 3.nfs:
[root@nfs ~]$ vim tb3.sh
#!/bin/bash
bak_dir=/backup02/
HOSTNAME=$(hostname)
IP=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F-%T)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}
echo '123' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
mkdir -p $tar_dir
cd /
tar zcf $tar_dir/data.tgz data
rsync -avz --delete $bak_dir/ rsync_backup@172.16.1.41::backup02 --password-file=/etc/rsync.passwd
#在backup服务端创建/backup02目录,并指定属组属主为www

2.将web01,web02nfs客户端挂载nfs服务端

[root@web01 ~]$ mount -t nfs 172.16.1.31:/data /user_pic/
[root@web01 ~]$ df -h
172.16.1.31:/data 19G 1.4G 18G 8% /user_pic [root@web02 ~]$ mount -t nfs 10.0.0.31:/pic /user_pic/
[root@web02 ~]$ df -h
10.0.0.31:/pic 19G 1.4G 18G 8% /user_pic #这里挂载的是nfs服务端的/pic

NFS共享存储实战的相关教程结束。

《NFS共享存储实战.doc》

下载本文的Word格式文档,以方便收藏与打印。