Linux架构04 NFS总结, Rsync+NFS实战, 解决NFS单点问题, inotify, sersync实时同步
NFS小结
1.NFS存储优点
1.NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求
2.NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见
2.NFS局限性
1.存在单点故障,如果构建高可用维护麻烦web->nfs()->backup
2.NFS数据明文,并不对数据做任何校验
3.客户端挂载NFS服务没有密码验证,安全性一般(内网使用)
3.NFS应用建议
1.生产场景应将静态数据尽可能往前端推,减少后端存储压力
2.必须将存储里的静态资源通过CDN缓存jpg\png\mp4\avi\css\js
3.如果没有缓存或架构本身历史遗留问题太大,再多存储也无用
角色 | ip | |
---|---|---|
web01 | NFS客户端、RSYNC客户端 | 172.16.1.7 |
nfs | NFS服务端、RSYNC客户端 | 172.16.1.31 |
backup | NFS服务端、RSYNC服务端 | 172.16.1.41 |
2.搭建上传作业系统
[root@web01 ~]# yum install -y httpd php
2)配置httpd用户
[root@web01 ~]# vim /etc/httpd/conf/httpd.conf User www # 默认是apache,这里保持统一 Group www
groupadd www -g 666 useradd www -u 666 -g 666 -s /sbin/nologin -M # 不需要登录,不需要家目录
cd /var/www/html/
# 放入上传文件php代码,index.html, file.php
# 修改上传路径为/var/www/html/upload
chown -R www.www /var/www/html
systemctl start httpd [root@web01 html]# netstat -lntp |grep 80 tcp6 0 0 :::80 :::* LISTEN 30217/httpd
服务端
1)安装nfs
yum install -y nfs-utils rpcbind
[root@nfs ~]# vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# groupadd www -g 666 [root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@nfs ~]# mkdir /data [root@nfs /]# chown -R www.www /data/
[root@nfs /]# systemctl start rpcbind nfs-server
[root@nfs /]# cat /var/lib/nfs/etab /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=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
客户端(web01)
yum install -y nfs-utils rpcbind
[root@web01 html]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24
[root@web01 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload [root@web01 html]# df -h
4.把NFS挂载目录数据同步到backup服务器
rsync服务端(backup)
[root@backup ~]# yum install -y rsync vim /etc/rsyncd.conf ------------------------------ 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 ############################ [data] path = /data
[root@nfs ~]# groupadd www -g 666 [root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
echo "rsync_backup:123" > /etc/rsync.passwd chmod 600 /etc/rsync.passwd
mkdir /data
chown -R www.www /data
systemctl start rsyncd
rsync客户端(NFS服务器)
# 方式一:手动输入密码 [root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data # 方式二:配置环境变量 [root@nfs ~]# export RSYNC_PASSWORD=123 [root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data # 方式三:指定密码文件 [root@backup ~]# echo "123" > /etc/rsync.password [root@backup ~]# chmod 600 /etc/rsync.password [root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data --password-file=/etc/rsync.password
backup服务器搭建NFS服务端
yum install -y rpcbind nfs-utils
[root@nfs ~]# vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
mkdir /data
chown -R www.www /data/
[root@backup /]# systemctl start nfs-server
[root@backup /]# cat /var/lib/nfs/etab /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=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
[root@web01 ~]# umount -lf /var/www/html/ [root@web01 ~]# mount -t nfs 172.16.1.41:/data /var/www/html/upload
注: nfs没有集群,一般出问题了,都是人工去切换,挂载到另一台服务器上
[root@nfs ~]# yum install -y inotify-tools
-m 持续监控 -r 递归 -q 静默,仅打印时间信息 --timefmt 指定输出时间格式 --format 指定事件输出格式 %Xe 事件 %w 目录 %f 文件 -e 指定监控的事件 access 访问 modify 内容修改 attrib 属性修改 close_write 修改正式文件内容 open 打开 create 创建 delete 删除 umount 卸载
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /data
[root@nfs ~]# vim inotify.sh #!/bin/bash dir=/data export RSYNC_PASSWORD=123 /usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do cd $dir && rsync -az -R --delete . rsync_backup@172.16.1.41::data >/dev/null 2>&1 done & [root@nfs ~]# sh inotify.sh
实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器
2.为什么实时同步
保证数据的连续性,减少人力维护成本,解决nfs单点故障
3.实现同步的原理
实现同步需要借助inotify通知接口,用来监控目录的变化,如果监控的目录发生变更,则触发动作,这个动作可以是进行一次同步操作,或其他操作;
4.实时同步工具的选择
sersync+RSYNC(√)、inotify+rsync Inotify是一个通知接口,用来监控文件系统的各种变化,如果文件存取,删除,移动。可以非常方便地实现文件异动告警,增量备份,并针对目录或文件的变化及时作出相应。rsync+inotify可以做到实时增量备份 sersync是国人基于rsync+inotify-tools开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。
主机 | 内网 | 安装 |
---|---|---|
web01 | 172.16.1.7 | 部署作业代码 |
nfs | 172.16.1.31 | rsync+inotify+sersync、NFS服务端 |
backup | 172.16.1.41 | rsync服务端 |
2.nfs服务器部署sersync
1)安装rsync和inotify
[root@nfs ~]# yum install -y rsync inotify-tools # sersync需要rsync和inotify的命令作为基础
[root@nfs ~]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz # 二进制包解压就能用
源码包:解压,生成,编译,安装 (二进制包大, 源码包小)
[root@nfs ~]# mv GNU-Linux-x86 /usr/local/sersync
[root@nfs sersync]# vim confxml.xml ------------------------------------------------ # 修改下方内容
# <host hostip="localhost" port="8008"></host> 本地主机地址,端口号 # <filter> 过滤 # <inotify> 监控 <inotify> # 监控的动作,true就推送,false就不推送 <delete start="true"/> <createFolder start="true"/> <createFile start="true"/> # 创建文件,要改成true <closeWrite start="true"/> # 对文件修改 <moveFrom start="true"/> # 移动进去 <moveTo start="true"/> # 移动走 <attrib start="true"/> # 修改属性,要改成true <modify start="true"/> # 修改文件内容, 要改成true <inotify> <sersync> <localpath watch="/data"> # 监控的目录 # rsync服务端IP # 模块名 <remote ip="172.16.1.41" name="data"/> # 远端的地址,模块名 <!--<remote ip="192.168.8.39" name="tongbu"/>--> # 可以写多个 <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> # rsync推送时的参数 <commonParams params="-az"/> # rsync命令的参数 # rsync推送时认证 # 认证的虚拟用户 # 虚拟用户对应的密码文件 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/> # 如果rsync不使用默认的873端口,使用改参数指定 <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--> # 错误日志保存路径 # 定时任务,设置多久(每600分钟)进行一次全量备份 <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> # 定时备份排除文件 <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab>
echo "123" > /etc/rsync.password chmod 600 /etc/rsync.password
[root@nfs sersync]# ./sersync2 -h set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param _______________________________________________________ 参数-d:启用守护进程模式 参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍 c参数-n: 指定开启守护线程的数量,默认为10个 # 一般不改 参数-o:指定配置文件,默认使用confxml.xml文件 参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块 参数-m:单独启用其他模块,使用 -m socket 开启socket模块 参数-m:单独启用其他模块,使用 -m http 开启http模块 不加-m参数,则默认执行同步程序 ________________________________________________________________
# 注意执行目录 [root@nfs sersync]# ./sersync2 -dro confxml.xml [root@nfs sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
[root@nfs sersync]# ./sersync2 -dr # 此处只有一个配置文件,会自动去读配置文件(多个配置文件要指定),正规写法要指定配置文件
通过-r参数运行,返回推送的命令,可以自己发一次看看能不能推送成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)