【Web 集群实战】18_NFS 网络文件共享服务
标签(空格分隔): Web集群实战
1. NFS 介绍
1.1 什么是 NFS
-
NFS 是 Network File System 的缩写,即网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS 客户端(一般为应用服务器,例如 Web)可以通过挂载(mount)方式将 NFS 服务器共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的 NFS 服务器的目录。
-
NFS 网络文件系统很像 Windows 系统的网络共享、安全功能、网络驱动器映射,这也与 Linux 系统里的 Samba 服务类似。只不过一般情况下,Windows 网络共享服务或 Samba 服务用于办公局域网共享,而互联网中小型网站集群架构后端常用 NFS 进行数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如 Moosefs(mfs)、GlusterFS、FastDFS。
1.2 NFS 系统原理
-
在 NFS 服务器端设置好一个共享目录 /video 后,其他有权限访问 NFS 服务器的客户端都可以将这个共享目录 /video 挂载到客户端本地的某个挂载点,如 /v/video,不同的客户端的挂载点可以不相同。
-
客户端正确挂载完毕后,就可以通过 NFS 客户端的挂载点所在的 /v/video 目录查看到 NFS 服务器端 /video 共享出来的目录下的所有数据。
-
NFS 在传输数据时使用的端口会随机选择。NFS 客户端通过 RPC(远程过程调用,Remote Procedure Call)协议/服务得知 NFS 服务器端使用哪个端口。
1.3 什么是 RPC
-
因为 NFS 支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS 的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用。
-
NFS 的 RPC 服务最主要的功能就是记录每个 NFS 功能所对应的端口号,并且在 NFS 客户端请求时将该端口和功能对应的信息传递给请求数据的 NFS 客户端,从而确保客户端可以连接到正确的 NFS 端口上去,达到实现数据传输交互数据的目的。
-
当 NFS 服务器端启动服务时会随机取用若干端口,并主动向 RPC 服务注册取用的相关端口及功能信息。然后 RPC 服务使用固定的 111 端口来监听 NFS 客户端提交的请求,并将正确的 NFS 端口信息回复给请求的 NFS 客户端。
-
在启动 NFS Server 之前, 首先要启动 RPC 服务,否则 NFS Server 就无法向 RPC 服务注册了。另外,如果 RPC 服务重新启动,原来已经注册好的 NFS 端口数据就会丢失,因此,此时 RPC 服务管理的 NFS 程序也需要重新启动以重新向 RPC 注册。一般修改 NFS 配置文件后,是不需要重启 NFS 的,直接在命令行执行 /etc/init.d/nfs reload 或 exportfs -rv 即可使修改的 /etc/exports 生效。
2. NFS 服务器端配置
2.1 操作系统及内核版本信息
[root@ylt001 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@ylt001 ~]# uname -r
3.10.0-693.el7.x86_64
[root@ylt001 ~]# uname -m
x86_64
2.2 查看NFS 软件包
[root@ylt001 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.48.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64
2.3 启动 NFS 相关服务
- 启动 rpcbind 服务
[root@ylt001 ~]# systemctl status rpcbind.service
* rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Active: inactive (dead)
[root@ylt001 ~]# systemctl start rpcbind.service
[root@ylt001 ~]# systemctl status rpcbind.service
* rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Active: active (running) since Sat 2018-10-06 23:14:19 CST; 26s ago
Oct 06 23:14:19 ylt001 systemd[1]: Starting RPC bind service...
Oct 06 23:14:19 ylt001 systemd[1]: Started RPC bind service.
[root@ylt001 ~]# lsof -i :111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 46u IPv6 14504 0t0 TCP *:sunrpc (LISTEN)
systemd 1 root 47u IPv4 14505 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1538 rpc 4u IPv6 14504 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1538 rpc 5u IPv4 14505 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1538 rpc 8u IPv4 23285 0t0 UDP *:sunrpc
rpcbind 1538 rpc 10u IPv6 23287 0t0 UDP *:sunrpc
[root@ylt001 ~]# netstat -lntup|grep rpcbind
udp 0 0 0.0.0.0:865 0.0.0.0:* 1538/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 1538/rpcbind
udp6 0 0 :::865 :::* 1538/rpcbind
udp6 0 0 :::111 :::* 1538/rpcbind
[root@ylt001 ~]# rpcinfo -p localhost
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
- 启动 NFS 服务
[root@ylt001 ~]# LANG=en
[root@ylt001 ~]# systemctl status nfs
* nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@ylt001 ~]# systemctl start nfs
[root@ylt001 ~]# systemctl status nfs
* nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since Sat 2018-10-06 23:21:19 CST; 3s ago
Oct 06 23:21:19 ylt001 systemd[1]: Starting NFS server and services...
Oct 06 23:21:19 ylt001 systemd[1]: Started NFS server and services.
[root@ylt001 ~]# rpcinfo -p localhost
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 47859 status
100024 1 tcp 34218 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
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 38028 nlockmgr
100021 3 udp 38028 nlockmgr
100021 4 udp 38028 nlockmgr
100021 1 tcp 39989 nlockmgr
100021 3 tcp 39989 nlockmgr
100021 4 tcp 39989 nlockmgr
- 设置开机自启动
[root@ylt001 ~]# systemctl enable rpcbind
[root@ylt001 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@ylt001 ~]# systemctl list-unit-files |grep enabled| egrep "rpcbind|nfs"
nfs-server.service enabled
nfs.service enabled
rpcbind.socket enabled
nfs-client.target enabled
2.4 配置案例
- 创建需要共享的目录并授权
[root@ylt001 ~]# mkdir -p /nfsdata
# 创建哟啊共享的 NFS 目录,也可以使用已存在的目录
[root@ylt001 ~]# cd /nfsdata/
[root@ylt001 nfsdata]# touch test.txt
# 创建测试文件
[root@ylt001 nfsdata]# chown -R nfsnobody.nfsnobody /nfsdata
# 在服务器端把要共享的 NFS 目录赋予 NFS 默认用户 nfsnobody 用户和用户组权限
[root@ylt001 nfsdata]# ls -ld /nfsdata
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Oct 7 00:04 /nfsdata
[root@ylt001 nfsdata]# grep nfsnobody /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
- 配置 NFS 服务配置文件,并在本地查看挂载信息
[root@ylt001 nfsdata]# cat /etc/exports
/nfsdata 192.168.2.0/24(rw,sync)
[root@ylt001 nfsdata]# exportfs -rv
exporting 192.168.2.0/24:/nfsdata
[root@ylt001 nfsdata]# cat /etc/exports
/nfsdata 192.168.2.0/24(rw,sync)
[root@ylt001 nfsdata]# showmount -e localhost
Export list for localhost:
/nfsdata 192.168.2.0/24
[root@ylt001 nfsdata]# cat /var/lib/nfs/etab
/nfsdata 192.168.2.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,no_all_squash)
- 在本地把服务器端同时又作为客户端进行挂载测试
[root@ylt001 nfsdata]# mount -t nfs 192.168.2.141:/nfsdata /mnt
[root@ylt001 nfsdata]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 9.8G 6.2G 3.1G 68% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.0M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda2 190M 147M 30M 84% /boot
tmpfs 183M 0 183M 0% /run/user/0
tmpfs 183M 0 183M 0% /run/user/1000
192.168.2.141:/nfsdata 9.8G 6.2G 3.1G 68% /mnt
3. NFS 客户端配置
3.1 操作系统及内核版本信息
[root@ylt001 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@ylt001 ~]# uname -r
3.10.0-693.el7.x86_64
[root@ylt001 ~]# uname -m
x86_64
3.2 查看NFS 软件包
[root@ylt001 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.48.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64
3.3 启动 RPC 服务
- 防火墙控制
[root@ylt001 ~]# firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“192.168.2.0/24” port protocol=“tcp” port=“111” accept”
success
[root@ylt001 ~]# firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“192.168.2.0/24” port protocol=“udp” port=“111” accept”
success
- 若上述方式不成功则关闭防火墙
[root@ylt001 ~]# systemctl stop firewalld
- 启动 RPC 服务
[root@ylt001 ~]# LANG=en
[root@ylt001 ~]# systemctl start rpcbind
[root@ylt001 ~]# systemctl status rpcbind
* rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Active: active (running) since Sun 2018-10-07 01:23:06 CST; 7h left
Oct 07 01:23:06 ylt001 systemd[1]: Starting RPC bind service...
Oct 07 01:23:06 ylt001 systemd[1]: Started RPC bind service.
3.4 挂载 NFS 共享目录 /nfsdata
[root@ylt001 ~]# showmount -e 192.168.2.141
Export list for 192.168.2.141:
/nfsdata 192.168.2.0/24
[root@ylt001 ~]# mount -t nfs 192.168.2.141:/nfsdata /mnt
[root@ylt001 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 9.8G 6.2G 3.1G 68% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.0M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda2 190M 147M 30M 84% /boot
tmpfs 183M 0 183M 0% /run/user/0
tmpfs 183M 0 183M 0% /run/user/1000
192.168.2.141:/nfsdata 9.8G 6.2G 3.1G 68% /mnt
- 测试读写数据
[root@ylt001 ~]# ls /mnt/
test.txt
[root@ylt001 ~]# mkdir /mnt/test
[root@ylt001 ~]# ll /mnt/
total 4
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Oct 6 17:37 test
-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 7 2018 test.txt