综合架构_存储服务nfs

1.架构存储服务概念

NFS:全程 network file system 网络文件系统,通过网络存储和组织文件的一种方法或机制!

存储服务作用说明

 a.实现数据统一共享存储

  前端所有的应用服务器接收到的用户上传的图片,文件,视频,都会统一的放到后端的存储上!

 b.节省磁盘存储运营成本

存储服务种类简介!

NFS: 网络文件系统(网络共享文件系统)

  单点存储,适合中小型企业! 

     【注】阿里云服务的NAS服务

FTP: 网络共享存储(文件存储协议) 过于复杂

samba: 网络共享存储(实现window访问Linux文件系统)过于复杂

Mfs /fastdfs /GlusterFS:  分布式文件系统 --->适合大型企业

 web01(10G)                                存储服务器01  3G
 web02(10G)   --->   存储管理端   存储服务器02  3G
 web03(10G)                                 存储服务器03  4G
 ...                     raid卡        磁盘

大型存储厂商:EMC Netapp

硬件存储:稳定,双主机头 几十块硬盘 RAID10  --->适合传统企业

 NFS工作过程:

   

NFS工作原理:

Rpc.nfsd: 它是基本的NFS守护进程,主要功能是管理客户端能否登录服务器
Rpc.mount:主要功能是管理NFS的文件系统,当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务提供的文件前,还必须通过文件使用权限的验证
Portmap:  主要功能是进行端口映射工作
1,用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的当时传递给NFS服务端
3.NFS服务段接收请求后,会先调用portmap进程进行端口映射
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端
5.Rpc.mount判断客户端是否有对应的权限进行验证
6.idmap 进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地识别的命令,传递至内核,由内核驱动硬件

ps:rpc是一个远程过程调用,那么使用nfs必须有rpc服务

  在启动NFS服务的时候,会同时启动很多的端口!因为NFS功能,需要很多的服务,每个服务就是一个端口,并且会经常的变化!

那么如何让客户端找到这些端口呢? 这个时候就需要一个经纪人(RPC服务!)

NFS服务:

1,RPC服务(对外固定端口111)

2,NFS服务(有很多进程和端口 固定端口是2049)

3,将端口注册给RPC端口 

架构存储服务部署

服务端部署

第一步:安装软件程序

yum install -y rpcbind nfs-utils

nfs-until: nfs存储服务软件包 包含rpc.nfsd. rpc.mountd 和相关文档!
rpcbind: 远程调用中介软件 (默认已经安装上了!)

RPC:远程过程调用程序(中介)

第二步:编写配置文件

[root@nfs01 ~]# man exports
       # sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash) ---->添加两个域名
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)  --->域名
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
       /pub            *(ro,insecure,all_squash)
       /srv/www        -sync,rw server @trusted @external(ro)
       /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
       /build          buildhost[0-9].local.domain(rw)

  

vim /etc/exports

/projects         proj*.local.domain(rw,rsync)

①(共享的目录)②(访问的主机)  ③(权限)

1)定义一个存储数据目录  /data

2)定义允许储存数据主机或者网段或者域名信息 172.16.1.0/24

3)存储数据参数信息(权限)

 /data01   172.16.1.7(rw,sync)  -->单个主机
 /data02   172.16.1.0/24(rw)     -->网段
 /data03   backup(rw)            --->域名 (查看/etc/hosts)

#NFS共享目录会记录至/var/lib/nfs/etab,如果该目录不存在共享信息,请检查/etc/exports 是否配置错误

[root@nfs01 scripts]# cat /var/lib/nfs/etab 
/data    172.16.1.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,rw,secure,root_squash,no_all_squash)

架构存储服务配置 参数

rw              -- 存储目录可以读取数据可以存储数据

ro              -- 存储目录只能读取数据

sync            --  同步传输数据信息  数据存储--> 磁盘中 ***** 安全

async        --  异步传输数据信息  数据存储-->内存中-->磁盘中 快速

all_squash       --  所有普通用户都要进行用户身份转换(nfsnobody)  *****

no_all_squash    --  所有普通用户不要进行用户身份转换(原来是啥就是啥)

root_squash      --- root用户需要进行用户身份转换(nfsnobody)

no_root_squash   --   root用户不要进行用户身份转换(转换为还是root)


