把照片上传到服务器,有时候会看不到,刷新下浏览器又可以看到了?要解决这个疑问,先学习NFS共享存储吧。
— 为什么要NFS共享存储 —
我们通过架构分析为什么需要NFS共享存储?
·无NFS文件共享存储·
当用户user-A通过互联网上传文件时,经过负载均衡,随机或者定向分配到某个节点。但是当用户user-B去下载这个文件的时候,并不确定会向哪个节点发送请求,这样会导致用户存在一定几率下载不到的情况,如下图所示。
·有NFS文件共享存储·
当用户user-A通过互联网上传文件时,经过负载均衡,无论发送到哪个节点都会被存储到NFS文件服务器。但是当用户user-B去下载这个文件的时候,任何节点都可以读取NFS文件服务器的文件,如下图所示。
综上,如果WEB服务器后端没有共享存储,一个比较明显的问题是:用户第一次可能会访问不到自己刚上传的图片,这对于用户来说是不可以接受的,会影响体验。
— 快速了解NFS —
·NFS基础知识·
NFS简称网络文件系统,基于内核的文件系统,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。其主要功能是通过局域网让不同的主机之间可以共享文件或目录。
·NFS工作原理·
用户进程访问NFS客户端使用不同的函数对数据进行处理。NFS客户端通过TCP/IP的方式传递给NFS服务端。NFS服务端接收到请求后,会先调用portmap进程进行端口映射。nfsd进程用于判断NFS客户端是否拥有连接NFS服务端。rpc.mount进程判断客户端是否有对应的权限进行验证。idmap进程实现用户映射和压缩。最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
— 多台客户端统一用户NFS —
·案例需求·
多台NFS客户机挂载同一台NFS服务器时,每台客户机都能对共享文件进行读写操作需求,要求NFS客户端用户写入的文件所有者和所属组保持一致。
·解决思路·
让所有NFS客户端写入到NFS Server的目录或文件在NFS Server上的用户和组都是同一个名称(hanmingze),并保持UID和GID一致。
·服务器信息·
使用一台服务器(bj-nfs-m-164)和两台客户机(bj-web-2-166和bj-web-2-167)进行测试,服务器基本环境描述信息如下图所示。
确认NFS服务器和客户端防火墙和SEILNUX都已经关闭,如下代码所示。
[root@nfs_m_164 ~]#sestatus SELinux status: disabled [root@nfs_m_164 ~]#/etc/init.d/iptables status iptables: Firewall is not running. [root@nfs_s_165 ~]#sestatus SELinux status: disabled [root@nfs_s_165 ~]#/etc/init.d/iptables status iptables: Firewall is not running. [root@apache_166 ~]#sestatus SELinux status: disabled [root@apache_166 ~]#/etc/init.d/iptables status iptables: Firewall is not running. [root@apache_167 ~]#sestatus SELinux status: disabled [root@apache_167 ~]#/etc/init.d/iptables status iptables: Firewall is not running.
上述代码返回结果中可以看到,iptables防火墙和SELINUX都已经处于关闭状态。
·实施和测试·
1.创建NFS共享用户
创建一个NFS共享用户(hanmingze),并且所有机器的UID和GID都一样。
(1)在nfs-server上:useradd -u 666 hanmingze。
useradd -u 666 hanmingze
创建后用id hanmingze查看,可用groupmod -g指令更改用户的gid,如下代码所示。
groupmod -g 666 hanmingze [root@nfs_m_164 ~]#useradd -u 666 hanmingze [root@nfs_m_164 ~]#groupadd -g 666 hanmingze groupadd: group hanmingze already exists [root@nfs_m_164 ~]#grep hanmingze /etc/passwd hanmingze:x:666:666::/home/hanmingze:/bin/bash [root@nfs_m_164 ~]#id hanmingze uid=666(hanmingze) gid=666(hanmingze) groups=666(hanmingze)
上述代码中可以看到,hanmingze用户的用户ID和组ID均为666。
(2)在nfs-client新建用户
[root@apache_166 ~]#useradd -u 666 hanmingze [root@apache_166 ~]#id hanmingze uid=666(hanmingze) gid=666(hanmingze) groups=666(hanmingze) [root@apache_167 ~]#useradd -u 666 hanmingze [root@apache_167 ~]#id hanmingze uid=666(hanmingze) gid=666(hanmingze) groups=666(hanmingze)
上述代码中可以看到,hanmingze用户的用户ID和组ID均为666。
2.配置/etc/exports文件
配置内容如下:
[root@nfs_m_164 ~]#cat /etc/exports /data/bak/ 192.168.2.165(rw,sync,root_squash,all_squash,anonuid=65534,anongid=65534) /data/web/ 192.168.2.166(rw,no_root_squash,sync) /data/web/ 192.168.2.167(rw,sync,insecure,all_squash) #2019/06-02 /data/bj_web_share 192.168.2.166(rw,sync,all_squash,anonuid=666,anongid=666) /data/bj_web_share 192.168.2.167(rw,sync,all_squash,anonuid=666,anongid=666) /etc/exports核心配置内容解释: all_squash:保证所有用户都能压缩成一个用户。 anonuid=666和anongid=666:指定每个用户下都有并且存在的。
创建共享目录
[root@nfs_m_164 ~]#mkdir -pv /data/bj_web_share mkdir: created directory `/data/bj_web_share
上述代码创建共享目录/data/bj_web_share。
3.平滑重启NFS服务生效
[root@nfs_m_164 ~]#exportfs -avr exporting 192.168.2.166:/data/bj_web_share exporting 192.168.2.167:/data/bj_web_share exporting 192.168.2.166:/data/web exporting 192.168.2.167:/data/web exporting 192.168.2.165:/data/bak
上述代码不重启rpcbind和NFS服务,让内核读取/etc/exports配置文件。
4.在客户端挂载
[root@apache_166 ~]#showmount -e 192.168.2.164 Export list for 192.168.2.164: /data/bj_web_share 192.168.2.167,192.168.2.166 /data/web 192.168.2.167,192.168.2.166 /data/bak 192.168.2.165 [root@apache_166 ~]# [root@apache_166 ~]# [root@apache_166 ~]#mount -t nfs 192.168.2.164:/data/bj_web_share /mnt [root@apache_166 ~]#df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_www-lv_root ext4 8.3G 1.1G 6.9G 14% / tmpfs tmpfs 931M 0 931M 0% /dev/shm /dev/sda1 ext4 477M 28M 425M 7% /boot 192.168.2.164:/data/web/ nfs 8.3G 807M 7.1G 11% /usr/local/apache/htdocs 192.168.2.164:/data/bj_web_share nfs 8.3G 807M 7.1G 11% /mnt [root@apache_167 ~]#mount -t nfs 192.168.2.164:/data/bj_web_share /mnt [root@apache_167 ~]#df -TH Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_www-lv_root ext4 8.9G 1.1G 7.4G 13% / tmpfs tmpfs 977M 0 977M 0% /dev/shm /dev/sda1 ext4 500M 29M 445M 7% /boot 192.168.2.164:/data/web/ nfs 8.9G 846M 7.6G 11% /usr/local/apache/htdocs 192.168.2.164:/data/bj_web_share nfs 8.9G 846M 7.6G 11% /mnt