Rsync+sersync实现数据实时同步

目录

一、rsync概述

二、rsync运行原理

模式说明

2. 适用场景

三、rsync部署

四、备份测试

五、使用非系统用户备份数据

5.1 rsync的配置文件介绍

5.2 配置备份目录

5.3 使用rsync用户备份测试

5.4 pull拉取数据

六、rsync+sersync 实现数据实时同步

6.1 数据同步原理

6.2 部署rsync(支持增量同步)+sersync

6.3 设置rsync+sersync开机自启

七、总结

实验:部署rsync+sersync

核心步骤总结

部署步骤

1. rsync 客户端配置

2. sersync 服务端配置

3. 启动 sersync 服务

4. 设置监控脚本和定时任务

验证测试

输出示例及含义


一、rsync概述

Rsync(Remote Sync)是Linux系统下的数据镜像备份工具。该工具可以实现远程同步、不同主机之间的同步,也能实现全量备份增量备份,保持数据链接和权限,并采用优化的同步算法,传输前对数据进行压缩,故该工具非常适合架构集中式备份异地备份。也支持本地复制或与ssh、rsync同步。

官网地址:https://rsync.samba.org/

优点:

  • scp无法备份大量数据,而rsync备份、统计、比较一起进行。

  • 可以备份整个目录树和文件系统,并保持文件原来的权限、时间、软硬链接。

  • 安装较容易,无需特殊权限。

  • 同步快速,首次同步完全备份,再次同步增量备份。

  • 可以使用scp和ssh等方式传输备份文件

  • 支持匿名传输

  • 选择性保持:符号链接、硬链接、文件属性、权限、时间等

  • 传输速度快:压缩再传输、解压再使用,减少带宽。

# 查看版本信息
[root@server ~]# rsync --version
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 comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

备份分类:

  • 完全备份:所有文件进行备份

  • 差异备份:备份自上次完全备份以来所有的修改

  • 增量备份:备份自上次备份依赖所作的修改

二、rsync运行原理

rsync采用C/S模式,即点到点的传输。通过xinetd服务监听873端口,再让xinetd服务下的rsync服务作出响应。

源主机:需要同步数据的服务器

目标主机:存放服务器同步数据的主机

数据同步方式:push 和 pull

  • 推push:主动同步,把数据发送给目标主机。服务器开销大,适合后端服务器较少的情况。【服务器备份推给rsync客户端存放,主动模式】

    模式说明
    • 数据流向:从源服务器主动将数据 "推送" 到目标服务器

    • 角色分工:

      • sersync 服务端:负责监控文件变化,并触发 rsync 将数据推送到目标服务器。

      • rsync 客户端:仅需运行 rsync 服务,等待接收数据。

    2. 适用场景
    • 集中式备份:多台服务器的数据集中备份到一台中心服务器。

    • 实时同步:源服务器文件变化后立即同步到目标服务器。

    • 安全限制:目标服务器无法主动访问源服务器(如防火墙限制)。

目的主机配置为 rsync 服务端,源主机周期性的使用 rsync 命令把要同步的目录推过去。

  • 拉pull:所有客户端主机去服务器上面拉数据,导致数据传输缓慢。【rsync客户端去服务器上拉数据,存放到客户端上,被动模式】

源主机配置为 rsync 服务端,目的主机周期性的使用 rsync 命令把要同步的目录拉过来。

三、rsync部署

# rsync服务由xinetd服务进行管理,故也需要安装xinetd服务
# 客户端和服务器都需要安装xinetd服务和rsync服务
[root@server ~]# yum install xinetd rsync -y
[root@client ~]# yum install xinetd rsync -y
​
# rsync运行在daemon模式
[root@server ~]# rsync --daemon
[root@client ~]# rsync --daemon
​
# 查看是否监听873端口号
[root@server ~]# netstat -antup | grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      18927/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      18927/rsync 
[root@client ~]# netstat -antup | grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      9367/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      9367/rsync  
参数作用
-a–archive archive mode权限保存模式【递归、保持属性】
-r递归处理
-p保留文件原有属性
-t保留文件原有时间
-g保留属组
-o保留档案所有者
-D保留device咨询
-l复制所有的连接
-z压缩传输
-H保留硬链接文件
-A保留文件的ACL属性
-P–progress
–version输出rsync版本信息
-v显示输出过程
-u仅进行更新
–port指定端口号,默认873
-–delete删除那些目标位置有的文件而备份源没有的文件,最大程度的保持一致
–password-file指定密码文件
–bwlimit限制I/O带宽
–filter需要过滤的文件
–exclude需要过滤的文件
–progress显示备份过程
–avz常用:保留权限、显示同步过程、压缩传输