anonuid ---- 指定默认映射转换用户身份为什么用户(uid数值) ***
anongid ---- 指定默认映射转换用户组身份为什么用户组(gid数值)*** all_squash操作演示: [oldboy@web01 www]$ touch oldboy.txt [oldboy@web01 www]$ ll total 0 -rw-rw-r-- 1 nfsnobody nfsnobody 0 Oct 24 18:18 oldboy.txt no_all_squash操作演示: [oldboy@web01 www]$ touch oldboy02.txt [oldboy@web01 www]$ ll total 0 -rw-rw-r-- 1 oldboy oldboy 0 Oct 24 18:21 oldboy02.txt -rw-rw-r-- 1 nfsnobody nfsnobody 0 Oct 24 18:18 oldboy.txt root_squash操作演示: [root@web01 www]# touch root.txt [root@web01 www]# ll total 0 -rw-rw-r-- 1 oldboy oldboy 0 Oct 24 18:21 oldboy02.txt -rw-rw-r-- 1 nfsnobody nfsnobody 0 Oct 24 18:18 oldboy.txt -rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 24 18:27 root.txt no_root_squash操作演示: [root@web01 www]# touch root02.txt [root@web01 www]# ll total 0 -rw-rw-r-- 1 oldboy oldboy 0 Oct 24 18:21 oldboy02.txt -rw-rw-r-- 1 nfsnobody nfsnobody 0 Oct 24 18:18 oldboy.txt -rw-r--r-- 1 root root 0 Oct 24 18:29 root02.txt -rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 24 18:27 root.txt

如何配置squash参数:~~~~~~~

 root_squash no_all_squash

服务端的完整挂载参数

第三个历程: 创建存储目录

mkdir /data{01..03} -p

chown -R nfsnobody.nfsnobody /data{01..03}

[-R 递归设置权限,针对目录有效]

第四个历程: 加入开机自启 并 启动服务程序

ps:在使用NFS服务进行文件共享之前,需要使用RPC(远程过程调用服务)将NFS服务器的IP地址和端口号信息发送给客户端.因此,在启动NFS之前.需要现重启并启用rpcbind服务程序,同时都加入开机自启动

systemctl enable  rpcbind nfs-server
systemctl start rpcbind nds-server

systemctl reload nfs  ===> exportfs -r
【注:生产场景必须实现平滑重启】

客户端部署:

第一个历程: 安装软件程序

yum install -y rpcbind nfs-server

第二个历程:仅启动rpcbind

systemctl start rpcbind
systemctl enable rpcbind

第三个历程:检测

[root@backup nfs]# netstat -lntup|grep rpcbind
udp        0      0 0.0.0.0:875             0.0.0.0:*                           9186/rpcbind        
udp6       0      0 :::875                  :::*                                9186/rpcbind

第四个历程:查看NFS服务器提供的共享目录

[root@backup nfs]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

【常见错误】:umount.nfs:/nfsdir:dir is busy 

  1.nt_create:RPC:Program not registered
            程序   没有  注册
   0ipcinfo -p 172.16.1.31 查看是否注册

2,umount /nfsdir ==> "umount.nfs:/nfsdir:dir is busy"
1)切换至其他目录,然后再进行卸载
2) NFS.server宕机.强制卸载umount -lf /nfsdir

第五个历程: 挂载存储设备

mount -t nfs 172.16.1.31:/data /nfs

第六个历程: 持续共享,写入fstab文件 

vim /etc/fstab
172.16.1.31:data         /nfsdir       nfs     default    0  0

存储服务存储原理

简单原理过程:
1) 客户端向服务器存储数据
2) 服务端会识别服务器地址    
3) 客户端将数据存储之前会进行用户身份转换
    转变为一个默认nfsnobody 
4) 将目录属主权限改为nfsnobody
5) 客户端可以进入挂载点目录存储数据

4.架构存储挂载说明

-o sort  有超时时间

-o hard  会一直发起挂载信息

[root@backup ~]# tail -1 /proc/mounts 
172.16.1.31:/data /nfs nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,
timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.41,local_lock=none,addr=172.16.1.31 0 0

 

NFS系统应用的优缺点:

优:

1.简单,容易上手,容易掌握

2.NFS文件系统内数据是在文件系统之上的,即数据是看得见的

  分布式文件系统 是看不见文件的。相当于黑盒,提供接口。文件是放在软件里面的,软件来进行存储。我们只能通过软件的接口来获取文件,软件宕机的话,数据就无法获得。

3.部署快速,维护简单方便,且可控,满足需求的就是最好的

4.可靠,从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的

5.服务非常稳定

缺:

1.存在单点故障,如果NFS Server宕机了。所有客户端都不能访问共享目录。不过可以通过负载均衡及高可用方案弥补

