NFS服务部署
详情 | |
---|---|
操作系统 | Centos 6.8 x86_64 |
服务情况 | 关闭iptables和Selinux |
NFS(Network File System),功能同Windows下的磁盘映射,通过网络为其他服务器提供文件读取和存储服务。
- 数据备份
- 多客户端数据共享读取、写入
- 客户端通过mount命令访问要挂载的服务器
- NFS服务的rpcbind服务告知客户端NFS端口
- 客户端挂载NFS服务
NFS服务依赖rpcbind服务(rpcbind是Centos6.x之后的名字,Centos5.x叫portmap)
rpcbind服务要优先于NFS服务启动,否则无法注册端口
客户端也依赖NFS服务(不安装会报错)
主机名 | 角色 |
---|---|
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
- 安装方式 1
yum install nfs-utils rpcbind
- 安装方式 2
yum groupinstall "NFS file server"
- 安装方式 3
光盘安装
同NFS Server
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
安全参数
-
压缩权限到普通用户: 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
安全参数
参数 | 作用 |
---|---|
noexec | 不允许执行二进制文件 |
nosuid | 不允许设置SUID |
性能参数
参数 | 作用 |
---|---|
noatime | 不更改文件的访问时间 |
nodiratime | 不更改目录的访问时间 |
nodev | 不解析文件系统中的字符设备或块设备 |
mount -t nfs -o nodiratime,noatime,nodev,noexec,nosuid 192.168.0.238:/data /nfsdir/
内核读写缓冲区配置
略
- 单点故障
- 大并发下性能有限
- 安全性一般(基于IP和主机名)
- 和客户端强耦合(服务端挂了,客户端会HANG住)
备份角色
NFS + rsync + inotify
高可用性
NFS + heartbeat + DRBD
性能瓶颈
拆分业务
上分布式存储
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