rsync实现远程同步

什么是rsync

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
已支持跨平台,可以在Windows与Linux间进行数据同步。

以上内容来自于百度百科,本文记录的是Linux之间的同步,Linux与Windows系统之间的同步稍后研究。

安装

命令行测试一下rsync是否已安装:

[root@localhost etc]# rsync 
rsync  version 3.1.2  protocol version 31
Copyright (C) 1996-2015 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes, prealloc

说明rsync已经安装,否则,需要首先安装rsync:

 # CentOS
yum -y install rsync
# Ubantu
apt install rsync

之后验证一下,应该就OK了,安装很简单。

启动rsync服务

rsync命令执行的时候,相当于是rsync的客户端命令,rsync可以支持本地或远程的同步。在执行远程同步的时候,需要rsync服务端的支持。

我们把rsync服务端安装部署在需要进行远程同步文件(source)的一侧。安装rsync服务之后,启动服务:

[root@localhost etc]# systemctl status rsyncd.service
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2025-05-19 11:28:59 HKT; 2h 51min ago
 Main PID: 8330 (rsync)
    Tasks: 1
   Memory: 32.6M
   CGroup: /system.slice/rsyncd.service
           └─8330 /usr/bin/rsync --daemon --no-detach

如果看到以上信息,说明rsync服务已经启动,否则,需要手动启动下:

systemctl enable rsyncd.service
systemctl start rsyncd.service

启动之后,检查一下:
rsync实现远程同步_第1张图片
服务默认启动在873端口。

检查防火墙

这一步也是必要的,需要确保873端口被防火墙放行:

[root@localhost etc]# firewall-cmd --query-port=873/tcp
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'docker' (see --get-active-zones)
You most likely need to use --zone=docker option.

yes

如果没被放行,需要首先放行873端口:

firewall-cmd --permanent --add-port=873/tcp
# 重启
service firewalld restart

之后再firewall-cmd --query-port=873/tcp查询,应该看到开头的已经放行的内容。

配置rsync

首先编辑/etc/rsync.conf文件:

# /etc/rsyncd: configuration file for rsync daemon mode

# See rsyncd.conf man page for more options.

# configuration example:

uid = root
gid = root
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
exclude = lost+found/
transfer logging = yes
timeout = 900
ignore nonreadable = yes
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# [ftp]
#        path = /home/ftp
#        comment = ftp export area

auth users = root
secrets file = /etc/rsyncd.secrets


[tongbu]
  path = /jeecg-boot/dbbackup
  comment = backup db and sync to remote server
  ignore errors = yes
  read only = no
  list = no      #
  host allow = 192.168.31.197

我没有新建同步用户,直接用root进行同步了,其中[tongbu]模块下定义需要同步的本机内容,read only设置为no,host allow设置为另外一台将要远程获取本机/jeecg-boot/dbbackup目录下的待同步内容的机器。

之后,需要配置同步用户及密码,也就是/etc/rsync.conf文件中指定的secrets file = /etc/rsyncd.secrets的内容。

vi /etc/rsyncd.secrets
# 输入一下内容
root:yourrootpassword

保存退出,注意,用户名要和conf文件中指定的一致,密码要正确输入。

最后,需要注意rsync要求密码验证文件/etc/rsyncd.secrets必须只有rsync用户能访问、其他用户不能访问,所以,修改权限:

[root@localhost etc]# chmod 600 /etc/rsyncd.secrets
[root@localhost etc]# ls -lrt rsyncd.secrets
-rw-------. 1 root root 17 May 19 11:28 rsyncd.secrets
调整SELinux 策略

这一步也是不许的,否则客户端执行同步的时候会报错permission deny:

# 这是临时禁用
setenforce 0
# 调整 SELinux 策略以允许 rsync 正常运行:
setsebool -P allow_rsync_anon_write 1

服务端的准备工作就完成了。

客户端执行同步

切换到远程客户端(我上面的配置的192.168.31.197机器上),首先检查rsync是否已安装。

创建一个同步路径,到同步路径下,要执行的同步命令是:

rsync -avz [email protected]::tongbu --password-file=./rsyncd.passwd /dbbackup-198

执行之前,先需要创建一个password file:/rsyncd.passwd,所以,在当前路径下:

vi rsyncd.passwd
# 在rsyncd.passwd文件中只输入远程服务器执行rsync命令的用户密码,我配置的是root,所以,输入root的密码
yourrootpassword

之后保存文件,同样需要修改权限:

chmod 600 rsyncd.passwd

万事俱备,可以执行了:

root@kmkf2:/dbbackup-198# rsync -avz [email protected]::tongbu --password-file=./rsyncd.passwd /dbbackup-198
receiving incremental file list
rsync: opendir "/." (in tongbu) failed: Permission denied (13)

