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 daemonLoaded: 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 agoMain PID: 8330 (rsync)Tasks: 1Memory: 32.6MCGroup: /system.slice/rsyncd.service└─8330 /usr/bin/rsync --daemon --no-detach
如果看到以上信息,说明rsync服务已经启动,否则,需要手动启动下:
systemctl enable rsyncd.service
systemctl start rsyncd.service
启动之后,检查一下:
服务默认启动在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 areaauth users = root
secrets file = /etc/rsyncd.secrets[tongbu]path = /jeecg-boot/dbbackupcomment = backup db and sync to remote serverignore errors = yesread only = nolist = 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 root@192.168.31.198::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 root@192.168.31.198::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 root@192.168.31.198::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.gzsent 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 root@192.168.31.198::tongbu --password-file=./rsyncd.passwd /dbbackup-198
receiving incremental file listsent 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-198rsync -avz root@192.168.31.198::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上,实现了重要文件的定时自动双机备份。