cwRsync实现windows下文件定时同步

1、简介

cwRsync是Rsync在Windows上的实现版本,Rsync通过使用特定算法的文件传输技术,可以在网络上传输只修改了的文件。cwRsync主要用于Windows上的远程文件同步备份和同步,它包含Cygwin DLL和适用Cygwin版本的Rsync两部分。

Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同时保持原来文件的权限、时间、软硬链接。第一次同步时 rsync 会复制全部内容,下次只传输修改过的文件部分。传输数据过程中可以实行压缩及解压缩操作,减少带宽流量。支持scp、ssh及直接socket方式连接,支持匿名传输。支持Linux,Window平台。

2、背景

image-20200423100534341

当前架构中,有1台server,2台 client。server上的服务会生成数据文件,供2台client中的服务进行使用,需要确保新数据能够同步到2台client上。

3、解决方案

cwRsync是基于cygwin平台的rsync软件包,支持windows对windows、windows对Linux、Linux对windows高效文件同步。由于CwRsync已经集成了cygwin类库,因此安装的时候可以省去cygwin包。Cwrsync还集成了OpenSSH for windows,可以实现Linux 下Rsync一模一样的操作。使用 cwRsync 来同步文件后,只需要对一台主服务器进行文件修改,其他镜像服务器可以自动同步,包括文件的更新、删除、重命名等。

cwRsync分为付费版和免费版两种,我们只需要使用免费版即可,在官方网站上面下载cwRsync的客户端版本和服务器版本。

服务器版本:cwRsyncServer_4.1.0_Installer
客户端版本:cwRsyncClient_4.1.0_Installer

4、安装和配置

4.1 安装

对于cwRsync全部都是默认安装,对于server版本在安装过程中会提示要求我们输入Service account以及密码,如果我们不指定的话会使用SvcCWRSYNC这个账户,密码是随机生成的,所以要记住这个密码。但是在我后面的配置中,并没有用到这个Service account。

4.2 配置

cwRsync的架构很简单,有一个Server和多个Client组成。安装server版的cwRsync以后,在服务器上面启动cwRsync服务,然后在客户端上面执行文件同步命令即可实现文件同步功能。如果我们将文件同步命令添加到windows计划任务当中,就可实现定义同步的功能。

4.2.1 server端配置

在cwRsync的安装目录下,可以找到一个rsyncd.conf的配置文件,下面我根据自己实际的业务需求来讲名配置文件的修改方法,在第二节背景中我就已经讲到了,我有1台Server,2台Client。

在配置文件的下端,我们看到[data]标签,这就是我们需要同步的work目录,这里需要注意的就是对于文件目录名称的变更。我们看到配置文件中有一行写着”Remember cygwin naming conventions : c:\work becomes /cygwin/c/work”,也就是在windows系统下,目录地址为c:\work的,在我们的配置文件path中,需要修改为/cygwin/c/work。同样的,我们的当前想要同步的目录是D:\xxx\config,那么我就写成path = /cygdrive/d/xxx/config。其他的配置就按照给出的模板来配置即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
pid file = rsyncd.pid
port = 8173 #默认端口8173
uid = 0 #不指定uid,不加这一行将无法使用任何账户
gid = 0 #不指定gid
max connections = 10 #最大连接数10


# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#

[data]
path = /cygdrive/c/work #表示文件目录
read only = false
transfer logging = yes
lock file = rsyncd.lock
#hosts allow = 192.168.0.0/255.255.252.0
#hosts deny = * # 禁止除192.168.1.0/255.255.255.0段外的连接IP
#auth users = service-scada #认证用户名
#secrets file = rsync.password #认证用户的用户名和密码存储位置

在配置完毕以后,我们接下来就需要启动cwRsync的服务,我们将此服务设定为自动启动,如下图所示

在上面我们指定RsyncServer的端口是8173,我们可以通过netstat -an这个命令来检查8173端口是否被监听,如下图所示

4.2.2 客户端配置

在安装完cwRsync的客户端以后,我们看到默认的安装目录是C:\Program Files (x86)\cwRsync,我们记下这个安装目录,后面会用到这个安装目录。

在客户端上新建一个记事本,在记事本中输入以下信息:

1
2
3
C:
cd C:\Program Files (x86)\cwRsync\bin
rsync -av rsync://192.168.9.155:8173/data /cygdrive/c/work

然后再将此记事本重命名为config_rsync.bat,就形成了一个批处理文件。在批处理文件中,之所以需要添加第1、2行,是因为在安装cwRsync客户端的时候,并没有将cwRsync的程序目录添加到path这个环境变量当中,如果在环境变量path当中添加C:\Program Files (x86)\cwRsync\bin,则不需要在批处理中添加第1、2行

