NFS服务:
小结:
1.文件系统是对一个存储设备上的数据和元数据进行组织的一种机制。
2.分区必须先格式化创建文件系统才能存放数据,不同的分区只能有一种文件系统。
3.linux下常见文件系统有ext2、ext3、ext4、zfs、xfs和Reuserfs
windows下常见文件系统NTFS、FAT32

文件系统选型简单介绍
1.SAS/SATA硬盘文件系统选择:
1)reiserfs大量小文件业务首选reiserfs.
2)xfs数据库MYSQL业务,门户案例。
3)ext4视屏下载,流媒体,数据库,小文件业务也ok.
ext2蓝汛的cache(缓存)业务CDN网站加速服务的。

常规应用
centos默认的文件系统都是比较优秀的,不会选择就默认。
xfs,reiserfs这两个文件都需要单独安装。默认不支持,维护不方便。
大并发并不是过多的磁盘的优化,而是在前端增加缓存,架构师的能力。

2.SSD固态硬盘选择文件系统也是一样

NFS介绍
1.概念描述:NFS是Network File System的缩写,主要功能是通过网络让不同的主机系统之间可以彼此共享文件或目录。
2.NFS应用场景:
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件(一般把网站用户上传的文件都放到NFS共享里)。中小型企业用的很多,大型公司或门户也有用的,大公司或门户除了用NFS还会用MFS、GFS、FASTFS,TFS等分布式文件系统。

NFS服务_第1张图片

3.NFS服务的端口问题;
因为NFS服务启动时,会随机选择端口提供服务,这样的话,客户端很难知道NFS使用哪个端口,为了解决这个问题就引出了RPC服务(远程过程调用服务,英文:Remote Procedure Call简称:RPC),NFS的RPC服务主要功能是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口号和功能对应的信息传递给请求数据的NFS客户端,从而可以确保客户端可以正常连接到服务端上,实现数据传输。
注意:在启用NFS服务时先启动RPC服务在启动NFS,类似于上班需要先打卡再上班(RPC在C5为portmap,C6rpcbind)
NFS客户端连接服务端的示意图:
NFS服务_第2张图片

配置NFS服务:
[root@server ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@ns1 ~]# uname -r
2.6.32-431.el6.x86_64
[root@server ~]# rpm -aq nfs-utils portmap rpcbind(查看nfs和rpc安装包)
[root@server ~]# yum groupinstall "NFS file server"(安装nfs服务)
[root@server ~]# yum groupinstall "rpcbind"(安装rpc)
[root@server ~]# /etc/init.d/rpcbind start(启动rpc服务)
[root@server ~]# /etc/init.d/rpcbind status(查看rpc服务的状态)
[root@server ~]# rpcinfo -p localhost(查看已知本机端口)
[root@server ~]# rpcinfo -p localhost
rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused
(上述报错说明rpc服务没启动)
chkconfig nfs on(加入开机自启动)
chkconfig rpcbind on(加入开机自启动)
chkconfig --list nfs(检查)
chkconfig --list rpcbind (检查)
[root@server ~]# /etc/init.d/nfs start(启动nfs服务)(reload重启)
[root@server ~]# ll /etc/exports(显示nfs配置文件)