sent 24 bytes  received 114 bytes  276.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1865) [generator=3.2.7]
root@kmkf2:/dbbackup-198# rsync -avz [email protected]::tongbu --password-file=./rsyncd.passwd /dbbackup-198
receiving incremental file list
dbbackup.sh
dcom.sql.001.gz
doc.sql.gz
doc_sql.gz
ftpupload.sh
jeecg_20240808_020001.sql
jeecg_20250428_020002.sql.gz
jeecg_20250429_020001.sql.gz
jeecg_20250430_020001.sql.gz
jeecg_20250501_020001.sql.gz
jeecg_20250502_020001.sql.gz
jeecg_20250503_020001.sql.gz
jeecg_20250504_020001.sql.gz
jeecg_20250505_020001.sql.gz
jeecg_20250506_020001.sql.gz
jeecg_20250507_020001.sql.gz
jeecg_20250508_020001.sql.gz
jeecg_20250509_020001.sql.gz
jeecg_20250510_020001.sql.gz
jeecg_20250511_020001.sql.gz
jeecg_20250512_020001.sql.gz
jeecg_20250513_020001.sql.gz
jeecg_20250514_020001.sql.gz
jeecg_20250515_020001.sql.gz
jeecg_20250516_020001.sql.gz
jeecg_20250517_020001.sql.gz
jeecg_20250518_020001.sql.gz
jeecg_20250519_020001.sql.gz
newMes_20250428_020003.sql.gz
newMes_20250429_020002.sql.gz
newMes_20250430_020002.sql.gz
newMes_20250501_020002.sql.gz
newMes_20250502_020003.sql.gz
newMes_20250503_020002.sql.gz
newMes_20250504_020002.sql.gz
newMes_20250505_020002.sql.gz
newMes_20250506_020002.sql.gz
newMes_20250507_020002.sql.gz
newMes_20250508_020002.sql.gz
newMes_20250509_020002.sql.gz
newMes_20250510_020002.sql.gz
newMes_20250511_020002.sql.gz
newMes_20250512_020002.sql.gz
newMes_20250513_020002.sql.gz
newMes_20250514_020002.sql.gz
newMes_20250515_020002.sql.gz
newMes_20250516_020002.sql.gz
newMes_20250517_020002.sql.gz
newMes_20250518_020002.sql.gz
newMes_20250519_020002.sql.gz

sent 978 bytes  received 59,834,665 bytes  23,934,257.20 bytes/sec
total size is 69,179,201  speedup is 1.16
root@kmkf2:/dbbackup-198# ls -lrt
total 67672
-rwxr-xr-x 1 root root     421 May 26  2024 ftpupload.sh
-rw-r--r-- 1 root root 9302107 Aug  8  2024 jeecg_20240808_020001.sql
-rw-r--r-- 1 root root   47418 Sep 29  2024 doc.sql.gz
-rw-r--r-- 1 root root   63202 Oct  9  2024 doc_sql.gz
-rw-r--r-- 1 root root 5651427 Oct 21  2024 dcom.sql.001.gz
-rwxr-xr-x 1 root root     865 Apr 22 17:56 dbbackup.sh
-rw-r--r-- 1 root root 1594123 Apr 28 02:00 jeecg_20250428_020002.sql.gz
-rw-r--r-- 1 root root  843705 Apr 28 02:00 newMes_20250428_020003.sql.gz
-rw-r--r-- 1 root root 1594638 Apr 29 02:00 jeecg_20250429_020001.sql.gz
-rw-r--r-- 1 root root  844916 Apr 29 02:00 newMes_20250429_020002.sql.gz
-rw-r--r-- 1 root root 1595289 Apr 30 02:00 jeecg_20250430_020001.sql.gz
-rw-r--r-- 1 root root  846608 Apr 30 02:00 newMes_20250430_020002.sql.gz
-rw-r--r-- 1 root root 1595870 May  1 02:00 jeecg_20250501_020001.sql.gz
-rw-r--r-- 1 root root  849114 May  1 02:00 newMes_20250501_020002.sql.gz
-rw-r--r-- 1 root root 1596476 May  2 02:00 jeecg_20250502_020001.sql.gz
-rw-r--r-- 1 root root  849342 May  2 02:00 newMes_20250502_020003.sql.gz
-rw-r--r-- 1 root root 1597053 May  3 02:00 jeecg_20250503_020001.sql.gz
-rw-r--r-- 1 root root  849597 May  3 02:00 newMes_20250503_020002.sql.gz
-rw-r--r-- 1 root root 1597633 May  4 02:00 jeecg_20250504_020001.sql.gz
-rw-r--r-- 1 root root  849802 May  4 02:00 newMes_20250504_020002.sql.gz
-rw-r--r-- 1 root root 1598190 May  5 02:00 jeecg_20250505_020001.sql.gz
-rw-r--r-- 1 root root  850013 May  5 02:00 newMes_20250505_020002.sql.gz
-rw-r--r-- 1 root root 1598704 May  6 02:00 jeecg_20250506_020001.sql.gz
-rw-r--r-- 1 root root  850060 May  6 02:00 newMes_20250506_020002.sql.gz
-rw-r--r-- 1 root root 1599334 May  7 02:00 jeecg_20250507_020001.sql.gz
-rw-r--r-- 1 root root  853746 May  7 02:00 newMes_20250507_020002.sql.gz
-rw-r--r-- 1 root root 1599911 May  8 02:00 jeecg_20250508_020001.sql.gz
-rw-r--r-- 1 root root  856876 May  8 02:00 newMes_20250508_020002.sql.gz
-rw-r--r-- 1 root root 1600405 May  9 02:00 jeecg_20250509_020001.sql.gz
-rw-r--r-- 1 root root  859506 May  9 02:00 newMes_20250509_020002.sql.gz
-rw-r--r-- 1 root root 1600950 May 10 02:00 jeecg_20250510_020001.sql.gz
-rw-r--r-- 1 root root  860582 May 10 02:00 newMes_20250510_020002.sql.gz
-rw-r--r-- 1 root root 1601526 May 11 02:00 jeecg_20250511_020001.sql.gz
-rw-r--r-- 1 root root  860747 May 11 02:00 newMes_20250511_020002.sql.gz
-rw-r--r-- 1 root root 1602177 May 12 02:00 jeecg_20250512_020001.sql.gz
-rw-r--r-- 1 root root  860891 May 12 02:00 newMes_20250512_020002.sql.gz
-rw-r--r-- 1 root root 1602745 May 13 02:00 jeecg_20250513_020001.sql.gz
-rw-r--r-- 1 root root  864541 May 13 02:00 newMes_20250513_020002.sql.gz
-rw-r--r-- 1 root root 1603250 May 14 02:00 jeecg_20250514_020001.sql.gz
-rw-r--r-- 1 root root  868116 May 14 02:00 newMes_20250514_020002.sql.gz
-rw-r--r-- 1 root root 1603868 May 15 02:00 jeecg_20250515_020001.sql.gz
-rw-r--r-- 1 root root  872937 May 15 02:00 newMes_20250515_020002.sql.gz
-rw-r--r-- 1 root root 1604417 May 16 02:00 jeecg_20250516_020001.sql.gz
-rw-r--r-- 1 root root  876103 May 16 02:00 newMes_20250516_020002.sql.gz
-rw-r--r-- 1 root root 1604916 May 17 02:00 jeecg_20250517_020001.sql.gz
-rw-r--r-- 1 root root  880954 May 17 02:00 newMes_20250517_020002.sql.gz
-rw-r--r-- 1 root root 1605475 May 18 02:00 jeecg_20250518_020001.sql.gz
-rw-r--r-- 1 root root  881159 May 18 02:00 newMes_20250518_020002.sql.gz
-rw-r--r-- 1 root root 1606100 May 19 02:00 jeecg_20250519_020001.sql.gz
-rw-r--r-- 1 root root  881396 May 19 02:00 newMes_20250519_020002.sql.gz
-rw------- 1 root root      12 May 19 11:31 rsyncd.passwd
root@kmkf2:/dbbackup-198# 
root@kmkf2:/dbbackup-198# 
root@kmkf2:/dbbackup-198# 
root@kmkf2:/dbbackup-198# rsync -avz [email protected]::tongbu --password-file=./rsyncd.passwd /dbbackup-198
receiving incremental file list

