@yanglt7
2018-10-21T15:57:09.000000Z
字数 7257
阅读 814
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-releaseCentOS Linux release 7.4.1708 (Core)[root@ylt001 ~]# uname -r3.10.0-693.el7.x86_64[root@ylt001 ~]# uname -mx86_64
[root@ylt001 ~]# rpm -qa nfs-utils rpcbindnfs-utils-1.3.0-0.48.el7.x86_64rpcbind-0.2.0-42.el7.x86_64
[root@ylt001 ~]# systemctl status rpcbind.service* rpcbind.service - RPC bind serviceLoaded: 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 serviceLoaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)Active: active (running) since Sat 2018-10-06 23:14:19 CST; 26s agoOct 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 :111COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEsystemd 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 *:sunrpcrpcbind 1538 rpc 10u IPv6 23287 0t0 UDP *:sunrpc[root@ylt001 ~]# netstat -lntup|grep rpcbindudp 0 0 0.0.0.0:865 0.0.0.0:* 1538/rpcbindudp 0 0 0.0.0.0:111 0.0.0.0:* 1538/rpcbindudp6 0 0 :::865 :::* 1538/rpcbindudp6 0 0 :::111 :::* 1538/rpcbind[root@ylt001 ~]# rpcinfo -p localhostprogram vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper100000 4 udp 111 portmapper100000 3 udp 111 portmapper100000 2 udp 111 portmapper
[root@ylt001 ~]# LANG=en[root@ylt001 ~]# systemctl status nfs* nfs-server.service - NFS server and servicesLoaded: 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 servicesLoaded: 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 agoOct 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 localhostprogram vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper100000 4 udp 111 portmapper100000 3 udp 111 portmapper100000 2 udp 111 portmapper100024 1 udp 47859 status100024 1 tcp 34218 status100005 1 udp 20048 mountd100005 1 tcp 20048 mountd100005 2 udp 20048 mountd100005 2 tcp 20048 mountd100005 3 udp 20048 mountd100005 3 tcp 20048 mountd100003 3 tcp 2049 nfs100003 4 tcp 2049 nfs100227 3 tcp 2049 nfs_acl100003 3 udp 2049 nfs100003 4 udp 2049 nfs100227 3 udp 2049 nfs_acl100021 1 udp 38028 nlockmgr100021 3 udp 38028 nlockmgr100021 4 udp 38028 nlockmgr100021 1 tcp 39989 nlockmgr100021 3 tcp 39989 nlockmgr100021 4 tcp 39989 nlockmgr
[root@ylt001 ~]# systemctl enable rpcbind[root@ylt001 ~]# systemctl enable nfsCreated 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 enablednfs.service enabledrpcbind.socket enablednfs-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 /nfsdatadrwxr-xr-x 2 nfsnobody nfsnobody 4096 Oct 7 00:04 /nfsdata[root@ylt001 nfsdata]# grep nfsnobody /etc/passwdnfsnobody: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 -rvexporting 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 localhostExport 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 -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 9.8G 6.2G 3.1G 68% /devtmpfs 897M 0 897M 0% /devtmpfs 912M 0 912M 0% /dev/shmtmpfs 912M 9.0M 903M 1% /runtmpfs 912M 0 912M 0% /sys/fs/cgroup/dev/sda2 190M 147M 30M 84% /boottmpfs 183M 0 183M 0% /run/user/0tmpfs 183M 0 183M 0% /run/user/1000192.168.2.141:/nfsdata 9.8G 6.2G 3.1G 68% /mnt
[root@ylt001 ~]# cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)[root@ylt001 ~]# uname -r3.10.0-693.el7.x86_64[root@ylt001 ~]# uname -mx86_64
[root@ylt001 ~]# rpm -qa nfs-utils rpcbindnfs-utils-1.3.0-0.48.el7.x86_64rpcbind-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 serviceLoaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)Active: active (running) since Sun 2018-10-07 01:23:06 CST; 7h leftOct 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.141Export 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 -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 9.8G 6.2G 3.1G 68% /devtmpfs 897M 0 897M 0% /devtmpfs 912M 0 912M 0% /dev/shmtmpfs 912M 9.0M 903M 1% /runtmpfs 912M 0 912M 0% /sys/fs/cgroup/dev/sda2 190M 147M 30M 84% /boottmpfs 183M 0 183M 0% /run/user/0tmpfs 183M 0 183M 0% /run/user/1000192.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 4drwxr-xr-x 2 nfsnobody nfsnobody 4096 Oct 6 17:37 test-rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 7 2018 test.txt