四、备份测试

# 由于rsync备份是会保持目录及其文件的权限、时间、软硬连接不变的,那要求备份在ssh传输过程中一路顺畅,不会因权限不足而备份失败。
# 这里创建test用户用于测试
[root@server ~]# useradd test && echo 123456 | passwd --stdin test
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@client ~]# useradd test && echo 123456 | passwd --stdin test
更改用户 test 的密码 。
passwd:所有的身份验证令牌已经成功更新。
​
# 服务端上创建测试目录/data
# g+s权限的作用在于/data目录下新增的文件的所属组都会是test
# setfacl为test用户创建在/data的rwx权限
[root@server ~]# mkdir /data
[root@server ~]# chown -R test:test /data
[root@server ~]# chmod g+s /data
[root@server ~]# setfacl -m u:test:rwx /data
[root@server ~]# cp -r  /boot/* /data
​
# 客户端上创建备份存放目录
[root@client ~]# mkdir  -p /data/backup/
[root@client ~]# chown test:test /data/backup/
[root@client ~]# ll -d /data/backup/
drwxr-xr-x. 2 test test 6 8月   6 23:52 /data/backup/
​
# 备份/data目录下的数据到客户端上
[root@server ~]# rsync -avz /data/ test@192.168.115.112:/data/backup
test@192.168.115.112's password: 
sending incremental file list
./
。。。省略备份信息。。。
sent 138,094,794 bytes  received 6,296 bytes  5,211,361.89 bytes/sec
total size is 152,364,618  speedup is 1.10
​
# 客户端上验证备份内容,可以看到有数据传输进去
[root@client ~]# du -sh /data/backup/
146M    /data/backup/
​
# 如果同步的时候,使用的不是ssh的22号端口,而是其他端口,比如222,要加-e参数指定端口号
rsync -avz /data/  -e "ssh -p 222" test@192.168.115.112:/data/backup 

五、使用非系统用户备份数据

5.1 rsync的配置文件介绍

rsync的配置文件:/etc/rsync.conf

# /etc/rsyncd.conf
#全局参数:对rsync服务器生效,优先级较低
port     # rsync占用端口号,默认是873
address  # 监听地址,一般是目标主机的IP地址
uid      # 运行进程的用户
gid      # 运行进程的用户组
max connections  # 最大连接数
lock file   # 最大连接数的锁文件
motd file   # 同步登录后的提示语,填写欢迎同步信息,自行创建
log file    # 日志文件
pid file    # 进程PID文件,自动生成
hosts allow  # 允许同步的主机
​
#模块参数:针对某一个目录定义的参数,优先级较高
[mod_name]    # 同步目录名
comment       # 描述信息
path          # 同步目录
read only     # 同步目录的读写权限
exclude       
exclude from
include
include from
auth users   # 备份的用户,自动创建,与系统用户无关
secrets file  # 存放rsync用户的密码文件
hosts allow
hosts deny
list
timeout
​
# 启动rsync就会生成一个对应的pid
[root@server ~]# ll /var/run/rsyncd.pid
-rw-r--r--. 1 root root 6 8月   8 09:46 /var/run/rsyncd.pid
[root@server ~]# cat /var/run/rsyncd.pid
18933
# 查看下/etc/rsyncd.conf的默认内容
# 可以使用man rsyncd.conf 命令查看更多选项信息
[root@server ~]# ll /etc/rsyncd.conf
-rw-r--r--. 1 root root 458 4月  11 2018 /etc/rsyncd.conf
[root@server ~]# cat /etc/rsyncd.conf 
# /etc/rsyncd: configuration file for rsync daemon mode
​
# See rsyncd.conf man page for more options.
​
# configuration example:
​
# uid = nobody
# gid = nobody
# 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