第三行”rsync -av rsync://192.168.9.155:8173/data /cygdrive/c/work “的含义是从服务器同步data文件,同步到本地的C:/work 目录下面。同步会以server上面的版本为准,如果在client上面存在同名文件会被替换。

4.3 通过计划任务客户端定时同步文件

前面通过批处理文件来实现文件同步还是手动操作,后面通过添加计划任务即可实现。我们添加一个叫做rsync_rsyncdata的计划任务,然后指定其运行脚本是rsync.bat,如下图所示:

注:这里我使用的是当系统启动时运行同步脚本,然后在稍微修改一下脚本,让它自动循环去执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
set choice=choice /t 60 /d y /n


:sync
c:
cd C:\Program Files (x86)\cwRsync\bin
rsync -av --delete-after rsync://192.168.9.155:8173/data /cygdrive/c/work
echo 最近一次同步时间: %date% %time%
goto sleep


:sleep
%choice%
goto sync

:exit
echo 请按任意键退出:
pause > null
exit

–delete-after 表示当server删除文件时,client端也同步删除

4.4 扩展内容

在这个例子中是让多个client端去server端拉取同步数据,当然也可以让server端分发到各个client端。

4.4.1安装方式

在server端安装cwRsyncClient,client端安装cwRsyncServer,各client端上的cwRsyncServer服务配置保持一致。

4.4.2 同步脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
set choice=choice /t 60 /d y /n


:sync
c:
cd C:\Program Files (x86)\cwRsync\bin
rsync -av --delete-after /cygdrive/c/test/ rsync://192.168.9.155:8173/config
echo 最近一次同步时间: %date% %time%
goto sleep


:sleep
%choice%
goto sync

:exit
echo 请按任意键退出:
pause > null
exit

同步脚本,跟前面最大的区别就是 “rsync -av –delete-after /cygdrive/c/test/ rsync://192.168.9.155:8173/config”

注意:/cygdrive/c/test 后面一定要加 / 号,否则同步过去的数据上层会多了个test目录

5、查看日志

对于文件同步的日志,只能在安装有服务器版cwRsync的机器上面查看。在5.1中提到了服务器端的配置文件,其中有一行是:log file = rsyncd.log。我们在安装目录下就能找到 rsyncd.log这个文件,打开文件我们可以看到所有的记录。下面我摘录部分日志信息

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
2020/04/23 10:58:43 [2144] rsyncd version 3.0.8 starting, listening on port 8173
2020/04/23 11:02:25 [1828] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:02:25 [1828] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:06:55 [2096] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:06:55 [2096] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:10:10 [2144] rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [Receiver=3.0.8]
2020/04/23 11:10:11 [1520] rsyncd version 3.0.8 starting, listening on port 8173
2020/04/23 11:19:40 [1520] rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [Receiver=3.0.8]
2020/04/23 11:19:41 [2748] rsyncd version 3.0.8 starting, listening on port 8173
2020/04/23 11:22:04 [2460] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:22:04 [2460] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:22:04 [2460] rsync: chdir /cygdrive/d/config failed
: No such file or directory (2)
2020/04/23 11:22:14 [1508] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:22:14 [1508] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:22:14 [1508] rsync: chdir /cygdrive/d/config failed
: No such file or directory (2)
2020/04/23 11:22:21 [2080] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:22:21 [2080] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:22:21 [2080] rsync: chdir /cygdrive/d/config failed
: No such file or directory (2)
2020/04/23 11:23:53 [2748] rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [Receiver=3.0.8]
2020/04/23 11:23:54 [2856] rsyncd version 3.0.8 starting, listening on port 8173
2020/04/23 11:24:01 [528] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:24:01 [528] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:24:01 [528] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:24:01 [528] building file list
2020/04/23 11:24:01 [528] send unknown [192.168.9.154] config () 1 - 副本.txt 0
2020/04/23 11:24:01 [528] send unknown [192.168.9.154] config () 1.txt 0
2020/04/23 11:24:02 [528] sent 186 bytes received 70 bytes total size 0
2020/04/23 11:24:28 [2096] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:24:28 [2096] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:24:28 [2096] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:24:28 [2096] building file list
2020/04/23 11:24:28 [2096] send unknown [192.168.9.154] config () 1.txt 0
2020/04/23 11:24:28 [2096] sent 147 bytes received 51 bytes total size 0
2020/04/23 11:25:21 [2068] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:25:21 [2068] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:25:21 [2068] rsync to config/ from unknown (192.168.9.154)
2020/04/23 11:25:21 [2068] receiving file list
2020/04/23 11:25:21 [2068] config/
2020/04/23 11:25:22 [2068] recv unknown [192.168.9.154] config () config/1 - 副本.txt 0
2020/04/23 11:25:22 [2068] recv unknown [192.168.9.154] config () config/2.txt 0
2020/04/23 11:25:22 [2068] sent 77 bytes received 177 bytes total size 0
2020/04/23 11:25:39 [2608] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:25:39 [2608] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:25:39 [2608] rsync to config/ from unknown (192.168.9.154)
2020/04/23 11:25:39 [2608] receiving file list
2020/04/23 11:25:39 [2608] sent 36 bytes received 96 bytes total size 0
2020/04/23 11:25:54 [2316] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:25:54 [2316] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:25:54 [2316] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:25:55 [2316] building file list
2020/04/23 11:25:55 [2316] send unknown [192.168.9.154] config () 1.txt 0
2020/04/23 11:25:55 [2316] send unknown [192.168.9.154] config () config/1 - 副本.txt 0
2020/04/23 11:25:55 [2316] send unknown [192.168.9.154] config () config/2.txt 0
2020/04/23 11:25:55 [2316] sent 295 bytes received 93 bytes total size 0
2020/04/23 11:45:19 [2904] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:45:19 [2904] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:45:19 [2904] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:45:19 [2904] building file list
2020/04/23 11:45:19 [2904] sent 172 bytes received 30 bytes total size 0
2020/04/23 11:46:18 [2272] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:46:18 [2272] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:46:18 [2272] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:46:19 [2272] building file list
2020/04/23 11:46:19 [2272] sent 172 bytes received 30 bytes total size 0
2020/04/23 11:47:18 [1884] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:47:18 [1884] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:47:18 [1884] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:47:19 [1884] building file list
2020/04/23 11:47:19 [1884] sent 172 bytes received 30 bytes total size 0
2020/04/23 11:48:18 [1308] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:48:18 [1308] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:48:18 [1308] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:48:19 [1308] building file list
2020/04/23 11:48:19 [1308] sent 172 bytes received 30 bytes total size 0
2020/04/23 11:49:18 [2844] forward name lookup for CWRSYNC failed: hostname nor servname provided, or not known
2020/04/23 11:49:18 [2844] connect from UNKNOWN (192.168.9.154)
2020/04/23 11:49:18 [2844] rsync on config/ from unknown (192.168.9.154)
2020/04/23 11:49:19 [2844] building file list
2020/04/23 11:49:19 [2844] sent 172 bytes received 30 bytes total size 0

