@yanglt7
2018-10-21T15:57:09.000000Z
字数 7257
阅读 716
Web集群实战
NFS 是 Network File System 的缩写,即网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS 客户端(一般为应用服务器,例如 Web)可以通过挂载(mount)方式将 NFS 服务器共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的 NFS 服务器的目录。
NFS 网络文件系统很像 Windows 系统的网络共享、安全功能、网络驱动器映射,这也与 Linux 系统里的 Samba 服务类似。只不过一般情况下,Windows 网络共享服务或 Samba 服务用于办公局域网共享,而互联网中小型网站集群架构后端常用 NFS 进行数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如 Moosefs(mfs)、GlusterFS、FastDFS。
在 NFS 服务器端设置好一个共享目录 /video 后,其他有权限访问 NFS 服务器的客户端都可以将这个共享目录 /video 挂载到客户端本地的某个挂载点,如 /v/video,不同的客户端的挂载点可以不相同。
客户端正确挂载完毕后,就可以通过 NFS 客户端的挂载点所在的 /v/video 目录查看到 NFS 服务器端 /video 共享出来的目录下的所有数据。
NFS 在传输数据时使用的端口会随机选择。NFS 客户端通过 RPC(远程过程调用,Remote Procedure Call)协议/服务得知 NFS 服务器端使用哪个端口。
因为 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 生效。
[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
[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
[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
[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
[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
[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
[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
[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
[root@ylt001 ~]# systemctl stop firewalld
[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.
[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