5.2 配置备份目录

  • 服务器:server 192.168.115.111 (需要进行数据备份的主机)

  • 客户端:client 192.168.115.112 (备份存储的主机)

# 在客户端上编写rsync配置文件,创建一个存放备份的同步目录
[root@client ~]# vim /etc/rsyncd.conf
port=873
address = 192.168.115.112
uid = root
gid = root
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
motd file = /etc/rsyncd.motd
hosts allow = 192.168.115.0/24
[data]
path = /data/backup
comment = bakcup data
read only = false
list = yes
auth users = rsyncuser
secrets file = /etc/rsync.passwd
​
# 创建欢迎信息文件
[root@client ~]# echo "Welcome to Backup Server" > /etc/rsyncd.motd
​
# 创建密码文件,格式   用户名:密码
# 设置密码文件权限为600或者700
[root@client ~]# echo "rsyncuser:123456" > /etc/rsync.passwd
[root@client ~]# chmod 600 /etc/rsync.passwd
[root@client ~]# mkdir  -p /data/backup/
# 启动xinetd服务,并加入到开机自启中
[root@client ~]# systemctl start xinetd
[root@client ~]# systemctl enable xinetd
# 如果已经启动了rsync服务,要使用非系统用户登录,则必须先把原先的rsync停下来。
[root@client ~]# systemctl stop rsyncd
[root@client ~]# rsync --daemon --config=/etc/rsyncd.conf
​
# 开放873端口号,允许通过873端口号同步数据
[root@client ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
[root@client ~]# firewall-cmd --reload 
success

5.3 使用rsync用户备份测试

# rsync用户一般是第一个普通用户,即UID为1001,故备份的所有者和所属组都为1001
# 服务端推送数据到共享目录位置
#rsync 选项 需要备份的目录 rsync用户名@存放备份的服务器IP::共享模块名 --password-file=密码文件
[root@server ~]# rsync -avz /data/
rsyncuser@192.168.115.112::data
Welcome to Backup Server
​
Password: 
sending incremental file list
。。。省略同步信息。。。
sent 138,094,811 bytes  received 6,297 bytes  6,137,827.02 bytes/sec
total size is 152,364,618  speedup is 1.10
​
# 如果想不输入密码,可以使用--password-file参数指定密码
[root@server ~]# cat /etc/rsync.passwd
123456
[root@server ~]# chmod 600 /etc/rsync.passwd
[root@server ~]# rsync -avz /data rsyncuser@192.168.115.112::data --password-file=/etc/rsync.passwd
​
# 如果想定时同步数据,可以设置定时任务。
[root@server ~]# vim autobackup.sh
[root@server ~]# cat autobackup.sh
#!/bin/bash
rsync -avz /data rsyncuser@192.168.115.112::data --password-file=/etc/rsync.passwd
[root@server ~]# chmod +x autobackup.sh
[root@server ~]# crontab -e
50 19 * * * bash /root/autobackup.sh

5.4 pull拉取数据

以上的同步过程都是服务端主动推送数据给目标主机,这里演示下目标主机主动拉取数据进行同步。

# 服务端上配置/etc/rsyncd.conf文件
[root@server ~]# vim /etc/rsyncd.conf 
port=873
address = 192.168.115.111
uid = root
gid = root
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
motd file = /etc/rsyncd.motd
hosts allow = 192.168.43.0/24
[data]
path = /data
comment = master data
read only = false
list = yes
auth users = rsyncuser
secrets file = /etc/rsync.passwd
# 认证文件
[root@server ~]# cat /etc/rsync.passwd 
rsyncuser:123456
# 服务端上启动rsync
[root@server ~]# rsync --daemon --config=/etc/rsyncd.conf
[root@server ~]# netstat -antup | grep 873
tcp        0      0 192.168.115.111:873      0.0.0.0:*               LISTEN      11040/rsync   
# 看到以上结果,说明服务端的rsync服务已经配置完成。
# 开放873端口号,允许通过873端口号拉取数据
[root@server ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
[root@server ~]# firewall-cmd --reload 
success
# 目标主机上拉取数据
[root@client ~]# rsync -avz rsyncuser@192.168.115.111::data /data/backup/
Welcome to Backup Server
​
Password: 
receiving incremental file list
。。。省略拉取过程。。。
sent 6,342 bytes  received 138,094,913 bytes  11,048,100.40 bytes/sec
total size is 152,364,627  speedup is 1.10

六、rsync+sersync 实现数据实时同步

6.1 数据同步原理

1、为什么要是用rsync+sersync

  • rsync:是一个强大的文件同步工具,支持增量同步(仅传输变化的数据),但需要手动触发同步命令,无法实时响应文件变化。

  • sersync:基于inotify机制(Linux 内核的文件系统监控接口),可实时监控目录变化(如创建、修改、删除等),但本身不具备同步功能,需调用 rsync 完成数据传输。

  • 结合优势:sersync 实时感知变化,rsync 高效执行同步,两者结合实现 “实时 + 增量” 的数据同步方案。

两者结合使用可以实现:

  • 实时监控文件系统变化

  • 高效的增量数据同步

  • 保持文件属性和权限

  • 灵活的同步策略配置

2、rsync+inotify-tools 与 rsync+sersync 架构的区别?

①inotify-tools只能记录目录发生了变化,但是不能具体到某个文件或者目录。

②rsync同步不清楚哪些文件或目录发生了变化,就会整个目录都同步,效率低。

3、同步过程:

①源服务器上开启sersync记录指定路径的文件系统变化情况。

②目标服务器上使用rsync命令把变化的数据同步到目标服务器上。

③源服务器上配置sersync服务,目标服务器安装rsync服务。

6.2 部署rsync(支持增量同步)+sersync

sersync服务端【同步服务器】:192.168.115.111

rsync客户端【存放备份,目标服务器】:192.168.115.112

由于sersync只能监控到差异变化,同步还是需要rsync去做,所以先确保rsync运行正常。可以测试一遍,看能否做完全同步。

[root@client ~]# rsync --daemon --config=/etc/rsyncd.conf
[root@client ~]# netstat -antup | grep rsync
tcp        0      0 192.168.115.112:873      0.0.0.0:*               LISTEN      9298/rsync   
# 添加到开机自启
[root@client ~]# vim /etc/rc.d/rc.local
rsync --daemon --config=/etc/rsyncd.conf
###备份源上测试
[root@server ~]# rsync -avz /data rsyncuser@192.168.115.112::data --password-file=/etc/rsync.passwd

开始部署sersync守护进程

# 解压并重命名为sersync
[root@server ~]# cd /opt
[root@server opt]# ll
总用量 712
-rw-r--r--. 1 root root 727290 8月   9 09:52 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@server opt]# tar xzf sersync2.5.4_64bit_binary_stable_final.tar.gz 
[root@server opt]# ll
总用量 712
drwxr-xr-x. 2 root root     41 10月 26 2011 GNU-Linux-x86
-rw-r--r--. 1 root root 727290 8月   9 09:52 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@server opt]# mv GNU-Linux-x86 sersync
[root@server opt]# ll
总用量 712
drwxr-xr-x. 2 root root     41 10月 26 2011 sersync
-rw-r--r--. 1 root root 727290 8月   9 09:52 sersync2.5.4_64bit_binary_stable_final.tar.gz
​
# 修改sersync的配置文件
# sersync服务总共就两个文件,一个配置文件,一个启动文件
[root@server ~]# cd /opt/sersync/
[root@server sersync]# ll
总用量 1772
-rwxr-xr-x. 1 root root    2109 8月   9 09:59 confxml.xml
-rwxr-xr-x. 1 root root 1810128 10月 26 2011 sersync2
[root@server ~]# vim /opt/sersync/confxml.xml
# 定义监控路径、同步的目标主机、共享模块
23     <sersync>
24         <localpath watch="/data">
25             <remote ip="192.168.115.112" name="data"/>
26         </localpath>
# 开启用户认证,并设置账号和密码 
29             <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.passwd"/>
# 开启sersync守护进程同步数据,即实时同步。
# -r参数,先做一次完全同步,再做差异同步。
[root@server ~]# /opt/sersync/sersync2 -d -r -o /opt/sersync/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d  run as a daemon
option: -r  rsync all the local files to the remote servers before the sersync work
option: -o  config xml name:  /opt/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
daemon start,sersync run behind the console 
use rsync password-file :
user is rsyncuser
passwordfile is     /etc/rsync.passwd
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data && rsync -artuz -R --delete ./ rsyncuser@192.168.115.112::data --password-file=/etc/rsync.passwd >/dev/null 2>&1 
[root@server ~]# run the sersync: 
watch path is: /data   # 可以看到监控的是/data
​
# 打开监控,查看实时同步情况
# 当目录/data下的文件或者目录有任何的变化,都会被监控到,并同步到目标主机上。
[root@server data]# watch ls -l