[root@server ~]#vi /etc/exports
共享文件要有注释
/data ip地址子网(权限,sync写入磁盘)
例如:
[root@server ~]#vi /etc/exports
#share /data
/data 192.168.0.0/24(rw,sync)
注:sync是写入磁盘,还有个是async是将数据写入内存中,写入内存比写入磁盘速度快,但容易丢数据。
[root@server ~]#showmount -e localhost(服务端本机检查是否共享)
Export list for localhost:
/data 192.168.0.0/24
root@server ~]# cat /var/lib/nfs/etab
/data 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
注:anonuid=65534,anongid=65534,为NFS默认用户nfsnobody.
[root@server ~]# grep 65534 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin默认用户nfsnobody.
NFS客户端配置:
[root@client ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@client ~]# uname -r
2.6.32-431.el6.x86_64
[root@client ~]# rpm -qa rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
[root@client ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
[root@client ~]# chkconfig rpcbind on
[root@server ~]#showmount -e +服务端ip地址(服务部端检查完,检查客户端是否可以共享)
例如:
[root@client ~]# showmount -e 192.168.0.50
Export list for 192.168.0.50:
/data 192.168.0.0/24
[root@server ~]#mount -t nfs 服务ip:目录 /mnt(挂载到客户端的mnt上)
例如:
[root@client ~]# mount -t nfs 192.168.0.50:data /mnt
[root@client ~]# ls /mnt
a.txt
[root@client ~]# mount -t nfs 192.168.0.50/data /mnt
mount.nfs: remote share not in 'host:dir' format(注意格式,ip地址后面共享目录用:隔开,用/会报错并提示'host:dir'
注意:当服务端共享目录没有授权其他用户有可写权或更改属主时,即使共享权限可写,也无法写入或删除内容。
例如下面:会提示权限不够
[root@client ~]# rm -f /mnt/a.txt
rm: cannot remove /mnt/a.txt': Permission denied
[root@client ~]# touch /mnt/b.txt
touch: cannot touch
/mnt/b.txt': Permission denied
当在服务端给共享目录授权后或更改属主(默认nfs写入用户为nfsnobody)
例如:将不会提示权限问题
[root@client ~]# rm -f /mnt/a.txt
[root@client ~]# ls /mnt
[root@client ~]#
[root@client ~]# touch /mnt/b.txt
[root@client ~]# ls /mnt
b.txt
排故思路;
一般nfs客户端无法连接服务端时,可能是防火墙的问题,可用ping命令和telnet命令测试网络连通性。
NFS配置文件路径:
/etc/exports:NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容为空。以单行位。
vi /etc/exports
共享文件要有注释
/data ip地址子网(权限,sync写入磁盘)

/usr/sbin/exportfs:NFS服务的管理命令。
/etc/init.d/nfs reload=====exportfs -rv
(exportfs命令不但可以加载配置生效,也可以通过命令直接共享目录。越过/etc/exports,但重启服务失效。)
/usr/sbin/showmount:常用来再客户端,查看NFS配置及挂载结果的命令
(配置nfsserver,分别再服务端以及客户端查看挂载情况,重点一定要查看。)
/var/lib/nfs/etab:NFS配置文件的完整参数设定的文件。
(rw:可写,ro:只读)
/var/lib/nfs/xtab:在C5中记录有哪些用户挂载了NFS目录信息,包括IP地址,但是C6成了空文件失效了。
NFS及RPC服务相关进程的介绍
[root@ns1 ~]# ps -ef|egrep "nfs|rpc"
rpc 1027 1 0 14:14 ? 00:00:00 rpcbind C6.5的rpc服务,c5中是portmap
rpcuser 1045 1 0 14:14 ? 00:00:00 rpc.statd 检测文件一致性
root 1414 2 0 14:20 ? 00:00:00 [rpciod/0]
root 1422 1 0 14:20 ? 00:00:00 rpc.rquotad 磁盘配额进程
root 1426 1 0 14:20 ? 00:00:00 rpc.mountd 权限管理进程
root 1432 2 0 14:20 ? 00:00:00 [nfsd4]
root 1433 2 0 14:20 ? 00:00:00 [nfsd4_callbacks]
root 1434 2 0 14:20 ? 00:00:00 [nfsd] NFS主进程
root 1435 2 0 14:20 ? 00:00:00 [nfsd]
root 1436 2 0 14:20 ? 00:00:00 [nfsd]
root 1437 2 0 14:20 ? 00:00:00 [nfsd]
root 1438 2 0 14:20 ? 00:00:00 [nfsd]
root 1439 2 0 14:20 ? 00:00:00 [nfsd]
root 1440 2 0 14:20 ? 00:00:00 [nfsd]
root 1441 2 0 14:20 ? 00:00:00 [nfsd]
root 1464 1 0 14:20 ? 00:00:00 rpc.idmapd
root 1545 1362 0 14:50 pts/0 00:00:00 egrep nfs|rpc
具体的进程作用可用man命令查看

配NFS生产重要技巧:
1.确保所有服务器对NFS共享目录具备相同的权限。
a.all_squash把所有客户端都压缩成匿名用户。
B.就是把anonuid,anongid指定的UID和GID的用户。
2.所有的客户端和服务端都需要有一个相同的UID和GID的用户,即客户端nfsnobody(UID必须相同)。

NFS在C5中默认用户并非是65534,所以在部署时要查看系统有没有服务器中的默认用户,一定要统一用户。
避免方法:

  1. 统一创建新的用户,在服务端匿名用户改为指定用户。
  2. 统一查看有没有UID为65534用户,没有则创建。
    当NFS服务出现故障时,排故思路:
    1) 查看服务端,服务开启的顺序是否正确,先开启RPC服务,再开NFS服务,查看RPC服务中,是否有NFS服务的端口。
    2) 服务端和客户端都要开启RPC服务,客户端只要开启RPC服务就可以了。
    3) 当客户端无法挂载服务端目录时,在ping下服务端地址,如果ping通则在telnet下地址加端口号,例如:
    先看是否可以ping同,若ping不同,则表示网络不通,看服务端防火墙和selinux是否开启了。
    Last login: Sun Dec 17 10:46:06 2017 from desktop-rtg9bmp.w.mifi
    [root@xuexi ~]# ping 192.168.0.50
    PING 192.168.0.50 (192.168.0.50) 56(84) bytes of data.
    64 bytes from 192.168.0.50: icmp_seq=1 ttl=64 time=0.557 ms
    64 bytes from 192.168.0.50: icmp_seq=2 ttl=64 time=0.219 ms
    ^C
    --- 192.168.0.50 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, ti
    Ping通了,测试端口,用telnet:
    [root@xuexi ~]# telnet 192.168.0.50 111
    Trying 192.168.0.50...
    Connected to 192.168.0.50.
    Escape character is '^]'.(表明没有问题)
    [root@xuexi ~]# telnet 192.168.0.50 111
    Trying 192.168.0.50...
    telnet: connect to address 192.168.0.50: No route to host(表明端口有问题,可能服务没起或者是防火墙或者selinux导致的,No route to host:一般是防火墙开启了)。
    客户端挂载:
    挂载格式:
    Mount -t(指定挂载类型)nfs 服务端ip地址:(分号隔开)共享目录 本地挂载点;例如
    Mount -t nfs 192.168.0.50:/data /mnt
    注意:客户端在挂载前先showmount -e 192.168.0.50,先shoumount看一下能否看到共享目录,若看不到则服务端有问题。)
    NFS客户端挂载在/mnt下是零时的关机重启就会失效:
    解决方案:
    /bin/mount -t nfs IP地址:/data/ /mnt把挂在的命令放在/etc/rc.local里(命令尽量全路径)
    配置monunt挂在命令使开机自启动:
    a、/etc/rc.local里
    优点:不会影响系统的启动,即使NFS服务没起,它只是开机不会挂载而已,但不会影响系统启动。
    缺点:偶尔会开机挂在不上,工作中除了开机自启动配置,还要对挂载点监控。
    b、/etc/fstab里
    注:NFS网络文件系统不要放到fstab里。
    原因:1.fstab优先于网络启动。此时还没连接上nfs服务器。
    2.即使是本地文件系统,也要注意,fstab最后两行,要设置0 0。否则会导致无法启动服务器的问题。

