目录
一、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
核心步骤总结
-
环境准备与角色划分
-
sersync 服务端(192.168.236.134):负责监控源目录(
/data
)的文件变化,并触发 rsync 同步到目标服务器。 -
rsync 客户端(192.168.236.135):作为数据备份的目标服务器,通过 rsync 服务接收并存储同步数据。
-
-
rsync 客户端配置(目标服务器)
-
安装 rsync,创建
rsyncd.conf
配置文件,定义共享模块data
、认证用户及数据存储路径。 -
启动 rsync 服务并设置开机自启,确保作为守护进程持续运行。
-
-
sersync 服务端配置(源服务器)
-
安装 rsync 并配置认证密码文件,确保与 rsync 客户端的认证信息一致。
-
下载并部署 sersync,修改配置文件
confxml.xml
,指定监控路径(/data
)和目标服务器 IP 及模块名。
-
-
启动与验证
-
启动 sersync 时通过
-r
参数先执行完全同步,再通过inotify
机制实时监控文件变化,触发增量同步。 -
配置开机自启和监控脚本,确保服务异常时自动重启,提升可靠性。
核心工作流程解析
-
-
sersync 通过
inotify
持续监听源目录(/data
),当文件被创建、修改或删除时,立即捕获事件。 -
捕获事件后,sersync 调用 rsync 命令,将变化的数据同步到目标服务器的指定模块(
data
)。 -
rsync 基于文件哈希对比,仅传输有差异的部分,减少带宽占用和同步时间。
-
关键配置项说明
-
rsyncd.conf(客户端):定义共享模块的权限、认证用户和数据路径,确保 rsync 服务安全可靠。
-
confxml.xml(sersync 服务端):指定监控路径、目标服务器 IP 和模块名,以及 rsync 的同步参数(如
-artuz
表示归档、保留权限、时间戳等)。 -
认证机制:通过密码文件实现单向认证,确保只有授权的 sersync 服务端可向 rsync 客户端推送数据。
-
-
高可用性设计
-
开机自启:通过
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:表示协议类型,如
tcp
或udp
。 -
Recv-Q:接收队列的长度,若该值不为 0,可能意味着网络接收存在问题。
-
Send-Q:发送队列的长度,若该值较大,可能表示网络发送出现了阻塞。
-
Local Address:本地 IP 地址和端口号。
-
Foreign Address:远程主机的 IP 地址和端口号。
-
State:对于 TCP 连接,会显示连接状态,像
LISTEN
(监听)、ESTABLISHED
(已建立连接)、CLOSE_WAIT
(等待关闭)等;而 UDP 是无连接的,所以这一列通常为空。 -
PID/Program name:建立此连接的进程 ID 和程序名称。