一、Rsync + Cron 场景使用
在对数据备份要求实时性不高的情况下,可优先考虑该场景,选择一个合适的时间,对数据进行定时远程增量同步。
在《数据备份系列:Rsync 备份详解(一)》中我们已经对服务搭建以及远程传输有了了解,接下来就是结合之前的内容进行扩展。
1.1 服务端准备工作
#删除之前测试的数据,在服务端创建两个文件夹,用于接收 linux 和 windows 客户端同步过来的数据
[root@rsync162 backup]# mkdir from_linux_client
[root@rsync162 backup]# mkdir from_windows_client
[root@rsync162 backup]# ll
总用量 0
drwxr-xr-x. 2 root root 6 4月 24 09:53 from_linux_client
drwxr-xr-x. 2 root root 6 4月 24 09:53 from_windows_client
1.2 windows 客户端配置
(1)在 windows 客户端目录下新建一个 logs 目录,用于传输测试
#进程传输测试
C:\Users\Administrator>C:\soft\cwRsync_5.4.1_x86_Free\rsync.exe -avzp --password-file=/cygdrive/c/soft/cwRsync_5.4.1_x86_Free/passwd.txt --port=9999 /cygdrive/c/soft/cwRsync_5.4.1_x86_Free/logs test@192.168.0.162::proname/from_windows_client
#或者输入
C:\Users\Administrator>C:\soft\cwRsync_5.4.1_x86_Free\rsync.exe -avzp --password-file=C:\soft\cwRsync_5.4.1_x86_Free\passwd.txt --port=9999 /cygdrive/c/soft/cwRsync_5.4.1_x86_Free/logs test@192.168.0.162::proname/from_windows_client
(2)创建执行脚本
#新建一个文件,重名名为 rsync.bat 编辑内容并保存:
@echo off
C:\soft\cwRsync_5.4.1_x86_Free\rsync.exe -avzp --password-file=/cygdrive/c/soft/cwRsync_5.4.1_x86_Free/passwd.txt --port=9999 /cygdrive/c/soft/cwRsync_5.4.1_x86_Free/logs test@192.168.0.162::proname/from_windows_client
(3)双击测试脚本
#服务端查看接收到的数据
[root@rsync162 from_windows_client]# pwd
/backup/from_windows_client
[root@rsync162 from_windows_client]# ll
总用量 0
drwx------. 2 root 401 106 4月 23 16:06 logs
[root@rsync162 from_windows_client]# ll logs/
总用量 23684
-rwx------. 1 root 401 284 3月 20 17:29 cc.txt
-rwx------. 1 root 401 3328826 4月 13 17:09 cwRsync_5.4.1_XiaZaiBa.zip
-rwx------. 1 root 401 20913856 3月 20 15:52 windows.zip.gz
-rwx------. 1 root 401 286 4月 3 13:10 新建文本文档.txt
(4)创建定时任务
1.2 Linux 客户端配置
(1)和 windows 一样新建一个 logs 目录,用于传输测试
#先进行手动测试(手动测试没有问题)
[root@rsync164 ~]# rsync -avz --port 9999 --password-file /etc/rsync.pass /root/logs test@192.168.0.162::proname/from_linux_client
sending incremental file list
logs/
logs/csp/
logs/csp/command-center.log.2022-05-10.0
logs/csp/command-center.log.2022-05-10.0.1
logs/csp/command-center.log.2022-05-10.0.2
logs/csp/command-center.log.2022-05-11.0
logs/csp/command-center.log.2022-05-11.0.1
logs/csp/command-center.log.2022-05-11.0.1.lck
logs/csp/command-center.log.2022-05-11.0.2
logs/csp/command-center.log.2022-05-11.0.2.lck
logs/csp/command-center.log.2022-05-11.0.3
logs/csp/command-center.log.2022-05-11.0.3.lck
logs/csp/command-center.log.2022-05-11.0.4
logs/csp/command-center.log.2022-05-11.0.lck
logs/csp/command-center.log.2022-05-12.0
logs/csp/command-center.log.2022-05-12.0.lck
logs/csp/command-center.log.2022-05-13.0
logs/csp/command-center.log.2022-05-16.0
logs/csp/command-center.log.2022-05-16.0.lck
logs/csp/command-center.log.2022-05-17.0
logs/csp/command-center.log.2022-05-17.0.lck
logs/csp/command-center.log.2022-05-18.0
logs/csp/command-center.log.2022-05-18.0.lck
logs/csp/command-center.log.2022-05-20.0
logs/csp/command-center.log.2022-05-20.0.lck
logs/csp/command-center.log.2022-05-23.0
logs/csp/command-center.log.2022-05-23.0.lck
......
(2)创建执行脚本
[root@rsync164 ~]# vi rsync.sh
#!/bin/bash
/usr/bin/rsync -avz --port 9999 --password-file /etc/rsync.pass /root/logs test@192.168.0.162::proname/from_linux_client
(3)授权并测试脚本
#删除服务端数据,授予脚本执行权限
[root@rsync164 ~]# chmod 755 rsync.sh
#测试执行(过程没有问题)
[root@rsync164 ~]# ./rsync.sh
sending incremental file list
logs/
logs/csp/
logs/csp/command-center.log.2022-05-10.0
logs/csp/command-center.log.2022-05-10.0.1
logs/csp/command-center.log.2022-05-10.0.2
logs/csp/command-center.log.2022-05-11.0
logs/csp/command-center.log.2022-05-11.0.1
logs/csp/command-center.log.2022-05-11.0.1.lck
logs/csp/command-center.log.2022-05-11.0.2
logs/csp/command-center.log.2022-05-11.0.2.lck
logs/csp/command-center.log.2022-05-11.0.3
logs/csp/command-center.log.2022-05-11.0.3.lck
logs/csp/command-center.log.2022-05-11.0.4
logs/csp/command-center.log.2022-05-11.0.lck
logs/csp/command-center.log.2022-05-12.0
logs/csp/command-center.log.2022-05-12.0.lck
logs/csp/command-center.log.2022-05-13.0
logs/csp/command-center.log.2022-05-16.0
logs/csp/command-center.log.2022-05-16.0.lck
logs/csp/command-center.log.2022-05-17.0
logs/csp/command-center.log.2022-05-17.0.lck
logs/csp/command-center.log.2022-05-18.0
logs/csp/command-center.log.2022-05-18.0.lck
logs/csp/command-center.log.2022-05-20.0
logs/csp/command-center.log.2022-05-20.0.lck
logs/csp/command-center.log.2022-05-23.0
logs/csp/command-center.log.2022-05-23.0.lck
logs/csp/command-center.log.2022-05-25.0
......
#在服务端查看已经传输的文件
[root@rsync162 from_linux_client]# ll
总用量 0
drwxr-xr-x. 5 root root 48 5月 11 2022 logs
[root@rsync162 from_linux_client]# pwd
/backup/from_linux_client
[root@rsync162 from_linux_client]# ll
总用量 0
drwxr-xr-x. 5 root root 48 5月 11 2022 logs
[root@rsync162 from_linux_client]# ll logs/
总用量 20
drwxr-xr-x. 2 root root 16384 1月 28 09:22 csp
drwxr-xr-x. 2 root root 42 5月 10 2022 nacos
drwxr-xr-x. 2 root root 94 5月 12 2022 tecsun-job
(4)创建定时任务
#每台凌晨1点进行数据同步
[root@rsync164 ~]# crontab -e
* 1 * * * /root/rsync.sh
到此 Rsync + cron 实验完成,过程中会遇到定时任务执行没反应的问题,特别的 windows 下的定时任务,一个是要做好单独运行测试,一个是要点击定时任务运行测试,如果都没有问题就可以了。
二、Rsync + Inotify 场景使用
2.1 关于 Inotify
2.1.1 什么是 Inotify
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。需要注意的是,使用 Inotify 的系统内核要不低于 2.6.13。
特定需求下我们是需要对文件数据进行实时增量同步的,而实时同步的优点在于:一旦同步源出现变化,则立即进行同步,无变化则不执行。
在 Rsync 中,数据同步要么客户端向服务端推送文件,要么客户端从服务端下载文件,这里通过 Inotify 实现远程实时同步,就是用第一种方式。
2.1.2 Inotify 的辅助工具
- inotifywait: 用于持续监控,实时输出结果
- innotifywatch: 用于短期监控,任务完成后再出结果
2.2 Windows 客户端 Rsync 结合 Inotify 进行实时增量同步
前提:服务端搭建请参考《数据备份系列:Rsync 备份详解(一)》
2.2.1 Windows 下 Inotify 的安装
说明:windows下没有找到现成的 inotify 软件或程序可用,只能自己进行编译,然后结合前面的 cwrsync 进行使用,而要编译 inotify,需要先安装 Cygwin(作用是:Cygwin就是在Windows中增加了一个中间层——兼容POSIX的模拟层,并在此基础上构建了大量Linux-like的软件工具)
具体可参考知乎说明:Cygwin系列
(1)安装 Cygwin 过程
a.下载链接:官网下载
b.双击安装
注意:Cygwin 对部分 windows 已经弃用,如经典的 Windows Server 2008,本次实验使用的是 windows 10 系统。
步骤:下一页》从互联网安装》选择安装根目录》选择软件包目录》使用系统代理设置》选择可用下载站点》选择安装软件包
c.点开all》点开Devel》选择make版本》下一页执行安装》等待完成安装》完成安装》最后在系统的环境变量path中添加变量环境,默认安装的话是 C:\cygwin64\bin
(如果要安装其他的软件,重新运行安装软件进行选择即可)
d.下载:inotify-win-master.zip 文件并解压(下载地址:GitHub下载)
e.进入解压目录进行编译(前提是系统要安装 .NET Framework 执行完会生成 inotifywait.exe 执行文件)
C:\soft\cwRsync_5.4.1_x86_Free\inotify-win-master>C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:inotifywait.exe src\*.cs
C:\soft\cwRsync_5.4.1_x86_Free\inotify-win-master>inotifywait.exe
Usage: inotifywait [options] path [...]
Options:
-r/--recursive: Recursively watch all files and subdirectories inside path
-m/--monitor: Keep running until killed (e.g. via Ctrl+C)
-q/--quiet: Do not output information about actions
-e/--event list: Which events (create, modify, delete, move) to watch, comma-separated. Default: all
--format format: Format string for output.
--exclude: Do not process any events whose filename matches the specified regex
--excludei: Ditto, case-insensitive
Formats:
%e : Event name
%f : File name
%w : Path name
%T : Current date and time
2.3 Linux 客户端 Rsync 结合 Inotify 进行实时增量同步
2.3.1 Linux 下 Inotify 的安装
[root@rsync164 ~]# yum install -y inotify-tools
2.3.2 Linux 下 rsync+inotify 脚本操作
(1)inotify 将监控事件结果通过脚本来执行 while 循环内的 rsync 同步请求操作
[root@rsync164 ~]# vi rsync_inotify.sh
#/bin/bash
#rsync服务器
server=192.168.0.162
#传输用户
user=test
#密码文件
passwd=/etc/rsync.pass
#同步源文件(监控文件)
src=/opt/logs
#同步目标目录
dst=from_linux_client
#进行数据同步(提醒:生产环境中 --delete 参数要慎用)
rsync -azrtopg --delete --port 9999 --password-file $passwd $src $user@$server::proname/$dst
#监测 create,move,delete,modify 事件
/usr/bin/inotifywait -mrq -e create,move,delete,modify $src | while read files;do
rsync -azrtopg --delete --port 9999 --password-file $passwd $src $user@$server::proname/$dst
done
(2)客户端执行脚本测试
[root@rsync164 ~]# ll /opt/logs/
total 12
-rw-r--r-- 1 root root 1231 May 8 17:57 1.log
-rw-r--r-- 1 root root 21 May 8 17:58 2.log
-rw-r--r-- 1 root root 46 May 8 18:02 3.log
[root@rsync164 ~]# ./rsync_inotify.sh
#出现如下信息,说明密码错了,注意自己使用的用户和密码
[root@rsync164 ~]# ./rsync_inotify.sh
@ERROR: auth failed on module proname
rsync error: error starting client-server protocol (code 5) at main.c(1656) [sender=3.1.2]
(3)服务端查看接收文件信息
[root@rsync162 ~]# ll /backup/from_linux_client/
总用量 0
[root@rsync162 ~]# ll /backup/from_linux_client/
总用量 0
drwxr-xr-x. 2 root root 63 5月 8 2023 logs
[root@rsync162 ~]# ll /backup/from_linux_client/logs/
总用量 12
-rw-r--r--. 1 root root 1231 5月 8 2023 1.log
-rw-r--r--. 1 root root 21 5月 8 2023 2.log
-rw-r--r--. 1 root root 46 5月 8 2023 3.log
(4)客户端对监控的目录做变化,对比服务端接收情况
#a.客户端新增4.log文件
[root@rsync164 logs]# ll
total 16
-rw-r--r-- 1 root root 1231 May 8 17:57 1.log
-rw-r--r-- 1 root root 21 May 8 17:58 2.log
-rw-r--r-- 1 root root 46 May 8 18:02 3.log
-rw-r--r-- 1 root root 10 May 8 18:14 4.log
#服务端文件变化,可以看到服务端也新增了4.log文件
[root@rsync162 ~]# ll /backup/from_linux_client/logs/
总用量 16
-rw-r--r--. 1 root root 1231 5月 8 2023 1.log
-rw-r--r--. 1 root root 21 5月 8 2023 2.log
-rw-r--r--. 1 root root 46 5月 8 2023 3.log
-rw-r--r--. 1 root root 10 5月 8 2023 4.log
#b.客户端修改3.log内容(如新增)
[root@rsync164 logs]# ll
total 16
-rw-r--r-- 1 root root 1231 May 8 17:57 1.log
-rw-r--r-- 1 root root 21 May 8 17:58 2.log
-rw-r--r-- 1 root root 129 May 8 18:29 3.log
-rw-r--r-- 1 root root 10 May 8 18:14 4.log
#服务端文件变化,可以看到3.log文件大小也变了
[root@rsync162 ~]# ll /backup/from_linux_client/logs/
总用量 16
-rw-r--r--. 1 root root 1231 5月 8 2023 1.log
-rw-r--r--. 1 root root 21 5月 8 2023 2.log
-rw-r--r--. 1 root root 129 5月 8 2023 3.log
-rw-r--r--. 1 root root 10 5月 8 2023 4.log
#c.客户端删除2.log文件
[root@rsync164 logs]# rm 2.log
rm: remove regular file ‘2.log’? y
#服务端查看文件变化,可以看到2.log也没了(--delete参数起的作用)
[root@rsync162 ~]# ll /backup/from_linux_client/logs/
总用量 12
-rw-r--r--. 1 root root 1231 5月 8 2023 1.log
-rw-r--r--. 1 root root 129 5月 8 2023 3.log
-rw-r--r--. 1 root root 10 5月 8 2023 4.log
(5)后台运行持续监控脚本
[root@rsync164 ~]# ./rsync_inotify.sh &