企业生产环境中NFS客户端挂载建议:
1.把NFS rpc服务的启动命令和挂载命令均放在/etc/rc.local下,然后通过nagios监控软件监控开机后的挂载情况。
vi /etc/rc.local
#rpc bind by oldboy
/etc/init.d/rpcbind start
/bin/mount -t 192.168.116.128:/data/ /mnt
NFS服务端开机自启:
vi /etc/rc.local
#rpc bind by oldboy
/etc/init.d/rpcbind start
/etc/init.d/nfs start
经验:为什么要把所有开机自启动服务放到rc.local呢,为了规范,统一开机自启动位置。
相当于把/etc/rc.local当做服务器的档案。所有服务器启动配置文件都放在档案里,做好注释。或者写好配置启动脚本都用chkconfig管理。

查看客户端挂载的参数命令:
[root@xuexi ~]# grep mnt /proc/mounts
192.168.116.128:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.116.129,minorversion=0,local_lock=none,addr=192.168.116.128 0 0

mount -o后面的参数:
1.async:写入内存,一般不推荐使用,在高并发的服务中对数据可靠性不要求的场合中应用
2.defaults:默认的里面包括(rw,suid,dev,exec,auto,nouser,and async)
3.noatime;优化的选项不更新文件系统上inode访问时间,高并发环境推荐使用。
4.nodiratime:优化选项不更新文件系统上directory inode访问时间,高并发环境推荐使用。
5.auto:相当于-a选项,要不要被自动挂载。
6.noauto:不会被自动挂载。
7.remount:重新挂载。
8.ro:只读挂载
9:rw:可读可写挂载。
10.sync:挂载目录写入磁盘。
案例:文件系统出现只读故障:
原因:1.rsync 的bug。2.文件系统内部的一致性3.fstab修改错误导致系统无法启动故障。
解决方法:
mount -o rw,remount /