6、Windows下rsync服务无法启动的解决方法

服务器在意外重启后,RsyncServer服务不能启动,提示“本地计算机上的reyncserver服务启动后又停止了”,方法是将安装目录下的rsyncd.pid文件删除或改名即可,再重新启动RsyncServer服务,OK,成功了,rsyncd.pid文件会自动重新生成。

7、rsync排除目录的使用方法

需求场景:当前希望将一台server上面的一个文件夹同步到2个client上面去,但是又不希望同步所有文件,由个别文件是不需要同步的,所以必须在server的配置文件中添加排除同步的文件,这就需要用到了exclude这个参数。这个可以在client上面使用,也可以直接在server上面的进行配置。下面的例子是在server的rsyncd.conf文件上面配置的。

案例:config文件目录下有test1、test2和test3这三个目录,这三个目录当中都有一个test.txt文件。下面通过不同的配置信息来实现不同的同步要求。

ENVISION——config——test1——test.txt

||———test2——test.txt

||———test3——test.txt

7.1 通过exclude关键字实现test1目录的例外

1
2
3
4
5
6
7
[config]
path = /cygdrive/d/ENVISION/config
#exclude from = rsync.exclude
exclude = test1/
read only = false
transfer logging = yes
lock file = rsyncd.lock

7.2 通过exclude from关键字实现test2和test3目录的例外

1
2
3
4
5
6
7
[config]
path = /cygdrive/d/ENVISION/config
exclude from = rsync.exclude
#exclude = test1/
read only = false
transfer logging = yes
lock file = rsyncd.lock

其中rsync.excluede文件跟rsyncd.conf在同一目录下,其中的文件内容是,其中“/”非常重要。

1
2
test2/
test3/

7.3 排除目录下的指定文件

exclude和exclude from不仅仅指限制与目录,也可以使指定的文件名。

在test1目录下添加一个文件test2.txt,然后进行如下配置

1
2
3
4
5
6
7
[config]
path = /cygdrive/d/ENVISION/config
exclude from = rsync.exclude
exclude = test1/test.txt
read only = false
transfer logging = yes
lock file = rsyncd.lock

再次执行同步命令,会发现test1/test2.txt会被同步,而test1/test.txt不会被同步。

-------------本文结束感谢您的阅读-------------