Rsync+inotify
Inotify 是一个通知接口, 用来监控文件系统的各种变化, 如果文件存取, 删除, 移动. 可以非常方便地实现文件异动告警, 增量备份, 并针对目录或文件的变化及时作出响应. rsync+inotify 可以实触发式实时同步增量备份
案例: 实现 web 上传视频文件, 写入 NFS 共享存储, 然后将 NFS 存储内容实时复制至 Backup 服务器
环境准备
角色 外网 IP(NAT) 内网 IP(LAN) 安装工具 Rsync-server eth0:10.0.0.41 eth1:172.16.1.41 rsync-servernfs-server eth0:10.0.0.31 eth1:172.16.1.31 rsync+inotifyweb01 eth0:10.0.0.7 eth1:172.16.1.7 nginx+phpRsync-Server 操作步骤如下:
1. 安装 rsync
- [root@backup-41 ~]# yum install -y rsyncd2. 配置 rsync
- [root@backup-41 ~]# vim /etc/rsyncd.confuid = rsyncgid = rsyncport = 873fake super = yesuse chroot = nomax connections = 200timeout = 600ignore errorsread only = falselist = falseauth users = rsync_backupsecrets file = /etc/rsync.passwordlog file = /var/log/rsyncd.log#####################################[backup]path = /backup
- [data]path = /data
准备密码文件以及虚拟用户对应的虚拟密码[root@backup-41 ~]# cat /etc/rsync.password rsync_backup:123456[root@backup-41 ~]# ll /etc/rsync.password-rw------- 1 root root 20 Jul 23 11:42 /etc/rsync.password
创建 backup data 仓库目录[root@backup-41 ~]# mkdir /backup[root@backup-41 ~]# chown -R rsync.rsync /backup/
- [root@backup-41 ~]# mkdir /data[root@backup-41 ~]# chown -R rsync.rsync /data/3. 启动 rsync
- [root@backup-41 ~]# systemctl restart rsyncd[root@backup-41 ~]# netstat -lntp|grep rsynctcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1372/rsync 4.nfs 客户端验证 rsync 是否正常使用
- [root@nfs01 ~]# rsync -avz /root/oldboy rsync_backup@172.16.1.41::backupPassword: sending incremental file listoldboy
- [root@nfs01 ~]# rsync -avz /root/oldboy rsync_backup@172.16.1.41::dataPassword: sending incremental file listoldboyNFS-Server 操作步骤如下:
1. 安装 nfs
- [root@nfs01 ~]# yum install nfs-utils rpcbind -y2. 配置 nfs
- [root@nfs01 ~]# cat /etc/exports/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
- [root@nfs01 ~]# id wwwuid=666(www) gid=666(www) groups=666(www)
- [root@nfs01 ~]# mkdir /data[root@nfs01 ~]# mkdir /data/www[root@nfs01 ~]# chown -R www.www /data[root@nfs01 ~]# ll -d /data/drwxr-xr-x 5 www www 98 Jul 26 09:29 /data/[root@nfs01 /]# ll -d /data/www/drwxr-xr-x 2 root root 6 Jul 27 10:40 /data/www/3. 启动 nfs
- [root@nfs01 ~]# systemctl restart rpcbind[root@nfs01 ~]# systemctl restart nfs-server4. 安装 inotify
- [root@nfs01 ~]# yum install inotify-tools rsync -y5. 配置 inotify
在 linux 内核中, 默认的 inotify 机制提供了三个调控参数:[root@nfs01 ~]# ls /proc/sys/fs/inotify/max_queued_events #设置监控服务实例可以监控的事件个数 max_user_instances #设置用户可以开启的服务进程数 max_user_watches #可以监控的最大文件数
参数值修改 cat>> /etc/sysctl.conf <<EOFfs.inotify.max_queued_events=99999999fs.inotify.max_user_watches=99999999fs.inotify.max_user_instances=65535EOF
使修改的参数生效[root@nfs01 ~]# sysctl -p
inotify 工具中常用于实时同步的命令是 inotifywait(监控文件或目录的变化), 如下列出常用参数 - m 表示持续监控 - r 递归形式监视目录 - q 简化输出信息 - e 指定要监视的事件(create,move,delete,modify)--timefmt 自定义时间格式, 常用参数'%y/%m/%d %H:%M'--format 自定义输出格式信息, 常用的格式符如下 %e: 使用了什么事件 %T: 时间 %w: 显示被监控文件的文件名;%f: 如果发生某事件的对象是目录, 则显示被监控 6. 利用 inotifywait 实现数据实时监控
- [root@nfs01 ~]# inotifywait -mrq --format '%e %T %w%f' --timefmt '%y/%m/%d %H:%M' -e close_write,modify,delete,create,move /backup/7. 使用 inotifywait 配合 rsync 实现实时同步脚本
- [root@nfs01 ~]# vim /server/scripts/inotify_rsync.sh#!/bin/bashexport RSYNC_PASSWORD=123456SRC=/data/DST=rsync_backup@172.16.1.41::backup/
- inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read filedorsync -az --delete $SRC $DSTdone[root@nfs01 ~]# chmod +x /server/scripts/inotify_rsync.shweb01 操作步骤如下:
1. 安装 nginx+php 以及 nfs 相关工具
- [root@web01 ~]# yum install nginx php php-fpm php-pdo nfs-utils rpcbind -y2. 配置 nfs-client
- [root@web01 ~]# mkdir /data/www[root@web01 ~]# mount -t nfs 172.16.1.31:/data/www /data/www/# 加入开机自动挂载该 nfs 设备[root@web01 ~]# tail -n1 /etc/fstab 172.16.1.31:/data/www /data/www nfs defaults 0 0
- [root@web01 ~]# umount /data/www/[root@web01 ~]# mount -a[root@web01 ~]# df -hFilesystem Size Used Avail Use% Mounted on172.16.1.31:/data/www 50G 1.6G 49G 4% /data/www3. 配置 nginx
- [root@web01 ~]# vim /etc/nginx/nginx.confuser www;worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;root /data/www;index index.php index.html index.htm;autoindex on;location ~ .php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;include fastcgi_params;}}}# 注意: nginx 修改运行用户需要调整对应的临时目录权限[root@web01 ~]# chown -R www.www /var/lib/nginx/4. 修改 php 程序运行的属主和属组, 统一用户 id
- [root@web01 ~]# sed -i 's#user = apache#user = www#g' /etc/php-fpm.d/www.conf [root@web01 ~]# sed -i 's#group = apache#group = www#g' /etc/php-fpm.d/www.conf [root@web01 ~]# egrep "^user|^group" /etc/php-fpm.d/www.conf user = wwwgroup = www5. 启动 nginx+php
- [root@web01 ~]# systemctl start nginx php-fpm[root@web01 ~]# netstat -lntp|egrep "nginx|php"tcp 0 0 127.0.0.1:9000 0.0.0.0:LISTEN 1661/php-fpm: maste tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN 1670/nginx: master6. 上传对应代码至网站目录, 然后进行附件提交测试
backup 补充部分: 与 nfs-server 保持高度一致
1. 安装 nfs[root@backup-41 ~]# yum install nfs-utils -y2. 配置 nfs[root@backup-41 ~]# cat /etc/exports/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)3. 启动 nfs[root@backup-41 ~]# systemctl enable nfs-server[root@backup-41 ~]# systemctl start nfs-server 架构补充部分: 进程至后台
[root@nfs01 ~]# yum install screen -y[root@nfs01 ~]# screen -S Socket_name #建议指定一个名称 #### 进入 screen 会话 ---->1. 强制关闭终端 2.ctrl+a+d 退出 scrren, 但不会结束当前在 screen 运行的程序注意: 使用 exit 会结束 screen 整个会话[root@nfs01 ~]# screen -r [pid|socket_name] #如果指定名称, 如果没有指定名称需要使用 pid
1. 前端页面上传文件 ->web 服务器 2.web 存放的代码和附件目录是挂载至 nfs 存储上 3.web->nfs->backupnfs 故障在 web 上卸载 nfs 的挂载信息重新挂载至 backupnfs-server: 模拟 nfs 故障
[root@nfs01 ~]# systemctl stop nfs-server1.web01 处理操作, 卸载当前已 down 的 nfs-server, 然后重新挂载至 backup 服务器, 解决.[root@web01 ~]# umount -lf /data/www && mount -t nfs 172.16.1.41:/data/www /data/www/[root@web01 ~]# df -hFilesystem Size Used Avail Use% Mounted on172.16.1.41:/data/www 50G 2.2G 48G 5% /data/www
注意: 此时还是无法正常访问 web, 因为 rsync 使用的 rsync 用户管理目录[root@backup-41 ~]# cat /etc/rsyncd.conf #变更如下配置 uid = wwwgid = www[root@backup-41 ~]# systemctl restart rsyncd[root@backup-41 ~]# chown -R www.www /data/[root@backup-41 ~]# chown -R www.www /backup/nfs-server:nfs 故障后恢复
- #1. 修复 nfs-server 后, 手动拉取 backup 下的所有数据, 保持一致. rsync -avz --delete rsync_backup@172.16.1.41::data /data/
- #2. 在 web 上卸载, 然后重新挂载至 nfs 存储[root@web01 ~]# umount /data/www/ && mount -t nfs 172.16.1.31:/data/www /data/wwwsersync 实时同步 sersync 是国人基于 rsync+inotify-tools 开发的工具, 不仅保留了优点同时还强化了实时监控, 文件过滤, 简化配置等功能, 帮助用户提高运行效率, 节省时间和网络资源.
sersync 优点
1)支持通过配置文件管理 2)真正的守护进程 socket(不需要写脚本).3)可以对失败文件定时重传 (定时任务功能).4) 第三方的 HTTP 接口 (例如更新 cdn 缓存).5) 默认多线程 rsync 同步.
sersync 项目地址
角色 外网 IP(NAT) 内网 IP(LAN) 安装工具 nfs-server eth0:10.0.0.31 eth1:172.16.1.31 rsync+inotify+sersyncbackup eth0:10.0.0.41 eth1:172.16.1.41 rsync-serverBackup 操作步骤如下
1. 安装 rsync
- [root@backup-41 ~]# yum install rsync -y2. 配置 rsync
- [root@backup-41 ~]# cat /etc/rsyncd.conf uid = wwwgid = wwwport = 873fake super = yesuse chroot = nomax connections = 200timeout = 600ignore errorsread only = falselist = falseauth users = rsync_backupsecrets file = /etc/rsync.passwordlog file = /var/log/rsyncd.log#####################################[backup]path = /backup
- [data]path = /data
建立对应密码文件
- [root@backup-41 ~]# echo "rsync_backup:123456"> /etc/rsync.password4. 创建对应目录并授权
- [root@backup-41 ~]# groupadd -g 666 www[root@backup-41 ~]# useradd -u 666 -g www www[root@backup-41 ~]# id wwwuid=666(www) gid=666(www) groups=666(www)[root@backup-41 ~]# mkdir -p /{backup,data}[root@backup-41 ~]# chown -R www.www /{backup,data}5. 启动 rsync
- [root@backup-41 ~]# systemctl enable rsyncd[root@backup-41 ~]# systemctl start rsyncd[root@backup-41 ~]# netstat -lntpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1680/rsync Nfs-Server 操作步骤如下
1. 安装 sersync
sersync 需要依赖 inotify 和 rsync, 所以需要安装对应软件
[root@nfs01 ~]# yum install rsync inotify -y
安装 sersync
- [root@nfs01 ~]# mkdir /server/tools -p[root@nfs01 ~]# cd /server/tools/[root@nfs01 tools]# wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz [root@nfs01 tools]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz[root@nfs01 tools]# mv GNU-Linux-x86//usr/local/sersync[root@nfs01 tools]# cd /usr/local/sersync/[root@nfs01 sersync]# cp confxml.xml confxml.bak[root@nfs01 sersync]# vim confxml.xml5 <fileSystem xfs="true"/> <!-- 文件系统 -->6 <filter start="false"> <!-- 排除不想同步的文件 -->7 <exclude expression="(.).svn"></exclude>8 <exclude expression="(.).gz"></exclude>9 <exclude expression="^info/"></exclude>10 <exclude expression="^static/"></exclude>11 </filter>
- 12 <inotify> <!-- 监控的事件类型 -->13 <delete start="true"/>14 <createFolder start="true"/>15 <createFile start="true"/>16 <closeWrite start="true"/>17 <moveFrom start="true"/>18 <moveTo start="true"/>19 <attrib start="false"/>20 <modify start="false"/>21 </inotify>
- 23 <sersync>24 <localpath watch="/data/www"> <!-- 监控的目录 -->25 <remote ip="172.16.1.41" name="data"/> <!-- backup 的 IP 以及模块 -->26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->28 </localpath>
- 29 <rsync> <!-- rsync 的选项 -->30 <commonParams params="-az"/>31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>32 <userDefinedPort start="false" port="874"/><!-- port=874 -->33 <timeout start="true" time="100"/><!-- timeout=100 -->34 <ssh start="false"/>35 </rsync>
- <!-- 每 60 分钟执行一次同步 -->
36 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->3. 启动 sersync 服务守护进程
查看启动参数
[root@nfs01 sersync]# ./sersync2 -hset the system paramexecute:echo 50000000> /proc/sys/fs/inotify/max_user_watchesexecute:echo 327679> /proc/sys/fs/inotify/max_queued_eventsparse 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@nfs01 ~]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
来源: http://www.bubuko.com/infodetail-2756570.html