2.在大数据高并发的场合,NFS效率,性能有限(2千万/日 以下PV的网站不是瓶颈,除非网站架构设计太差)

3.客户端认证是基于IP和主机名的,权限要根据ID识别,安全性一般(用于内网则问题不大)

4.NFS数据是明文的,NFS本身不对数据完整性做验证

5.多台客户机器挂载一个NFS服务器时,连接管理维护麻烦(耦合度高),尤其NFS服务端出问题后,所有NFS客户端都处于挂掉状态(测试环境可用autofs自动挂载解决,正式环境可修复NFS服务或强制卸载)

6.涉及了同步(实时等待)和异步(解耦)的概念,NFS服务端和客户端相对来说就是耦合度有些高,网站程序一样,尽量不要 耦合度太高,系统及程序架构师的重要职责就是为程序及架构解耦,让网站的扩展性变得更好!

 

存储优化

rsize  ---读取内存空间大小

wsize ---设置存储空间大小

remount --重新挂载/设置参数信息

如何进行卸载

umount -lf  /mnt --强制卸载

-l lazy umount :懒惰卸载

-f  force      :强制卸载

注:/etc/fstab:

defaults:这是fstab里面的默认值:包括 rw ,suid, dev, exec, auto, nouser, async


挂载优化(mount参数)本地和网络文件系统都适用

noexec :      在挂载的文件系统中不允许直接执行任何二进制的程序!仅对二进制程序有效

noatime:     不更新文件的inode时间戳!在高并发环境下 推荐应用! 可以提高I/O性能

nodiratime:  不更新文件系统上 dierctory inode 时间戳,适用于高并发环境!提高系统I/O性能!

remount   :  尝试重新挂载一个已经挂载了的文件系统!

文件系统只读故障:或者 fstab损坏怎么修复?

1.救援模式修复。

2.单用户模式(会将 / 隐藏起来), mount -o remount,rw /

NFS服务器出问题的时候,客户端依然能够启动的方式:

defaults,soft

defaults,hard,intr


建议挂载:

mount -t nfs -o fg,hard,intr,rsize=131072,wsize=131072 172.16.1.31:/data  /mnt

安全+优化的挂载方式:

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data  /mnt


网络自动挂载原理:

第一个历程: 系统启动开机自检
第二个历程: 加载系统挂载文件  /etc/fstab   无法实现网络挂载
第三个历程: 启动系统服务程序  network     remote-fs.target(centos7)  netfs(centos6)

[root@backup ~]# systemctl list-unit-files|grep remote
remote-cryptsetup.target                      disabled
remote-fs-pre.target                          static  
remote-fs.target                              enabled 
[root@backup ~]# systemctl status remote-fs.target 
● remote-fs.target - Remote File Systems
   Loaded: loaded (/usr/lib/systemd/system/remote-fs.target; enabled; vendor preset: enabled)
   Active: active since 五 2019-10-25 22:54:25 CST; 2min 49s ago
     Docs: man:systemd.special(7)

10月 25 22:54:25 backup systemd[1]: Stopped target Remote File Systems.
10月 25 22:54:25 backup systemd[1]: Stopping Remote File Systems.
10月 25 22:54:25 backup systemd[1]: Reached target Remote File Systems.

第四个历程: 特殊服务重新加载  /etc/fstab   实现网络挂载

练习题:
	服务端:
	/data01/w   10.0.0.41主机挂载(可读可写,数据同步传输,所有用户都进行身份转换)
	/data01/r   172.16.1.0网段主机挂载(只读权限,数据异步传输,所有用户不要进行转换)
	客户端:
	backup      挂载/data01/w存储目录   /w
	web01       挂载/data01/r存储目录   /r
	
	第一个历程: 编写服务端配置文件
	/data01/w 10.0.0.41(rw,sync,all_squash)
      /data01/r 172.16.1.0/24(ro,async,no_all_squash)
	
	第二个历程: 创建存储目录
	mkdir /data01/{r,w} -p
	chown nfsnobody.nfsnobody /data01/{r,w}
	
	第三个历程: 重启服务程序
	systemctl reload nfs
	
	第四个历程: 进行存储挂载操作
	backup服务器
	mkdir /w -p
	mount -t nfs  10.0.0.31:/data01/w  /w
	
	web01服务器
	mkdir /r -p
	mount -t nfs  172.16.1.31:/data01/r  /r
	说明: NFS存储服务规划目录存储结构时, 尽量不要有父级目录和子级目录关系

存储服务挂载相关命令

