NFS实现集群下文件共享

应用背景

由于文件是放在两台服务器上,服务器的访问时负载均衡策略,每次上传文件和访问文件有可能是不同的服务器,所以使用文件共享来解决。

NFS简介

NFS是Network File System的简写,即网络文件系统。NFS最早是由 Sun Microsystems 公司开发,并于1984年推出。
NFS 是一种可分散式的网络文件系统,可以通过网络(一个局域网)使不同的机器、不同的操作系统,能够共享目录和文件,使客户端能通过网络访问并分享文件到位于服务端的磁盘中。
NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下)。
从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和linux的samba服务类似。
只不过一般情况下,Windows网络共享服务或samba服务用户办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享。
若是大型网站,那么有可能还会用到更复杂的分布式文件系统Moosefs(mfs)、GlusterFS。NFS在文件传送或信息传送过程中依赖于RPC协议。RPC负责负责信息的传输。

环境

  • 系统:linux的CentOS 7.5
  • NFS版本:nfs-utils-1.3.0-0.48.el7_4.1.x86_64
  • RPC版本:rpcbind-0.2.0-42.el7.x86_64
  • 服务器:共有两台机器做文件共享,没有新增文件服务器,所以选择其中一台作为文件共享的服务器。
    A:192.168.3.101
    B:192.168.3.102

NFS服务端配置

检查并安装NFS

$ rpm -qa rpcbind nfs-utils
nfs-utils-1.3.0-0.48.el7_4.1.x86_64
rpcbind-0.2.0-42.el7.x86_64

不存在的话需要安装NFS需要的包:

$ yum install -y nfs-utils

服务配置

  • 首先进入配置文件
    $ vi /etc/exports 
    
  • 增加配置
    /data/fileserver 192.168.3.101(rw,sync,no_root_squash) 	192.168.3.102(rw,sync,no_root_squash)
    
  • NFS的主要配置文件 /etc/exports 的内容格式
    <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
    a. 输出目录:
    输出目录是指NFS系统中需要共享给客户机使用的目录;
    
    b. 客户端:
    客户端是指网络中可以访问这个NFS输出目录的计算机
    
    客户端常用的指定方式
        指定ip地址的主机:192.168.0.200
        指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
        指定域名的主机:david.bsmart.cn
        指定域中的所有主机:*.bsmart.cn
        所有主机:*
    
    c. 选项:
    选项用来设置输出目录的访问权限、用户映射等。
    
    NFS主要有3类选项:
    访问权限选项
        设置输出目录只读:ro
        设置输出目录读写:rw
    
    用户映射选项
        all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
        no_all_squash:与all_squash取反(默认设置);
        root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
        no_root_squash:与rootsquash取反;
        anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
        anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
    
    其它选项
        secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
        insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
        sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
        async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
        wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
        no_wdelay:若有写操作则立即执行,应与sync配合使用;
        subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
        no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
    

配置端口

默认设置中 nfs 端口是2049,`portmapper` 的端口是111,`mountd `端口是20048,`status` 和 `nlockmgr` 是随机端口。
  • 修改 /etc/sysconfig/nfs 文件
    $ vi /etc/sysconfig/nfs
    
  • 增加端口配置如下一行,对应 rpc.statd 服务,显示status
    STATD_PORT=2050
    
    因 nfslock 服务会自动开启 rpc.statd,无需做设置;在rpcinfo -p 映射中,rpc.statd 对应 status ,后续再次修改端口后重启服务使配置生效的
    $ systemctl restart nfs-lock
    
  • 修改 /etc/modprobe.d/lockd.conf 文件。
    Network Lock Manager (NLM),对应是 nlockmgr
    $ sudo vi /etc/modprobe.d/lockd.conf 
    
  • 增加端口配置如下两行
    options lockd nlm_tcpport=2051
    options lockd nlm_udpport=2051
    

启动NFS服务

  • 启动
    先 rpcbind 后 nfs
    $ systemctl enable rpcbind.service
    $ systemctl enable nfs-server.service
    $ systemctl start rpcbind.service
    $ systemctl start nfs-server.service
    
  • 查看服务
    	$ rpcinfo -p
    	   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  47426  status
    	    100024    1   tcp  35379  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  53046  nlockmgr
    	    100021    3   udp  53046  nlockmgr
    	    100021    4   udp  53046  nlockmgr
    	    100021    1   tcp  38280  nlockmgr
    	    100021    3   tcp  38280  nlockmgr
    	    100021    4   tcp  38280  nlockmgr
    	~~~
    
  • 防火墙设置
    添加放行规则
    $ firewall-cmd --permanent --add-port=111/tcp
    $ firewall-cmd --permanent --add-port=111/udp
    $ firewall-cmd --permanent --add-port=2049-2051/tcp
    $ firewall-cmd --permanent --add-port=2049-2051/udp
    $ firewall-cmd --permanent --add-port=20048/tcp
    $ firewall-cmd --permanent --add-port=20048/udp
    $ firewall-cmd --reload
    
  • 更新配置
    重新使配置文件生效,并显示生效内容
    $ exportfs -arv
    
  • 查看共享是否成功
    $ showmount -e localhost
    
  • 挂载本地目录
    $ mount -t nfs  192.168.3.101:/data/fileserver  /data/files
    
  • 使挂载生效
    $ mount -a
    
  • 查看挂载
    $ df -h
    

NFS客户端配置

  • 安装nfs,并启动服务。

    $ yum install -y nfs-utils
    $ systemctl enable rpcbind.service
    $ systemctl start rpcbind.service
    

    客户端不需要启动nfs服务,只需要启动rpcbind服务。

  • 检查 NFS 服务器端是否有目录共享

    $ showmount -e 192.168.3.101
    
  • 挂载远程服务

    $ mount -t nfs  192.168.3.101:/data/fileserver  /data/files
    
  • 查看挂载

    $ df -h
    

相关问题

1.Unable to receive: errno 113

nfs与rpcbind都正常启动了,并且已经发布共享目录/data/fileserver
在客户端查看时,出现如下错误提示:

$ showmount -e 192.168.3.101
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)

解决方法:

关闭被访问的NFS服务器上的防火墙和selinux

systemctl stop firewalld;iptables -F ;setenforce 0

在客户端重新查看

showmount -e 192.168.3.101

2.clnt_create: RPC: Program not registered

在客户端showmount -e 192.168.3.101遇到以下错误提示,“clnt_create: RPC: Program not registered”

解决方法:

服务端执行:

$ rpc.mountd 

客户端查看

$ showmount -e 192.168.3.101
Export list for server.example.com:
/data/fileserver *(rw,sync,no_root_squash)

3.Permission denied

重新设置配置文件/etc/exports,确保文件中的权限是包括客户端的ip地址

参考

JavaWeb项目架构之NFS文件服务器
Linux下NFS配置及远程挂载
NETWORK FILE SYSTEM (NFS)

你可能感兴趣的:(【----linux----】,【----分布式----】,NFS,linux,分布式)