NFS共享存储 环境准备
主机名
WanIP
LanIP
角色
web01
10.0.0.7
172.16.1.7
网站服务(nfs客户端)
web02
10.0.0.8
172.16.1.8
网站服务(nfs客户端)
nfs
10.0.0.31
172.16.1.31
共享存储(nfs服务端)
NFS概述 NFS(Network File System)
通过网络来做文件存储
NFS
用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS
,glusterfs
,HDFS
为什么使用共享存储?
实现多台服务器之间数据共享
实现多台服务器之间数据一致
NFS工作原理
1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务端
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端
5.Rpc.mount进程判断客户端是否有对应的权限进行验证
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件
注意: rpc是一个远程过程调用,那么使用nfs必须有rpc服务
1 2 3 4 5 6 7 8 9 10 11 yum install -y httpd php /var/www/html systemctl start httpd chown -R apache.apache /var/www/html/
安装部署NFS服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [root@nfs ~] [root@nfs ~] [root@nfs ~] -rw-r--r--. 1 root root 0 Jun 7 2013 /etc/exports [root@nfs ~] /data 172.16.1.0/24(rw,sync,all_squash) [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
NFS配置详解
nfs共享参数
参数作用
rw*
客户端针对服务端的共享目录有可读,可写权限
ro
客户端针对服务端的共享目录只读权限
root_squash
客户端必须是以root身份写入共享目录文件时,到服务端才能以nfs的系统用户写入(不常用)
no_root_squash
客户端以root身份连接服务端,也会以nfs服务器的root用户来操作共享目录(不常用)
all_squash*
无论NFS客户端用什么用户访问共享目录,到服务端都是nfs的系统用户权限(常用)
no_all_squash
无论NFS客户端使用什么账户访问,都不会变成nfs系统用户的身份(不常用)
sync*
同时将数据写入到内存与硬盘中,保证不丢失数据
async
优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
anonuid*
配置all_squash使用,指定NFS的用户UID,必须存在系统
anongid*
配置all_squash使用,指定NFS的用户UID,必须存在系统
客户端操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@web01 ~] [root@web02 ~] [root@web01 ~] [root@web02 ~] [root@web01 ~] [root@web02 ~] cat /var/lib/nfs/etab
NFS存储实战 准备环境
主机名
WanIP
LanIP
角色
部署应用
web01
10.0.0.7
172.16.1.7
网站服务(nfs客户端)
httpd、php、nfs
web02
10.0.0.8
172.16.1.8
网站服务(nfs客户端)
httpd、php、nfs
nfs
10.0.0.31
172.16.1.31
共享存储(nfs服务端)
nfs
部署交作业网站 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [root@web01 ~] [root@web02 ~] [root@web01 html] -rw-r--r-- 1 root root 26927 May 18 09:33 kaoshi.zip [root@web01 html] /var/www/html [root@web01 html] [root@web02 html] [root@web01 html] [root@web02 html] [root@web01 html] [root@web02 html] [root@web01 html] tcp6 0 0 :::80 :::* LISTEN 7498/httpd [root@web02 html] tcp6 0 0 :::80 :::* LISTEN 7123/httpd http://10.0.0.7/ http://10.0.0.8/ [root@web01 html] [root@web02 html] [root@web01 html] -rw-r--r-- 1 apache apache 298685 May 18 20:20 33_aa.jpg [root@web02 html] -rw-r--r-- 1 apache apache 298685 May 18 20:20 33_bb.jpg
部署共享存储 1 2 3 4 5 6 7 [root@web01 html] [root@web02 html] [root@web01 html] [root@web02 html]
统一用户 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [root@web01 ~] [root@web01 ~] [root@web02 ~] [root@web02 ~] [root@web01 html] User www Group www [root@web02 html] User www Group www [root@web01 html] [root@web02 html] [root@nfs ~] [root@nfs ~] [root@nfs ~] /data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash) [root@nfs ~]
排错流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [root@web01 html] [root@web01 html] 1)不通 - 检查网卡配置文件 - 虚拟机物理网卡设置 - 虚拟网络编辑器中的设置 2)通 - 防火墙 - selinux - 服务没有启动 - 服务启动了,但是配置没有生效 cat /var/lib/nfs/etab 1)服务端权限 - 配置文件 [root@nfs ~] /data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash) - 共享目录权限 [root@nfs ~] drwxr-xr-x 2 www www 28 May 19 10:40 /data/ - 用户信息 [root@nfs html] uid=666(www) gid=666(www) groups=666(www) 2)客户端权限 - 站点目录权限 [root@web01 html] -d drwxr-xr-x 3 www www 119 May 19 10:38 /var/www/html/ - 用户上传数据的目录权限 [root@web01 html] drwxr-xr-x 2 www www 28 May 19 10:40 /var/www/html/user_data/ - apache配置文件中用户和组 [root@web01 html] User www Group www - apache服务启动用户 [root@web01 html] - 用户信息 [root@web01 html] uid=666(www) gid=666(www) groups=666(www) - 错误日志 [root@web02 html]
NFS挂载 开机自动挂载 1 2 3 4 5 6 7 8 9 10 [root@web02 ~] -rw-r--r--. 1 root root 501 May 12 19:20 /etc/fstab [root@web02 ~] 172.16.1.31:/data /var/www/html/user_data nfs defaults 0 0 [root@web02 ~]
NFS卸载 1 2 3 4 5 6 7 8 [root@web02 ~] umount.nfs4: /var/www/html/user_data: device is busy [root@web02 ~]
增加安全性 在企业工作场景,通常情况NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid、exec等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性。例如: 很多木马篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的
增加性能(可选)
NFS存储小结
NFS存储优点
NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。
客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)
2.NFS存储局限
1.存在单点故障, 如果构建高可用维护麻烦web->nfs()->backup
2.NFS数据明文, 并不对数据做任何校验。
3.客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)
3.NFS应用建议
1.生产场景应将静态数据尽可能往前端推, 减少后端存储压力
2.必须将存储里的静态资源通过CDN缓存jpg\png\mp4\avi\css\js
3.如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用
NFS结合Rsync 需求 1.备份用户数据
目的:避免运维人员,或者其他技术人员误操作,误删除了用户数据,还可以恢复
2.实时同步用户数据
注意:统一用户
1.web01和web02可以上传图片
2.nfs用户数据每天凌晨1点做备份
3.校验数据的完整性
4.nfs用户数据实时同步到backup的/data/目录下,做nfs的备机
环境准备
主机名
WanIP
LanIP
角色
部署服务
web01
10.0.0.7
172.16.1.7
nfs客户端
httpd、php、nfs
web02
10.0.0.8
172.16.1.8
nfs客户端
httpd、php、nfs
nfs
10.0.0.31
172.16.1.31
rsync客户端、nfs服务端
nfs、rsync、inotify
backup
10.0.0.41
172.16.1.41
rsync服务端、nfs服务端(备机)
nfs、rsync
部署rsync 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 [root@backup ~] [root@backup ~] uid = www gid = www port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.passwd log file = /var/log /rsyncd.log [nfs_backup] comment = nfs_backup path = /backup [nfs_data] comment = nfs_data path = /data [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] drwxr-xr-x 2 www www 6 May 20 10:23 /backup/ drwxr-xr-x 2 www www 6 May 20 10:23 /data/ [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] #!/bin/bash dir=/tmp/ export RSYNC_PASSWORD=123 inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir |while read line;do rsync -az --delete $dir rsync_backup@172.16.1.41::nfs_data done &
部署nfs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 [root@nfs ~] [root@backup ~] [root@nfs ~] /data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash) [root@backup ~] /data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash) [root@nfs ~] [root@nfs ~] [root@backup ~] [root@backup ~] [root@nfs ~] [root@backup ~] [root@nfs ~] [root@backup ~] [root@nfs ~] [root@nfs ~] [root@backup ~] [root@backup ~] [root@nfs ~] [root@backup ~] [root@nfs ~] [root@nfs ~] [root@web01 ~] [root@web02 ~] [root@web01 ~] Export list for 172.16.1.31: /data 172.16.1.0/24 [root@web01 ~] Export list for 172.16.1.41: /data 172.16.1.0/24 [root@web02 ~] Export list for 172.16.1.31: /data 172.16.1.0/24 [root@web02 ~] Export list for 172.16.1.41: /data 172.16.1.0/24 [root@web01 ~] [root@web01 ~] [root@web01 ~] [root@web01 ~] [root@web01 ~] [root@web01 ~] [root@web01 ~]
部署web网站 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [root@web01 ~] [root@web02 ~] [root@web01 ~] User www Group www [root@web02 ~] User www Group www [root@web01 ~] [root@web01 ~] [root@web02 ~] [root@web02 ~] [root@web01 ~] [root@web01 html] [root@web02 ~] [root@web02 html] [root@web01 html] [root@web02 html] [root@web01 html] [root@web02 html] [root@web01 html] [root@web01 html] [root@web02 html] [root@web02 html] http://10.0.0.7/ http://10.0.0.8/ [root@web01 html] [root@web02 html]
实时同步 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@nfs ~] #!/bin/bash dir=/data/ export RSYNC_PASSWORD=123 inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir |while read line;do rsync -az --delete $dir rsync_backup@172.16.1.41::nfs_data done &[root@web01 html] [root@web02 html] [root@nfs ~] -rw-r--r-- 1 www www 638916 May 23 05:50 33_cc.jpg [root@backup ~] -rw-r--r-- 1 www www 638916 May 23 05:50 33_cc.jpg [root@web01 html] [root@web02 html] [root@web01 html] [root@web02 html]
每日备份 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@nfs ~] #!/bin/bash bak_dir="/client_backup" data_dir="/data" host_name=`hostname` ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}' ` date_time=`date +%F` export RSYNC_PASSWORD=123mkdir -p $bak_dir cd $data_dir && \ tar zcf $bak_dir /${host_name} _${ip} _${date_time} .tar.gz . cd $bak_dir && \ md5sum ${host_name} _${ip} _${date_time} .tar.gz > ${host_name} _${ip} _${date_time} .md5 rsync -avz $bak_dir / rsync_backup@172.16.1.41::nfs_backup find $bak_dir -type f ! -mtime -7|xargs rm -f
发邮件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root@backup ~] [root@backup ~] set from=690705712@qq.com set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=690705712@qq.com set smtp-auth-password=授权码 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/[root@backup ~] #!/bin/bash bak_dir="/backup" host_name=`hostname` ip=`ifconfig eth1|awk 'NR==2{print $2}' ` date_time=`date +%F` cd ${bak_dir} && \ md5sum -c *${date_time} .md5|mail -s "${date_time} _数据备份校验" 管理员邮箱 >/dev/null find /backup -type f ! -mtime -180|xargs rm -f [root@nfs ~] 00 01 * * * /bin/sh /root/backup.sh &>/dev/null [root@backup ~] 01 01 * * * /bin/sh /root/check_md5.sh &>/dev/null
Sersync实时同步 实时同步目的
sersync做实时同步的依赖
Inotify
是一个通知接口,用来监控文件系统的各种变化,如果文件存取,删除,移动。可以非常方便地实现文件 异动告警,增量备份,并针对目录或文件的变化及时作出响应。rsync+inotify
可以实触发式实时同步增量备份
Sersync
官网:https://github.com/wsgzao/sersync
sersync实战 环境准备
主机名
WanIP
LanIP
角色
部署服务
web01
10.0.0.7
172.16.1.7
nfs客户端
httpd、php、nfs-utils
web02
10.0.0.8
172.16.1.8
nfs客户端
httpd、php、nfs-utils
nfs
10.0.0.31
172.16.1.31
rsync客户端、nfs服务端
nfs-utils、rsync、inotify-tools、sersync
backup
10.0.0.41
172.16.1.41
rsync服务端、nfs服务端(备机)
nfs-utils、rsync
部署sersync 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] [root@nfs ~] <!-- inotify监控动作配置 全部改成true --> <inotify> <delete start="true" /> <createFolder start="true" /> <createFile start="false" /> -->true <closeWrite start="true" /> <moveFrom start="true" /> <moveTo start="true" /> <attrib start="false" /> -->true <modify start="false" /> -->true </inotify> 相当于 inotifywait -mrq --format %w %f -e create,delete,attrib,close_write /data <sersync> <!-- 监控目录,推送数据的目录 /data --> <localpath watch="/opt/tongbu" > -->/data <!-- rsync服务端的IP地址:172.16.1.41 和 模块名:nfs_data --> <remote ip="127.0.0.1" name="tongbu1" /> -->172.16.1.41,nfs_data </localpath> <rsync> <!-- rsync命令执行时的选项 --> <commonParams params="-artuz" /> --> -az --delete <!-- rsync命令认证,打开认证,rsync匿名用户,密码文件 --> <auth start="false" users="root" passwordfile="/etc/rsync.pas" /> -->true ,rsync_backup,/etc/rsync.pass <userDefinedPort start="false" port="874" /><!-- port=874 --> <timeout start="false" time="100" /><!-- timeout=100 --> <ssh start="false" /> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60" /><!--default every 60mins execute once--> <crontab start="false" schedule="600" ><!--600mins--> <crontabfilter start="false" > <exclude expression="*.php" ></exclude> <exclude expression="info/*" ></exclude> </crontabfilter> </crontab> <plugin start="false" name="command" /> </sersync> 相当于 rsync -az --delete /data rsync_backup@172.16.1.41::nfs_data --password-file=rsync.pass [root@nfs data] [root@nfs data] [root@nfs sersync-2.5.4] [root@nfs ~] [root@nfs ~] [root@nfs ~] [Unit] Description=Client for sersync After=network.target [Service] Type=forking ExecStart=/application/sersync-2.5.4/sersync2 -rdo /application/sersync-2.5.4/confxml.xml ExecReload=pidof sersync2|xargs kill -1 ExecStop=pidof sersync2|xargs kill -3 [Install] WantedBy=multi-user.target [root@nfs ~] [root@nfs ~]