rpcinfo             --- 查看nfs服务是否进行注册
rpcinfo -p localhost/172.16.1.31
showmount           --- 查看nfs服务存在哪些可以挂载目录
showmount -e localhost/172.16.1.31
exportfs            --- 临时创建存储目录/ nfs服务平滑重启
exportfs -rv        --- 重新加载
exportfs -o rw,sync,all_squash 172.16.1.0/24:/data100

/var/lib/nfs/etab --- 存储服务默认配置记录文件(日志文件) /etc/exports --- 存储服务配置文件 /proc/mounts --- 存储客户端默认挂载参数信息

存储服务权限问题和什么有关

1) 存储服务配置文件参数
2) 存储服务目录权限有关  755
3) 存储服务目录权限继承 
4) 存储客户端挂载参数 

企业生产场景NFS共享存储优化小节

1.硬件:sas/ssd 磁盘。买多块,硬件raid。制作raid5 或raid10。网卡的吞吐量要大。至少千兆(多块网卡bond)。

 2.NFS服务端的配置:/data 172.16.1.0/24(rw, sync, all_squqsh,anonuid=65534,anongid=65534)

 3.NFS客户端挂载优化命令:

安全+优化

mount -t nfs -o nusuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data  /mnt

 4. 对NFS服务的所有服务器内核进行优化,执行如下命令:

[root@nfs01 ~]# cat >> /etc/sysctl.conf <<EOF
> net.core.wmen_default=8388608
> net.core.rmen_default=8388608
> net.core.rmen_max=16777216
> net.core.wmen_max=16777216
> EOF

systl -p  生效

5.大型网站NFS网络文件系统的替代软件为分布式文件系统 Moosefs(mfs), GlusterFS, FastDFS   

6. 阿里云对应的存储服务NAS服务,还有OSS服务!

NFS性能差?

  我们公司业务量不大,并且,我们前面有CND缓存支持,90%以上的业务,视频,图片 都放置在CND里面!那么NFS的压力就会小很多,我们希望用简单的软件来解决问题。(简单,高效, 安全)。如果咱们公司的业务量访问很大,并且前段用CND,撑不住了,NFS也撑不住了,那么我们就可以考虑用分布式缓存! 不过我之前测试过,我们公司确实用不到!

CDN:分布式缓存服务(网站加速服务)

web前端 还会加一层缓存  8%左右 流到 NFS的流量也就2%左右!


应用建议:

  大中小型网站(参考点2000万/日PV以下)线上应用,都有用武之地。门户站也会有应用,生产场景应该多把数据的访问往前推,即尽量把静态存储的资源通过CDN或缓存服务器提供,如果没有缓存服务或者架构不好,存储服务器数量再多也是扛不住压力的,而且用户体验会很差!


解决NFS性能问题:

1.使用CDN加速以及自己搭建文件缓存服务(squid,nginx,varnish)

2.把多个目录分配到不同的NFS服务器上 --目录切割

3.弃用NFS

4.使用分布式文件系统

利用软件实现同步(sersync ==> inotify + rsync)

 

第一个历程: 软件安装部署(二进制包)

下载软件二进制包: https://github.com/wsgzao/sersync
    unzip sersync_installdir_64bit.zip
    mv sersync/ /usr/local/

第二个历程: 编写配置文件

cd /usr/local/sersync/conf
vim confxml.xml

    开启调试模式
    <debug start="true"/>

    指定排除数据信息, 不进行实时同步
    <filter start="false">
        <exclude expression="(.*).svn"></exclude>
        <exclude expression="(.*).gz"></exclude>
        <exclude expression="^info/*"></exclude>
        <exclude expression="^static/*"></exclude>
    </filter>
    指定inotify程序监控事件信息
    <inotify>
        <delete start="true"/>
        <createFolder start="true"/>
        <createFile start="false"/>
        <closeWrite start="true"/>
        <moveFrom start="true"/>
        <moveTo start="true"/>
        <attrib start="false"/>
        <modify start="false"/>
    </inotify>

    <localpath watch="/data">
            <remote ip="172.16.1.41" name="backup"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
    <rsync>
        <commonParams params="-az"/>
        <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->

第三个历程: 启动服务程序

#添加执行权限
chmod +x /usr/local/sersync/bin/sersync vim /etc/profile #添加环境变量
export PATH
="$PATH:/usr/local/sersync/bin/" #启动服务
sersync
-dro /usr/local/sersync/conf/confxml.xml

#设置开机自启动
vim /etc/rc.loal

sersync -dro /usr/local/sersync/conf/confxml.xml
原文地址:https://www.cnblogs.com/zhanghongqi/p/11732316.html