从以上测试可以看出,rsync+sersync已经部署完成,可以正常的同步数据到目标主机上。

6.3 设置rsync+sersync开机自启

# 设置开机自启
[root@server ~]# vim /etc/rc.d/rc.local
/opt/sersync/sersync2 -d -r -o /opt/sersync/confxml.xml
# 如sersync正常运行,通过ps命令可以看到进程已经开启。
[root@server ~]# ps aux | grep sersync2 | grep -v 'grep'| wc -l
1
​
# 检查sersync是否正常运行
[root@server ~]# vim /opt/check_sersync.sh
#!/bin/sh
while true
do
sersync="/opt/sersync/sersync2"
confxml="/opt/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ] ; then
  echo "sersync未开启,现在开启"
  echo "==============================="
  $sersync -d -r -o $confxml 
  echo "==============================="
  bash $0
else
  echo "sersync已正常开启"
  exit 0;
fi
sleep 1
done
[root@server ~]# chmod  +x /opt/check_sersync.sh
[root@server ~]# bash /opt/check_sersync.sh
​
# 设置两分钟检查一次sersync是否正常运行
[root@server ~]# crontab -e
*/2 * * * * sh /opt/check_sersync.sh &> /dev/null

七、总结

  • rsync可以进行数据的同步,可以使用推和拉两种方式。推即源主机推数据到目标主机,拉即目标主机从源主机上拉数据。

  • push:服务器向客户端推送数据,要在目标主机上配置一个共享目录,在服务端上使用rsync命令推送数据给目标主机。

  • pull:客户端向服务器拉去数据,需要把服务器上的同步目录配置成一个共享目录,然后客户端去这个共享目录上拉去数据。

  • 仅使用rsync同步数据,不会记录数据的变化,每次同步都是同步整个目录,不适合大量数据的同步。

  • 结合使用rsync+sersync,sersync负责监控源主机上同步目录的数据变化,rsync负责同步变化的部分,极大地提高了同步的效率。

