02-NFS存储服务

书弋江山 2020-07-08

1、NFS存储服务概念

NFS 是 Network File System 的缩写及网络文件系统。 NFS 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录,NFS客户端可以通过挂载的方式将NFS服务端共享数据的文件目录挂载到本地挂载点,这样对本地挂载点目录中的数据进行操作其实就是操作NFS服务端共享数据的文件目录

为什么要使用数据存储共享服务?

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

2、NFS应用场景

没有共享存储的场景:

1、A 用户上传图片经过负载均衡,负载均衡将上传请求调度至 WEB1 服务器上。
2、B 用户访问 A 用户上传的图片,此时 B 用户被负载均衡调度至 WEB2 上,因为 WEB2 上没有这张图片,所以 B用户无法看到 A 用户传的图片

02-NFS存储服务

有共享存储的场景:

1.A 用户上传图片无论被负载均衡调度至 WEB1 还是 WEB2, 最终数据都被写入至共享存储
2.B 用户访问 A 用户上传图片时,无论调度至 WEB1 还是 WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源

02-NFS存储服务

3、NFS和RPC

NFS服务必须依赖于RPC(远程调用服务)才能工作。因为NFS支持的功能特别多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会用一个随机未被使用的端口来传输数据,因此,NFS的功能所对应的端口无法固定。所以客户端要准确的获得NFS服务所使用的端口就需要RPC服务。RPC最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,让客户端可以链接到正确的端口上去,从而实现数据传输。

NFS服务启动时会随机取用多个端口,并主动向RPC服务注册取用的相关端口信息,这样,RPC服务就可以知道每个端口所对应的NFS功能,然后RPC服务使用固定的端口号111来监听NFS客户端提交的请求,并将正确的NFS端口答应给NFS客户端,这样一来,就可以让NFS客户端与服务端进行数据传输了。

4、NFS服务端部署

4-1 安装软件

yum -y install nfs-utils rpcbind

4-2 编写配置文件

[ ~]# vim /etc/exports
# 格式: 01 02(03)
#01: 设置数据存储的目录 /data
#02: 设置网络一个白名单 (允许哪些主机连接到存储服务器进行数据存储)
#03: 配置存储目录的权限信息 存储目录一些功能
/data   172.16.1.0/24(rw,sync)
#注意IP地址和小括号之间没有空格

4-3 创建共享数据目录并授权

[ ~]# mkdir /data -p
 ~]# chown -R nfsnobody.nfsnobody /data

4-4 启动服务

  1. 启动rpc服务,开启111端口
  2. 启动nfs服务
  3. 实现nfs服务进程和端口号的注册
[ ~]# systemctl start rpcbind
[ ~]# systemctl enable rpcbind
[ ~]# systemctl start nfs
[ ~]# systemctl enable nfs
# 检查nfs服务进程与端口注册信息
[ ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

5、客户端挂载部署

客户端安装nfs服务十分简单,只需要安装nfs软件包即可

# 1.安装NFS服务软件
[ ~]# yum -y install nfs
# 2.实现远程挂载共享目录
[ ~]# mount -t nfs 172.16.1.31:/data  /mnt
# 3.测试数据是否正常写入
[ ~]# echo "testtesttest" > /mnt/test.txt
[ ~]# cat /mnt/test.txt
testtesttest
  • 实现开机自动挂载
# 1.利用rc.local
echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
# 2.利用fstab文件
vim /etc/fstab
172.16.1.31:/data   /mnt   nfs  defaults   0 0
  • 卸载
[ ~]# umount /mnt

6、NFS存储目录权限

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

6-1 验证ro权限

  • 服务端配置
[ ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)

[ ~]# systemctl reload nfs  
# restart:将所有连接会话都会直接断开
# reload:  只会将没有数据传输链接断开,重新建立连接,让用户访问感受更好
  • 客户端挂载
[ ~]# mount -t nfs 172.16.1.31:/data /mnt
[ ~]# df -h
Filesystem         Size  Used Avail Use% Mounted on
devtmpfs           471M     0  471M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M   15M  472M   3% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda2           14G  8.6G  5.4G  62% /
/dev/sda1          2.8G  272M  2.6G  10% /boot
tmpfs               98M   12K   98M   1% /run/user/42
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/data   14G  6.8G  7.3G  49% /mnt
  • 读写测试
## root用户测试
# 写入测试,不能写入
[ ~]# echo "hello,hello" > /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system
# 读取测试,可以正常读取数据
[ ~]# cat /mnt/test.txt 
hello,hello

## 普通用户测试
# 读取测试,可以正常读取数据
[ ~]$ cat /mnt/test.txt 
hello,hello
# 写入测试,不能写入
[ ~]$ echo "hello" >  /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system

6-2 验证all_squash、anonuid、anongid 权限

  • 服务端配置:
[ ~]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=1005,anongid=1005)
  • 创建用户并授权:
[ ~]# useradd -M -u 1005 www -s /sbin/nologin        
[ ~]# id www
uid=1005(www) gid=1005(www) groups=1005(www)
[ ~]# chown -R www:www /data/
[ ~]# ll /data/ -d
drwxr-xr-x. 5 www www 67 Jul  7 23:08 /data/
  • 重启NFS服务
[ ~]# systemctl reload nfs
[ ~]# systemctl reload nfs
  • 客户端操作:
# 1.创建www用户uid=1005 gid=1005
[ ~]# useradd -M -u 1005 www -s /sbin/nologin
# 写入数据测试
[ ~]# echo ‘hello‘ > /mnt/hello.txt
[ ~]# ll /mnt/hello.txt
-rw-r--r-- 1 www www 6 Jul  8 00:07 /mnt/hello.txt

# 读取数据测试
[ ~]# cat /mnt/hello.txt 
hello

7、查看NFS端口

[ ~]# rpcinfo  -p
   program vers proto   port  service
  tcp    111  portmapper
  tcp    111  portmapper
  tcp    111  portmapper
  udp    111  portmapper
  udp    111  portmapper
  udp    111  portmapper
  udp  57640  status
  tcp  56096  status
  udp  20048  mountd
  tcp  20048  mountd
  udp  20048  mountd
  tcp  20048  mountd
  udp  20048  mountd
  tcp  20048  mountd
  tcp   2049  nfs
  tcp   2049  nfs
  tcp   2049  nfs_acl
  udp   2049  nfs
  udp   2049  nfs
  udp   2049  nfs_acl
  udp  56967  nlockmgr
  udp  56967  nlockmgr
  udp  56967  nlockmgr
  tcp  44817  nlockmgr
  tcp  44817  nlockmgr
  tcp  44817  nlockmgr

8、客户端mount命令参数

rw   	--- 实现挂载后挂载点目录可读可写  (默认)
ro   	--- 实现挂载后挂载点目录可读可写
suid 	--- 在共享目录中可以让setuid权限位生效  (默认)
nosuid 	--- 在共享目录中可以让setuid权限位失效   提供共享目录的安全性
exec 	--- 共享目录中的执行文件可以直接执行
noexec 	--- 共享目录中的执行文件可以无法直接执行 提供共享目录的安全性
auto 	--- 可以实现自动挂载     mount -a 实现加载fstab文件自动挂载
noauto 	--- 不可以实现自动挂载
nouser 	--- 禁止普通用户可以卸载挂载点
user 	--- 允许普通用户可以卸载挂载点

相关推荐