生产场景NFS共享储存优化小结:
1.硬件;sas/aad磁盘,买多块,raid0/raid10.网卡好。
2.服务器端:/data 192.168.116.128/24(rw,async,all_squash,anonuid=555,anongid=555
3.客户端挂载:rsize,wsize,noatime,nodiratime,nosuid,noexec,soft(hard,intr)
C6.5mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.0.50:/data /mnt
(最好加上rsize,wsize,因为每个机器的默认不一样,为了读写快,最好手动指定一下。)
查看客户端挂载默认参数:cat /proc/mounts
客户端挂载时使用这两个参数的任意一个Soft或(hard,intr),可以时客户端和服务端的耦合度不会过高,耦合度过高时对客户端影响很大,生产环境中,还是希望耦合度不用太高。
优化时可以把rsize,wsize,调大些,可以让读的数据和写的数据可以更多,C5分别只有1024所以要做优化,而C6中,是131072,所以可以不用优化。
3.内核优化:
永久生效:
Cat >>/etc/sysctl.conf<net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.wmem_max=16777216
net.core.rmem_max=16777216
EOF

Exportfs命令:
共享:exportfs -o 参数 客户端地址或网段:共享目录(零时的,重启失效)
加载生效:exportfs -rv
Rpcinfo常用-p,rpcinfo -p IP地址,查看rpc服务中是否有nfs端口。
NFS相关知识小结:

  1. 涉及到命令:mount(-t,-o,-a),umount(-l,-f),exportfs(-rv,-o),showmonut(-e),rpcinfo(-p),ping(-c,-t),telnet.
  2. 涉及到的配置文件:/etc/fstab, /etc/exports, /var/lib/nfs/etab, /proc/mounts, /etc/mtab
    NFS的作用:NFS服务可以让不同的客户端挂载使用同一个目录,作为共享存储使用,这样可以保证不同节点客户端数据一致性,在集群架构中会经常使用。
    NFS的优点:
    1.简单:容易上手,容易掌握,数据是在文件系统之上。
    2.方便:部署快速,维护简单。
    3.可靠:从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。
    4.稳定:依赖操作系统。
    NFS的局限性:
    1.局限性是存在单点故障,如果nfs server宕机了所有客户端都访问不到共享目录。后期可以通过负载均衡及高可用方案弥补。
    2.在高并发的场合,NFS效率\性能有限(一般几千万以下PV的网站不是瓶颈,除非网站架构太差,2千万PV/日)。
    3.客户端认证事基于ip和主机名的,安全性一般(用于内网则问题不大)。
    4.NFS数据是明文的,对数据完整性不作验证。
    5.多台客户端挂载NFS服务器时,连接管理维护麻烦。尤其NFS服务端出问题后,所有NF客户端都挂掉状态(测试环境中可使用autofs自动挂载解决耦合度太高,但是大并发时,它会零时挂载,这样会出现问题)。
    耦合度太高==》解耦,网站扩展性才能更好。