本文介绍 Windows 平台上使用cwRsync
客户端实现
本地文件实时同步和远程实时同步的方法。
服务器和操作系统:
两台Windows Server 2008 服务器,一台linux CentOS 7服务器。
本地同步的环境信息:
源文件夹:D:/data/
目标文件夹:D:/backup/
远程同步的环境信息:
源Windows服务器IP地址:10.19.170.119
源文件夹:D:/data/
目标linux服务器IP地址:10.19.170.227
目标文件夹:/root/backup/
1. 在本地
windows
服务器上安装
cwRsync
客户端。
(1.1) 在
https://www.itefix.net/cwrsync
下载
cwRsync
客户端
注意:cwRsync 软件分为服务端和客户端。其中,服务端软件是收费的,客户端软件是免费的。这里只需要下载cwRsync 客户端。
(1.2) 下载完后,解压文件,得到文件夹
cwRsync_5.5.0_x86_Free
。
(1.3)
将
cwRsync_5.5.0_x86_Free
移动到常用的程序安装目录,这里我们移动到
D:\Program Files\
中
(1.4) 打开文件夹
cwRsync_5.5.0_x86_Free
,编辑其中的文件
cwrsync.cmd
里面有一行:
IF NOT EXIST %CWRSYNCHOME%\home\%USERNAME%\.ssh
MKDIR %CWRSYNCHOME%\home\%USERNAME%\.ssh
给 %CWRSYNCHOME% 的两边加上英文双引号””,并保存。如图:
(1.5) 双击修改后的
cwrsync.cmd
,程序会在
D:\Program Files\cwRsync_5.5.0_x86_Free
下面创建一个目录
home
,并把目录
bin
的路径注册到环境变量
path
中。
2. 如果要实现实时同步,需要时刻监控文件夹的变化。
Windows
本身提供了监控文件系统的功能。我们可以使用
powershell
来调用相关功能。
我们在“
D:\realtime_sync\”
中,编写脚本文件
realtime_sync.ps1,
其内容如下。它能够监控指定文件夹
“D:\data”
的变化(包括文件和文件夹
的创建、重命名、删除以及子文件夹中内容的变化),并将差异部分同步到远程服务器
10.40.239.236的备份目录
d:\backup\ 中。监控的周期是
2s
。
set-ExecutionPolicy unRestricted -force
$DebugPreference="inquire"
# 定义要监控的文件夹,这个文件夹必须先存在。
$sourceDir = 'D:\data\'
# linux 风格的文件夹路径,要以/cygdrive/ 开头,盘符后面没有“:”
$sourceDirLinuxStyle = '/cygdrive/d/data/'
#远程主机上的备份目录, linux 风格, 要以/cygdrive/ 开头,盘符后面没有“:”
$targetDir = ''/cygdrive/d/backup/'
# 定义每次监控的间隔时间,这里定义为2000毫秒,即2秒
$timeout = 2000
# 创建文件系统监视对象
$FileSystemWatcher = New-Object System.IO.FileSystemWatcher $folder
Write-Host ”按 CTRL+C 来退出对文件夹 $folder 的监控”
while ($true) {
# 监控文件夹内的所有变化
$result = $FileSystemWatcher.WaitForChanged('all', $timeout)
if ($result.TimedOut -eq $false)
{
rsync -avz --delete $sourceDirLinuxStyle $targetDir
}
}
Write-Host '监控被取消.'
3. 在后台运行该脚本:
powershell -windowstyle hidden D:\realtime_sync\realtime_sync.ps1.ps1
4. 如果想结束该进程,可以执行:
Get-WmiObject -class win32_process -filter "(name='powershell.exe' and CommandLine like '% D:\\realtime_sync\\realtime_sync.ps1%')" | ForEach-Object{$_.Terminate() | Out-Null }
Windows 平台间实时同步的方法很多,有很多第三方工具,这里不介绍。大家可以搜索。
3
.Windows 同步到 Linux
1. 在源主机,
windows
服务器上安装
cwRsync
客户端。
(1.1) 在
https://www.itefix.net/cwrsync
下载
cwRsync
客户端
注意:
cwRsync
软件分为服务端和客户端。其中,服务端软件是收费的,客户端软件是免费的。这里只需要下载
cwRsync
客户端。
(1.2) 下载完后,解压文件,得到文件夹
cwRsync_5.5.0_x86_Free
。
(1.3)
将
cwRsync_5.5.0_x86_Free
移动到常用的程序安装目录,这里我们移动到
D:\Program Files\
中
(1.4)
打开文件夹
cwRsync_5.5.0_x86_Free
,编辑其中的文件
cwrsync.cmd
。里面有一行:
IF NOT EXIST %CWRSYNCHOME%\home\%USERNAME%\.ssh
MKDIR %CWRSYNCHOME%\home\%USERNAME%\.ssh
给 %CWRSYNCHOME% 的两边加上英文双引号 "",并保存。如图:
(1.5) 双击修改后的
cwrsync.cmd
,程序会在
D:\Program Files\cwRsync_5.5.0_x86_Free
下面创建一个目录
home
,并把目录
bin
的路径注册到环境变量
path
中。
2. 注意,为了使
cwRsync
的功能可用正常使用,需保证环境变量
path
中不存在其他包含
rsync.exe
、
ssh.exe
或
ssh-keygen
的文件夹,或者虽然存在包含这些可执行程序的文件夹,但它们在
path
中的位置在
cwRsync
的路径后面。
例如:系统中有两个ssh时,
就要保证 path 中,
“D:\Program Files\cwRsync_5.5.0_x86_Free\bin; ” 在 “C:\Program Files\Git\usr\bin;” 的前面。
3. 在目标主机,
linux
服务器上,安装
rsync
或
lsync
中的一个。
rsync 的安装方法:
yum install rsync
lsync 的安装方法:
sudo yum install epel-release
sudo yum install lsyncd
4. 如果要求源主机主动将文件的差异部分发送给目标主机, 那么源主机需要免密连接到目标主机。所以要在源主机生成公钥和私钥,命令如下:
ssh-keygen -t rsa
输入命令后只需要一直点击enter键即可,直到出现如图界面,那么它提示你公钥和私钥保存在哪个位置。
打开公钥文件:
D:\Program Files\cwrsync_5.5.0_x86_free \home\Administrator\.ssh\id_rsa.pub
复制它的内容。
5. 在目标主机中,进入目录 /root/.ssh,编辑文件 authorized_keys,将源主机公钥的内容粘贴到文件末尾。
6. 在源主机和目标主机上启动
rsyncd
或
lsyncd
,并设置为开机自启动
systemctl start rsyncd
systemctl enable rsyncd
或者
systemctl start lsyncd
systemctl enable lsyncd
7. 这样,当我们执行
rsync -a -e " .\ssh -p 22" "/cygdrive/d/data/" [email protected]:/root/backup
即可将 windows 服务器上的 D:\DATA 的内容同步到 linux 服务器的/root/backup/ 中。
8. 如果要实现实时同步,需要时刻监控文件夹的变化。
Windows
本身提供了监控文件系统的功能。我们可以使用
powershell
来调用相关功能。
我们在
D:\realtime_sync\中,编写脚本文件
realtime_sync.
ps1,
其内容如下。它能够监控指定文件夹
“D:\data”
的变化(包括文件和文件夹
的创建、重命名、删除以及子文件夹中内容的变化),并将差异部分同步到远程服务器
10.40.239.236的备份目录
/root/backup/中。监控的周期是
2s
。
set-ExecutionPolicy unRestricted -force
$DebugPreference="inquire"
# 定义要监控的文件夹,这个文件夹必须先存在。
$sourceDir = 'D:\data\'
# linux 风格的文件夹路径,要以/cygdrive/ 开头,盘符后面没有“:”
$sourceDirLinuxStyle = '/cygdrive/d/data/'
#远程主机上的用户
$romoteUser = 'root'
#远程主机的地址
$remoteHost = '10.40.239.227'
#通信的端口
$remotePort = “22”
#远程主机上的备份目录
$targetDir = '/root/backup/'
# 定义每次监控的间隔时间,这里定义为2000毫秒,即2秒
$timeout = 2000
# 创建文件系统监视对象
$FileSystemWatcher = New-Object System.IO.FileSystemWatcher $folder
Write-Host ”按 CTRL+C 来退出对文件夹 $folder 的监控”
while ($true) {
# 监控文件夹内的所有变化
$result = $FileSystemWatcher.WaitForChanged('all', $timeout)
if ($result.TimedOut -eq $false)
{
rsync -avz --delete $sourceDirLinuxStyle –port=$remotePort $romoteUser”@”$remoteHost”:”$targetDir
}
}
Write-Host '监控被取消.'
9. 在后台运行该脚本:
powershell -windowstyle hidden D:\realtime_sync\realtime_sync.ps1.ps1
10. 如果你想结束该进程,执行下面的命令即可:
Get-WmiObject -class win32_process -filter "(name='powershell.exe' and CommandLine like '% D:\\realtime_sync\\realtime_sync.ps1%')" | ForEach-Object{$_.Terminate() | Out-Null }