实验:部署rsync+sersync

核心步骤总结

  1. 环境准备与角色划分

    • sersync 服务端(192.168.236.134):负责监控源目录(/data)的文件变化,并触发 rsync 同步到目标服务器。

    • rsync 客户端(192.168.236.135):作为数据备份的目标服务器,通过 rsync 服务接收并存储同步数据。

  2. rsync 客户端配置(目标服务器)

    • 安装 rsync,创建rsyncd.conf配置文件,定义共享模块data、认证用户及数据存储路径。

    • 启动 rsync 服务并设置开机自启,确保作为守护进程持续运行。

  3. sersync 服务端配置(源服务器)

    • 安装 rsync 并配置认证密码文件,确保与 rsync 客户端的认证信息一致。

    • 下载并部署 sersync,修改配置文件confxml.xml,指定监控路径(/data)和目标服务器 IP 及模块名。

  4. 启动与验证

    • 启动 sersync 时通过-r参数先执行完全同步,再通过inotify机制实时监控文件变化,触发增量同步。

    • 配置开机自启和监控脚本,确保服务异常时自动重启,提升可靠性。

    核心工作流程解析

  • sersync 通过inotify持续监听源目录(/data),当文件被创建、修改或删除时,立即捕获事件。

  • 捕获事件后,sersync 调用 rsync 命令,将变化的数据同步到目标服务器的指定模块(data)。

  • rsync 基于文件哈希对比,仅传输有差异的部分,减少带宽占用和同步时间。

  1. 关键配置项说明

    • rsyncd.conf(客户端):定义共享模块的权限、认证用户和数据路径,确保 rsync 服务安全可靠。

    • confxml.xml(sersync 服务端):指定监控路径、目标服务器 IP 和模块名,以及 rsync 的同步参数(如-artuz表示归档、保留权限、时间戳等)。

    • 认证机制:通过密码文件实现单向认证,确保只有授权的 sersync 服务端可向 rsync 客户端推送数据。

  2. 高可用性设计

    • 开机自启:通过rc.local脚本确保服务器重启后 rsync 和 sersync 自动启动。

    • 定时监控脚本:每 2 分钟检查 sersync 进程状态,异常时自动重启,避免因进程崩溃导致同步中断。

