NFS--共享存储

Posted captain-jiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFS--共享存储相关的知识,希望对你有一定的参考价值。

一:NFS基本概述

NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。

NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS

1 为什么使用共享存储?

  • 1.实现多台服务器之间数据共享

  • 2.实现多台服务器之间数据一致

二:NFS应用场景

1.1 集群没有共享存储

1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。

2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。
技术图片

1.2 集群有共享存储

1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储

2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

技术图片

三:NFS实现原理

技术图片

四:NFS服务安装

环境准备:

服务器系统 角色 外网IP 内网IP
CentOS 7.5 NFS服务端 eth0:10.0.0.31 eth1:172.16.1.31
CentOS 7.5 NFS客户端web01 eth0:10.0.0.7 eth1:172.16.1.7
CentOS 7.5 NFS客户端web02 eth0:10.0.0.8 eth1:172.16.1.8

技术图片

1. 配置nfs服务端

一:安装nfs和rpcbind   因为nfs用的是rpc协议
    yum -y install  nfs-utils  #yum安装nfs服务里有rpcbind的依赖包
    nfs-utils是NFS的服务器端管理工具(NFS是内核模块),不光服务端需要,客户端也需要安装,不然无法挂载成功。
    1.1查看软件包
    [root@backup ~]# rpm -qa | egrep "nfs|rpcbind"
    rpcbind-0.2.0-47.el7.x86_64
    libnfsidmap-0.25-19.el7.x86_64
    nfs-utils-1.3.0-0.61.el7.x86_64
    [root@backup ~]# rpm -qa |grep -E  "nfs|rpcbind"
    rpcbind-0.2.0-47.el7.x86_64
    libnfsidmap-0.25-19.el7.x86_64
    nfs-utils-1.3.0-0.61.el7.x86_64

###########################扩展##########################
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。
NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。
而这些传输协议用到这个RPC功能的。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

RPC是一种通过网络从远程计算机程序上请求服务,其工作在TCP/UDP的111端口。
在Linux6/Centos7中实现RPC协议的软件是RPCbind程序包,进程名称是portmapper。RPC并不提供任何具体的服务,
要想提供具体的服务就必须在Linux上提供具体的软件。而网络文件系统(NFS)就是基于RPC协议工作的,

RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,
并且通知客户端,记客户端可以连接到正常端口上去。

特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs? reload或exportfs –rv即可使修改的/etc/exports生效。
###########################扩展##########################

?    启动:# CentOS 6启动方式;
?        $ service nfs restart
?        $ chkconfig nfs on
?        

# CentOS 7启动方式;

?        $ systemctl enable nfs.service
?        $ systemctl start nfs.service

### 2. 配置nfs配置文件

?```
位置:/etc/exports   默认是空配
    [root@nfs ~]# vim /etc/exports
    
    /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
    /data :共享目录,存在于我们本机上的目录,我们想共享给网络上的其他主机使用。
            如果要共享/tmp/data目录,那么此选项可以就直接写/tmp/data目录,这个目录可以依照不同的权限共享给不同的主机。
    172.16.1.0/24 :客户端地址:客户端地址能够设置一个网络,也可以设置单个主机。
                    参数:如读写权限rw,同步更新sync,压缩来访账号all_squash,压缩后的匿名账号anonuid=uid,anongid=gid等等;
                    
###########################扩展##########################                  
    客户端地址的设置主要有以下几种方式:
            1) 可以使用完整的IP或者是网络号,例如192.168.100.100 或 192.168.8.0/24
            2) 可以使用主机名,但这个主机名必须要在/etc/hosts内,或可以使用DNS找到该名称才行,反正重点是可找到IP就行,
               如果是主机名的话,还可以支持通配符,例如‘*’或‘?’均可接受;例如:host[1-8].ctos.zu,server?.test.com
###########################扩展##########################  

?    rw:读写
?    sync:写磁盘,持久化
?    all_squash:无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
?                就算用root访问,也会映射成匿名用户
?    anonuid=666,anonuid=666 :指定用户uid和gid
?```

###    3. 创建用户

?```
 客户端以什么身份来访问?
    客户端访问服务端默认是使用nfsnobody这个用户来进行访问的。uid和gid为65534。服务器默认共享时,也是加上了all_squash这个参数。
    并制定anonuid为65534(也就是nfsnobayd用户)。当然如果系统中nfsnobody是其他的uid,那么就有可能造成访问权限出现问题。
    所以最好我们可以通过一设置一个用户来访问,统一UID、GID。
    [root@nfs ~]# tail -1 /etc/passwd
    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
    因为需要跟web用户一致,如果没有一致,用户上传一张图片,没有权限上传到/data目录
    [root@nfs ~]# groupadd www -g 666
    [root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin  -M
?```

###  4. 创建共享目录并授权

?```
    mkdir /data
    [root@nfs ~]# chown -R www.www /data/    #一定要和web端统一用户,不然挂载无法上传。
    [root@nfs ~]# ll /data/ -d
    drwxr-xr-x 2 www www 6 Aug 20 10:43 /data/
?```

 

### 5. 启动并设置开机自启动

2. 配置nfs客户端web01,web02