sent 24 bytes  received 1,895 bytes  3,838.00 bytes/sec
total size is 69,179,201  speedup is 36,049.61

执行完成后,再次执行,rsync监测到文件没有变化,没有任何需要同步的内容。

定时执行

创建一个rsync.sh文件:

cd  /dbbackup-198

rsync -avz [email protected]::tongbu --password-file=./rsyncd.passwd /dbbackup-198

修改可执行权限:

root@kmkf2:/dbbackup-198# chmod 755 rsync.sh

# crontab -e 编辑自动任务
crontab -e
# 加入如下一行,每天凌晨2点执行任务
00 02 * * * /dbbackup-198/rsync.sh

保存退出,自动任务设置完成。目标服务器198上每天凌晨2点自动执行数据库备份,之后,凌晨3点rsync自动将备份文件同步到197上,实现了重要文件的定时自动双机备份。

推送

上面的命令是从rsync服务器拉取数据到客户端,推送命令也比较简单,rsync的源和目的地交换一下位置就可以:

rsync -avz  --password-file=./rsyncd.passwd  /dbbackup-198 [email protected]::tongbu

rsync命令中涉及到的路径有两部分,放在前面的是源,放在后面的目的地,所以,上面的命令放在前面的部分 /dbbackup-198 是本地路径,是源路径,放在后面的[email protected]::tongbu是远程路径,是目的地。因此,实现的就是从本地推送文件到远程服务器上。

和windows系统之间的同步

安装cwRsync,作为rsync的客户端,服务端已经在linux安装好了,所以,windows上就不再安装rsync服务端了。

安装之后,新建一个rsync.password文件并且要配置好只有所有者有权限访问,其他权限都删掉(禁用继承之后就可以都删掉了)。之后执行同步命令:

rsync.exe -vzrtopgu --progress --password-file="/cygdrive/d/工作目录/rsync/rsync.password" /cygdrive/D/ttt/ [email protected]::tongbu

需要注意的是文件路径需要用POSIX格式比如/cygdrive/d/工作目录/rsync/rsync.password,不能用DOS格式的路径。

你可能感兴趣的:(rsync实现远程同步)