部署步骤

1. rsync 客户端配置

首先在 rsync 客户端(192.168.236.135)上进行配置:

#检查rsync是否安装
[root@rsync ~]# rpm -q rsync(适用CentOS/RHEL)
rsync-3.1.2-12.el7_9.x86_64
[root@sersync ~]# command -v rsync(通用有路径就表示安装)
/usr/bin/rsync
# 安装 rsync
yum install rsync -y
dnf install rsync
​
#(##注:yum与dnf区别:dnf:1.依赖解析速度更快,还能利用多线程下载。2.占用内存更少,在处理大量软件包时优势明显。3.自动依赖清理:卸载软件时,会自动删除不再需要的依赖包。4.事务处理:记录完整的操作历史,回滚更方便。
 ## 查看文件是否存在
#ls -l rsyncd.conf
-rw-r--r-- 1 root root 1234 Jun 19 10:00 rsyncd.conf 
#find . -name "rsyncd.conf"
./rsyncd.conf  # 文件存在于当前目录 )
​
# 创建配置文件
#[root@rsync etc]# vim /etc/rsyncd.conf
# 全局配置
uid = nobody
gid = nobody
use chroot = no         # 禁用chroot,允许更灵活的文件访问
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
​
# 数据模块配置
[data]
path = /data
comment = Data Backup
read only = false
list = false
auth users = rsyncuser
secrets file = /etc/rsyncd.secrets
perms = no              # 禁用权限保留,避免权限问题
preserve permissions = no
preserve groups = no    # 禁用组信息保留
strict modes = yes      # 严格检查密码文件权限
#或
​
#[root@rsync etc]# cat > /etc/rsyncd.conf << EOF
> uid = nobody
> gid = nobody
> use chroot = no
> max connections = 200
> timeout = 300
> pid file = /var/run/rsyncd.pid
> lock file = /var/run/rsync.lock
> log file = /var/log/rsyncd.log
> 
> [data]
> path = /data
> comment = Data Backup
> read only = false
> list = false
> auth users = rsyncuser
> secrets file = /etc/rsyncd.secrets
>perms = no              # 禁用权限保留,避免权限问题
>preserve permissions = no
>preserve groups = no    # 禁用组信息保留
>strict modes = yes      # 严格检查密码文件权限
> EOF
​
# 创建密码文件并设置权限
[root@rsync etc]# echo "rsyncuser:password" > /etc/rsyncd.secrets
[root@rsync etc]# chmod 600 /etc/rsyncd.secrets
​
# 创建数据目录
[root@rsync etc]# mkdir -p /data
[root@rsync etc]# chown nobody:nobody /data
[root@rsync etc]# chmod 775 /data
[root@rsync etc]# chmod 600 /etc/rsyncd.secrets
[root@rsync etc]# chown root:root /etc/rsyncd.secrets
#!!!特别注意当用 nobody时一定要注意权限问题。
> uid = nobody
> gid = nobody
​
​
# 启动 rsync 服务并设置开机自启
[root@rsync etc]# rsync --daemon --config=/etc/rsyncd.conf
#解释:启动 rsync 服务,以守护进程模式运行,并指定配置文件路径“--daemon” 参数,使 rsync 以守护进程的方式在后台运行,这样它可以持续运行,等待处理同步任务而不依赖于当前终端会话。
​
echo "rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.d/rc.local
#解释:
# 将 rsync 启动命令追加到 rc.local 文件,实现开机自启动
# 注意:这种方法适用于传统 SysV 初始化系统,在 systemd 系统中可能需要使用其他方式
​
chmod +x /etc/rc.d/rc.local
#为 rc.local 文件添加可执行权限,确保系统启动时能执行该脚本
​
# 验证服务是否启动
[root@rsync etc]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1069/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1186/master         
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      4262/rsync          

