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