NFS部署

NFS服务部署

  详情
操作系统 Centos 6.8 x86_64
服务情况 关闭iptables和Selinux

1.功能和适用场景

NFS(Network File System),功能同Windows下的磁盘映射,通过网络为其他服务器提供文件读取和存储服务。

适用场景

  • 数据备份
  • 多客户端数据共享读取、写入

2.原理

  1. 客户端通过mount命令访问要挂载的服务器
  2. NFS服务的rpcbind服务告知客户端NFS端口
  3. 客户端挂载NFS服务

NFS服务依赖rpcbind服务(rpcbind是Centos6.x之后的名字,Centos5.x叫portmap)
rpcbind服务要优先于NFS服务启动,否则无法注册端口
客户端也依赖NFS服务(不安装会报错)

3.部署架构

主机情况

主机名 角色
test.v.nfs.192.168.0.238 NFS Serve(Master)
test.v.nfs.192.168.0.239 NFS Server(Backup)
test.v.web.192.168.0.233 Nginx+Tomcat(Client)
test.v.web.192.168.0.229 Nginx+Tomcat(Client)

目录初始化

目录位置 作用
/app 应用部署位置
/app/scripts 脚本存放位置
/app/logs 日志存放位置
/data 数据存放位置
/data/bakcup 数据本地备份
/remotebakcup 远端备份目录

服务端

mkdir /app /app/scripts /app/logs /data /data/backup -p

客户端

mkdir /app /app/scripts /app/logs /data /data/backup -p
mkdir /remotebackup

3.安装

NFS Server安装

  • 安装方式 1
yum install nfs-utils rpcbind

  • 安装方式 2
yum groupinstall "NFS file server"

  • 安装方式 3
光盘安装

NFS Client安装

同NFS Server

4.配置

配置开机启动

echo "/etc/init.d/rpcbind start" >> /etc/rc.local
echo "/etc/init.d/nfs start" >> /etc/rc.local

发布目录

echo "/data    192.168.0.0/24(rw,sync)" >> /etc/export
/etc/nfs reload

客户端挂载

mount -t nfs 192.168.0.238:/data /remotebackup

5.参数优化

NFS Server 优化

安全参数

  • 压缩权限到普通用户: all_squash

    备注:Centos 6.x会统一建议相同UID/GID的NFS用户65534;Centos 5.x 需要人工为NFS创建统一的UID/GID

  • 同步写入磁盘:sync(如果raid卡有bbu,是不是可以使用async呢?)

    备注:默认参数,可以不加;异步可提升性能

echo "/data    192.168.0.0/24(rw,all_squash)" >> /etc/export

mount 挂载优化

安全参数

参数 作用
noexec 不允许执行二进制文件
nosuid 不允许设置SUID

性能参数

参数 作用
noatime 不更改文件的访问时间
nodiratime 不更改目录的访问时间
nodev 不解析文件系统中的字符设备或块设备
mount -t nfs -o nodiratime,noatime,nodev,noexec,nosuid 192.168.0.238:/data /nfsdir/

内核优化

内核读写缓冲区配置

6.坑有哪些

  • 单点故障
  • 大并发下性能有限
  • 安全性一般(基于IP和主机名)
  • 和客户端强耦合(服务端挂了,客户端会HANG住)

7.解决方案

备份角色

NFS + rsync + inotify

高可用性

NFS + heartbeat + DRBD

性能瓶颈

拆分业务
上分布式存储

9.总结

NFS使用非常普遍,使用中需要注意服务端的nfs和rpcbind的启动顺序,客户端挂载主要权衡安全和性能参数,保证业务的前提下,尽量安全。

 

 

客户端NFS备份脚本

#!/bin/sh
#Author:BrandynX
#Date:2017-03-27
#Remark: File bakcup to NFS

#Declare the time variable
NFS_SAVEDAYS="7"
LOCAL_SAVEDAYS="1"
TODAY=`date +%Y%m%d`
LOCAL_BACKUPDIR_DAY=`date -d "-$LOCAL_SAVEDAYS days" +%Y%m%d`
NFS_BACKUPDIR_DAY=`date -d "-$NFS_SAVEDAYS days " +%Y%m%d`
LOCAL_DIR=/data/backup
REMORT_DIR=/nfsdir/bois
BOIS_DIR=/data/bois
MONITOR_DIR=/usr/share/monitor
MSHOW_DIR=/usr/share/monitorshow
LOG_DIR=/app/scripts
APACHE_DIR=/etc/httpd
LOGSERVER_DIR=/data/syslogserver

#Loacl backup file processing
#Create today bakcupdir and backup
if [ ! -d $TODAY ];then
        mkdir -p $LOCAL_DIR/$TODAY

        #copy the file to local backupdir
        cp -a  $BOIS_DIR $LOCAL_DIR/$TODAY
        cp -a  $MONITOR_DIR $LOCAL_DIR/$TODAY
        cp -a  $MSHOW_DIR $LOCAL_DIR/$TODAY
        cp -a  $APACHE_DIR $LOCAL_DIR/$TODAY
        cp -a  $LOGSERVER_DIR $LOCAL_DIR/$TODAY
        cd $LOCAL_DIR
        tar czf  $LOCAL_DIR/$TODAY-bois.tar.gz $TODAY

        echo "Bois $TODAY local bakcup is complete." >>$LOG_DIR/scripts.log
fi

#Synchornize file to NFS
#To determine whether there is a bakcup
if [ -f $REMORT_DIR/$TODAY-bois.tar.gz ];then
        echo "NFS already exists in $TODAY backup file."
        exit

else 
        cp $LOCAL_DIR/$TODAY-bois.tar.gz $REMORT_DIR
        echo "Bois $TODAY nfs bakcup is complete." >>$LOG_DIR/scripts.log
fi



#Delete local backup
if [ -d $LOCAL_DIR/$LOCAL_BACKUPDIR_DAY  ];then
        rm -rf $LOCAL_DIR/$LOCAL_BACKUPDIR_DAY
        rm -f $LOCAL_DIR/$LOCAL_BACKUPDIR_DAY-bois.tar.gz

        echo "Bois $LOCAL_BACKUPDIR_DAY locat backup is delete. " >> $LOG_DIR/scripts.log
fi

#Delete nfs backup
        rm -f $REMORT_DIR/$NFS_BACKUPDIR_DAY-bois.tar.gz
        echo "Bois $NFS_BACKUPDIR_DAY  nfs backup is delete. " >> $LOG_DIR/scripts.log

 

上一篇:常用的WINAPI函数


下一篇:适配器模式