注释部分:

全局配置部分

uid = nobody        # 以 nobody 用户身份运行,降低安全风险
gid = nobody        # 以 nobody 用户组身份运行
use chroot = no     # 不使用 chroot 隔离(若设为 yes,启动时会将路径锁定在 path 指定的目录)
max connections = 200  # 最大并发连接数为 200
timeout = 300       # 超时时间为 300 秒(5 分钟),防止空闲连接占用资源
pid file = /var/run/rsyncd.pid  # 进程 ID 文件位置
lock file = /var/run/rsync.lock  # 锁文件位置,用于防止多个 rsync 实例冲突
log file = /var/log/rsyncd.log  # 日志文件位置

模块配置部分([data])

[data]              # 模块名称,客户端通过这个名称访问共享资源
path = /data        # 共享目录的实际路径
comment = Data Backup  # 模块描述信息
read only = false   # 允许写操作(设为 true 则只能读)
list = false        # 禁止客户端列出该模块(设为 true 时,客户端可通过 rsync --list-only 查看)
auth users = rsyncuser  # 允许访问的用户名(多个用户用逗号分隔)
secrets file = /etc/rsyncd.secrets  # 存储用户名和密码的文件路径

密码文件格式(/etc/rsyncd.secrets)

rsyncuser:password  # 格式为 "用户名:密码"

注意:此文件的权限必须设为 600(即 chmod 600 /etc/rsyncd.secrets),否则 rsync 会拒绝启动。

2. sersync 服务端配置

接着在 sersync 服务端(192.168.236.134)上进行配置:

# 安装 rsync
yum install rsync -y

# 创建密码文件(仅包含密码)
[root@sersync ~]# echo "1" > /etc/rsync.passwd
#把密码保存到临时文件,重启后依然有效,原因属于磁盘中的文件(要确保当前用户对该临时文件有操作权限)

[root@sersync ~]# chmod 600 /etc/rsync.passwd
#修改文件权限,让只有文件所有者能读写

# 创建数据目录
[root@sersync ~]# mkdir -p /data

#重启rsyncd
[root@sersync ~]# systemctl start rsyncd(启动)
[root@sersync ~]# systemctl status rsyncd(查看状态)
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled)
   Active: active (running) since 四 2025-06-19 20:50:06 CST; 4s ago

# 测试 rsync 完全同步
[root@sersync etc]#  rsync -avz /data rsyncuser@192.168.236.135::data --password-file=/etc/rsync.passwd
sending incremental file list
data/

sent 75 bytes  received 28 bytes  7.10 bytes/sec
total size is 0  speedup is 0.00


tou@ERROR: auth failed on module data
rsync error: error starting client-server protocol (code 5) at main.c(1656) [sender=3.1.2]
状态:失败

#解决
#看日志分析原因:权限问题
tail -f /var/log/rsyncd.log
sending incremental file list
rsync: chgrp "/data" (in data) failed: Operation not permitted (1)
data/