一:同样安装nfs和rpcbind,不需要启动,因为只需要nfs的命令
二:安装httpd和php 模拟web站点
yum -y install httpd php
    2.1#找到站点目录
    rpm -ql httpd
    /var/www/html
    2.2上传一个提交作业的脚本到html目录并解压并修改权限,
    chown -R www.www /var/www/html
    [root@web01 html]# ll
    total 884
    -rw-r--r-- 1 www www 147976 Mar 31 12:36 1.png
    -rw-r--r-- 1 www www 139609 Mar 31 12:36 2.png
    -rw-r--r-- 1 www www 138926 Mar 31 12:36 3.png
    -rw-r--r-- 1 www www  38772 Apr 27  2018 bg.jpg
    -rw-r--r-- 1 www www   2633 Aug 20 11:41 index.html
    -rw-r--r-- 1 www www     52 May 10  2018 info.php
    drwxr-xr-x 2 www www     27 Aug 20 11:59 upload
    -rw-r--r-- 1 www www   1245 Aug 20 11:49 upload_file.php
    2.3#修改文件上传的路径(这是一个php脚本)
    [root@web01 html]# vim upload_file.php 
    
    <?php
    
    header("Content-type:text/html;charset=utf-8");
    
    ini_set('date.timezone','Asia/Shanghai');
    
    
    //$wen="C:wampwwwlinux-54-".date("Y-m-d");
    $wen="/var/www/html/upload";   #修改路径
    $dd=date("Y-m-d");
    $pre=preg_match("/^([0-9])+_/",$_FILES['file']["name"][0]);
    $size =$_FILES['file']["size"][0];
    
    if (!is_dir($wen.'/')) {
    
      MKDIR($wen.'/', 0777);
    
    }
    
    2.4#在httpd配置文件中修改httpd服务的用户
    [root@web01 html]# vim /etc/httpd/conf/httpd.conf 
    
    
    #

# If you wish httpd to run as a different user or group, you must run

# httpd as root initially and it will switch.  

?    #

# User/Group: The name (or #number) of the user/group to run httpd as.

# It is usually good practice to create a dedicated user and group for

# running httpd, as with most system services.

?    #
?    User www   将用户改成www   否则无法上传文件
?    Group www
?    或者:
?    [root@web01?html]#?sed?-i?'/^Group/c?Group?www'?/etc/httpd/conf/httpd.conf?  将Croup开头的替换成***
?    [root@web01?html]#?sed?-i?'/^User/c?User?www'?/etc/httpd/conf/httpd.conf

?    2.5 重启服务上传一个文件测试,会发现upload会出现这个文件
?    

三:查看挂载点:showmount  需要安装nfs才有的命令

################扩展#####################
    showmount命令查询“mountd”守护进程,以显示NFS服务器加载的信息。
    -d:仅显示已被NFS客户端加载的目录;
    -e:显示NFS服务器上所有的共享目录。

# showmount -e 172.16.1.31

?    显示指定NFS服务器输出目录列表(也称为共享目录列表)
################扩展#####################
?    报错:有时showmount -e 172.16.1.31没有出现共享目录,需要在服务端重启下nfs服务

?    3.1 挂载到共享目录
?        mount -t nfs 172.16.1.31:/data /var/www/html/upload/
?        ###mount -t 指定文件类型   =  mount.nfs
?        挂在后会发现,原先upload目录下的文件都没有了,因为挂载只是提供一个入口,upload已经不是一个目录是服务端/data
?        的一个入口,因为data没有文件,所以,挂在后看不到文件,需要先做备份,将upload下的文件scp到data下面
?        [root@web01 ~]# df -h
?        Filesystem         Size  Used Avail Use% Mounted on
?        /dev/sda3           19G  1.6G   18G   9% /
?        devtmpfs           980M     0  980M   0% /dev
?        tmpfs              991M     0  991M   0% /dev/shm
?        tmpfs              991M  9.6M  981M   1% /run
?        tmpfs              991M     0  991M   0% /sys/fs/cgroup
?        /dev/sda1          197M  105M   93M  54% /boot
?        tmpfs              199M     0  199M   0% /run/user/0
?        172.16.1.31:/data   19G  1.4G   18G   8% /var/www/html/upload
?        
?        3.2:showmount -e 172.16.1.31
?        [root@web01 html]# showmount -e 172.16.1.31
?        Export list for 172.16.1.31:
?        /data 172.16.1.0/24   显示共享目录
?    
?    3.3 检测nfs是否启动成功
?        有两个重要的文件,能够解决这个疑问。/var/lib/nfs/etab、/var/lib/nfs/rmtab这两个文件就能够查看服务器上共享了什么目录,
?        到底有多少客户端挂载了共享,能查看到客户端挂载的具体信息。
?        1、etab这个文件能看到服务器上共享了哪些目录,执行哪些人可以使用,并且设定的参数为何。
?        2、rmtab这个文件就是能够查看到共享目录被挂载的情况。
?        #如果没有返回信息,说明配置有问题
?     
?     3.4 永久挂载
?         vim /etc/fstab
?         172.16.1.31:/data /var/www/html/upload nfs default 0 0 
?         C6不要永久挂载,因为是串行启动,先挂载再启动网卡,系统会卡住进不去。
?         C7可以,因为是systemd管理,是并行启动
?         
?    3.5
?        mount.nfs: Stale file handle
?        重启服务后,需要先umount再mount
四:web01和web02配置一样,这样会发现,不管用户发送图片到哪个web
都会上传到/data下面,用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储
用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了

以上是关于NFS--共享存储的主要内容,如果未能解决你的问题,请参考以下文章

linux NFS共享存储

3-NFS-共享存储

NFS共享存储

NFS共享存储服务

NFS共享存储

NFS共享存储服务