sent 57 bytes  received 95 bytes  10.48 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(1179) [sender=3.1.2]


# 下载并安装 sersync
cd /optls
wget
https://github.com/wsgzao/sersync/releases/download/2.5.4/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xzf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 sersync

# 配置 sersync
vim /opt/sersync/confxml.xml

修改 confxml.xml 配置文件:

<sersync>
    <localpath watch="/data">
        <remote ip="192.168.236.135" name="data"/>
    </localpath>
    <rsync>
        <commonParams params="-artuz"/>
        <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.passwd"/>
        <userDefinedPort start="false" port="874"/>
        <timeout start="false" time="100"/>
        <ssh start="false"/>
    </rsync>
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>
    <crontab start="false" schedule="600"/>
    <plugin start="false"/>
</sersync>
3. 启动 sersync 服务
# 启动 sersync(先完全同步,再实时监控)
/opt/sersync/sersync2 -d -r -o /opt/sersync/confxml.xml

# 验证 sersync 运行状态
ps aux | grep sersync2 | grep -v grep

# 设置开机自启
echo "/opt/sersync/sersync2 -d -r -o /opt/sersync/confxml.xml" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
4. 设置监控脚本和定时任务
# 创建监控脚本
cat > /opt/check_sersync.sh << EOF
#!/bin/bash
sersync="/opt/sersync/sersync2"
confxml="/opt/sersync/confxml.xml"
logfile="/var/log/sersync_check.log"

status=\$(ps aux | grep 'sersync2' | grep -v 'grep' | wc -l)
if [ \$status -eq 0 ]; then
    echo "\$(date) - sersync未运行,正在启动..." >> \$logfile
    \$sersync -d -r -o \$confxml
    echo "\$(date) - sersync启动完成" >> \$logfile
else
    echo "\$(date) - sersync正在运行" >> \$logfile
fi
EOF

# 设置脚本权限
chmod +x /opt/check_sersync.sh

# 添加定时任务(每2分钟检查一次)
crontab -e
# 添加以下内容
*/2 * * * * /opt/check_sersync.sh &> /dev/null

验证测试

# 在服务端创建测试文件
touch /data/test_file.txt

# 检查客户端是否同步
ls /data/  # 应该看到 test_file.txt

# 修改服务端文件
echo "Hello, Sersync!" > /data/test_file.txt

# 再次检查客户端文件内容
cat /data/test_file.txt  # 应该显示 "Hello, Sersync!"

补充

netstat -antup 是一个用于查看网络连接和网络状态的命令,下面为你详细解释:

命令参数解析

  • -a:显示所有的网络连接,不管是处于监听状态(如服务器程序),还是已建立的连接(如客户端程序)。

  • -n:直接使用 IP 地址和端口号来显示,而不是通过 DNS 反查主机名或服务名。这样能加快显示速度,避免 DNS 查询可能带来的延迟。

  • -t:仅显示 TCP 协议的连接。

  • -u:仅显示 UDP 协议的连接。

  • -p:显示建立连接的程序的 PID(进程 ID)和名称,这有助于你确定哪个程序正在使用网络连接。

输出示例及含义

执行这个命令后,你可能会看到类似下面的输出:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd
tcp        0      0 192.168.1.100:22        192.168.1.200:56789     ESTABLISHED 5678/sshd: user [pr
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      9012/postgres
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           1357/avahi-daemon: r
  • Proto:表示协议类型,如 tcpudp

  • Recv-Q:接收队列的长度,若该值不为 0,可能意味着网络接收存在问题。

  • Send-Q:发送队列的长度,若该值较大,可能表示网络发送出现了阻塞。

  • Local Address:本地 IP 地址和端口号。

  • Foreign Address:远程主机的 IP 地址和端口号。

  • State:对于 TCP 连接,会显示连接状态,像 LISTEN(监听)、ESTABLISHED(已建立连接)、CLOSE_WAIT(等待关闭)等;而 UDP 是无连接的,所以这一列通常为空。

  • PID/Program name:建立此连接的进程 ID 和程序名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值