rsync 是一个Unix系统下的文件同步和传输工具。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。
rsync 的主页在http://samba.anu.edu.au/rsync/ 目前最新稳定版本为 rsync-3.0.4
rsync 包括如下的一些特性:
能更新整个目录和树和文件系统; 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等; 对于安装来说,无任何特殊权限要求; 对于多个文件来说,内部流水线减少文件等待的延时; 能用rsh、ssh 或直接端口做为传输入端口; 支持匿名rsync 同步文件,是理想的镜像工具;
rsync 服务器架设比较简单,可能我们安装好rsync后,并没有发现配置文件,以及rsync服务器启动程序,因为每个管理员可能对rsync 用途不一样,所以一般的发行版只是安装好软件就完事了,让管理员来根据自己的用途和方向来自己架设rsync服务器;因为这个rsync应用比较广,能在同一台主机进行备份工作,还能在不同主机之间进行工作。在不同主机之间的进行备份,是必须架设rsync服务器的。
配合ssh公密钥一起使用,可以利用rsync实现加密的文件及目录同步,既可以节省带宽,又无安全顾虑。
在2.X的版本中,rsync备份时都是先列表再备份(添加或者删除),在处理大量文件时,会耗费比较多的内存。
备份的时候,rsync扫描到的每个文件(目录也一样),在它的列表中约占100字节的内存,如果加了–delete参数的话,占用的内存会更多。
例如我这里一台服务器,约800万的图片,而且更新比较频繁,文件数增长比较快,差不多每天增加约10万张。备份的时候,rsync大约占用了将近2G的内存,大量内存的占用,造成服务器物理内存不足,进而使用到swap,然后产生更高的iowait(交换内存),进而造成rsync列表更慢,并且影响到服务器上的业务。
对于这样的情况,在rsync 3.X出现之前,人们普遍给出的建议是把备份操作给拆分成若干个小的备份操作。比如原来有10个图片目录一起备份,现在拆成10个备份操作,每次只备份其中一个。另外,还有人建议减小目录的深度,这样可以减小目录的数量,可以减少rsync占用的内存。另外还有个叫做digisync的软件,是专门用来备份G级数量的文件的。
rsync 3.X采用的是incremental file list,与原来的 2.X相比,现在是一边列表一边备份(添加或删除)。这对于大量文件的备份操作来说,无疑节省了很多时间。
实测发现,rsync 3.0.4备份时占用的内存大约时4M,跟一个apache进程占用的内存差不多。
需要注意的是,源主机和目的主机必须都升级到 rsync 3.X 才能使用到rsync 3.X的新特性。
软件安装过于简单,现在Linux各大发行版都提供这个软件包,当然您也可以自己编译安装,在目前的情况下,我看没太大的必要;
[root@linux:geminis]$ sudo apt-get install rsync 注:在debian、ubuntu 等在线安装方法; [root@linux:geminis]# slackpkg install rsync 注:Slackware 软件包在线安装; [root@linux:geminis]# yum install rsync 注:Fedora、Redhat 等系统安装方法;
其它Linux发行版,请用相应的软件包管理方法来安装;如果是源码包,也就是用下面的办法;
[root@linux:/home/geminis]# tar xvf sync-xxxx.tar.gz 或sync-xxx.tar.bz2 [root@linux:/home/geminis]# cd sync-xxx [root@linux:/home/geminis/sync-xxx]# ./configure --prefix=/usr ;make ;make install
我们可以参照 rsyncd.conf.html。具体步骤如下;
[root@linux:~]#mkdir /etc/rsyncd 在/etc下创建rsyncd的目录,存放rsyncd.conf 和rsyncd.secrets [root@linux:~]#touch /etc/rsyncd/rsyncd.conf 注:创建rsyncd.conf ,这是rsync服务器的配置文件; [root@linux:~]#touch /etc/rsyncd/rsyncd.secrets 注:创建rsyncd.secrets ,这是用户密码文件; [root@linux:~]#chmod 600 /etc/rsyncd/rsyncd.secrets 注:为了密码的安全性,我们把权限设为600; [root@linux:~]#ls -lh /etc/rsyncd/rsyncd.secrets -rw------- 1 root root 14 2007-07-15 10:21 /etc/rsyncd/rsyncd.secrets [root@linux:~]#touch /etc/rsyncd/rsyncd.motd
下一就是我们修改 rsyncd.conf 和rsyncd.secrets 和rsyncd.motd 文件的时候了;
rsyncd.conf 是rsync服务器主要配置文件,我们来个简单的示例;比如我们要备份服务器上的 /home 和/opt ,在/home中,我想把geminis和samba目录排除在外;
# This line is required by the /etc/init.d/rsyncd script pid file = /var/run/rsyncd.pid 注:告诉进程写到 /var/run/rsyncd.pid 文件中; port = 873 注:指定运行端口,默认是873,您可以自己指定; address = 192.168.1.171 注:指定服务器IP地址; uid = nobody gid = nobdoy use chroot = yes 注:用chroot,在传输文件之前,服务器守护程序在将chroot 到文件系统中的目录中, 这样做的好处是可能保护系统被安装漏洞侵袭的可能。 缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。 read only = yes #limit access to private LANs hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0 注:在您可以指定单个IP,也可以指定整个网段,能提高安全性。 格式是ip 与ip 、ip和网段、网段和网段之间要用空格隔开; hosts deny=* max connections = 5 注:客户端最多连接数; motd file = /etc/rsyncd/rsyncd.motd #This will give you a separate log file #log file = /var/log/rsync.log #This will log every file transferred - up to 85,000+ per user, per sync #transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300 [linuxhome] 注:定义服务器哪个目录要被同步。每个模块都以[name]命名。名字就是在rsync客户端看到的名称 path = /home list=yes ignore errors auth users = linux secrets file = /etc/rsyncd/rsyncd.secrets comment = linux home exclude = geminis/ samba/ 注:exclude是排除的意思,要把/home目录下的geminis和samba 排除在外; geminis/和samba/目录之间有空格分开 ; [opt] path = /opt list=no ignore errors comment = optdir auth users = linux secrets file = /etc/rsyncd/rsyncd.secrets
注:关于 auth users 是必须在服务器上存在的真实的系统用户,如果你想用多个用户,那就以,号隔开;
比如 auth users = geminis , linux
密码文件:/etc/rsyncd/rsyncd.secrets的内容格式,限对其它用户组是不可读的
用户名:密码 linux:222222
注: 这里的密码值得注意,为了安全,你不能把系统用户的密码写在这里。
比如你的系统用户 linux 密码是 abcdefg ,为了安全,你可以让rsync 中的linux 为 222222 。这和samba的用户认证的密码原理是差不多的;
rsyncd.motd 文件;
它是定义rysnc 服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等;类似ftp服务器登录时,我们所看到的登录信息。 当然这在全局定义变量时,并不是必须的,你可以用#号注掉,或删除;我在这里写了一个 rsyncd.motd的内容为:
+++++++++++++++++++++++++++ + linux rsync 2002-2007 + +++++++++++++++++++++++++++
启动rsync 服务器相当简单,–daemon 是让rsync 以服务器模式运行;
[root@linux:~]#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
注: 如果你找不到rsync 命令,你应该知道rsync 是安装在哪了。比如rsync 可执行命令可能安装在了 /usr/local/bin目录;也就是如下的命令;
[root@linux:~]#/usr/local/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
当然您也可以通过模仿系统已有的启动脚本,写一个自动化的脚本来开机自动启动rysnc 服务器。
Linux 防火墙是用iptables,所以我们至少在服务器端要让你所定义的rsync 服务器端口通过,客户端上也应该让通过。
[root@linux:~]#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT [root@linux:~]#iptables -L 查看一下防火墙是不是打开了 873端口
首先:我们看看rsync服务器上提供了哪些可用的数据源;
[geminis@linux.com:~]$ rsync --list-only linux@linux.com:: ++++++++++++++++++++++++++\\ +++ linux rsync server ++\\ ++++++++++++++++++++++++++\\ linuxhome linux home
注: 前面是rsync 所提供的数据源,也就是我们在rsyncd.conf 中所写的[linuxhome]模块。而“linux home”是由[linuxhome]模块中的 comment 提供的;为什么没有把opt数据源列出来呢?因为我们在[opt]中已经把list=no了。
[geminis@linux.com:~]$ rsync --list-only linux@linux.com::linuxhome
[geminis@linux.com:~]$rsync -avzP linux@linux.com::linuxhome /home/linux
这里要输入linux的密码,是服务器端提供的,在前面的例子中,我们用的是 222222,输入的密码并不显示出来;输好后就回车;
注: 这个命令的意思就是说,用linux 用户登录到服务器上,把linuxhome数据,同步到本地目录/home/linux上。
当然本地的目录是可以你自己定义的,比如 linuxhome也是可以的;
当你在客户端上,当前操作的目录下没有linuxhome这个目录时,系统会自动为你创建一个;
当存在linuxhome这个目录中,你要注意它的写权限。
说明:
-a 参数,相当于-rlptgoD -r 是递归 -l 是链接文件,意思是拷贝链接文件 -p 表示保持文件原有权限 -t 保持文件原有时间 -g 保持文件原有用户组 -o 保持文件原有属主 -D 相当于块设备文件; -z 传输时压缩; -P 传输进度; --delete 同步删除; --exclude= 不包括后续目录; -e "ssh -p 22" 通过ssh加密同步传输文件,ssh端口为22
要排除指定目录,可以在客户端命令行中使用–exclude-from命令
例如
rsync -avz --progress --delete --exclude-from=/home/pcfile root@a.b.c.d:/home/xxx /back/xxx
pcfile文件中,每条记录占一行,支持通配符
/tmp ## 排除名为 tmp 的根目录 .[a-z]* ## 不备份以点开头的隐藏文件
实现起来还是相对比较简单的。
我的操作系统是 AIX ,到 IBM 的站点下载软件.可以直接用 RPM 工具包远程安装。
为了避免每次都询问口令(假定 OpenSSH 已经安装就绪),需要创建密钥。用 ssh-keygen 工具。然后把公钥添加到 rsync 的 Server 端相关用户目录下的 .ssh/authorized_keys 文件中。
rsync -avz -e "ssh -p65422" --delete --exclude=/trash remote_host:/opt/backup/ /backup/
注:很多文档都提及需要Server端的 Demon 需要启动,如果通过 ssh 的方式是不用的。更为灵活一些。
rsync是用来做文件同步的一个很好的工具,传统的rsync就是使两个目录的文件保持一致,但随着文件数量增多,rsync会造成同步缓慢,系统负载比较高,直至系统死机。
为了解决文件增多导致rsync变慢的问题,方案是很多的。
这是一个传统优化办法,因为rsync虽然是同步所有文件,但和同步最近更新的文件是一个道理,因此将源服务器上的目录删除,仅仅保持最近更新的文件,文件数量就变得不但很少,而且是稳定的,随着时间推移,这数量也不会涨得很快。但这样做有个缺点,就是rsync不能使用删除模式,如果有文件要删除,可以将其弄成空文件,假如有更严格要求,可以另一个程序来删除。
在源目录保持较少文件的前提下,将文件不存在硬盘上而放入内存,就可以避免系统IO带来的问题,但是这个内存分区在系统reboot后会丢掉所有数据,虽然并不常常需要reboot,但是其中的风险也需要计算清楚。
因为性能问题是出现在rsync的客户端,用生产服务器抓取源服务器的话,性能问题就会出现在生产服务器上,这当然不很妥当。假如在生产服务器上使用rsync daemon,源服务器执行rsync命令将文件推送到生产服务器上,性能问题就转移到了源服务器上,这在一定程度可以保证生产服务器的稳定性。
假如源服务器的文件要被同步到很多台生产服务器,那么会出现rsync并发。可以分析到这些生产服务器在同一时刻文件是一致的,因此每台机都和源服务器做一次比较就是浪费的。这时可以让源服务器和生产服务器同步一次,并且使用-v参数打印出log,其它生产服务器通过同步这个log记录的文件就可以避免数次比较过程。
inotify就不是rsync了,inotify是一个守护进程,它可以监控到文件目录下的文件变动情况,根据其输出然后用rsync做文件传输,就可以减掉文件比较这个环节。inotify使用并不复杂,对文件变更情况的监控是实时的,也不消耗很多性能。
以上均是对rsync性能方面做优化,但是优化也会带来问题。在3、4、5号方案中,假如生产服务器有一台机器因为负载或其它问题reboot了,在reboot过程中同步就失败了,这部分失败的文件假如没有其它处理,就永远不会再同步到生产服务器上。这时可以使用多一路rsync来处理,譬如使用inotify,做到了实时同步,然后再每小时进行一次完整的rsync同步。这样就可以保证有很高的同步速度,又能使丢失文件的风险控制在一小时之内。
要在Linux下删除海量文件的情况,需要删除数十万个文件,这个时候,我们常用的删除命令rm -fr * 就不好用了,因为要等待的时间太长。所以必须要采取一些非常手段。我们可以使用rsync来实现快速删除大量文件。
#建立一个空的文件夹 mkdir /tmp/test #用rsync删除目标目录 rsync -av -H --delete-before --progress --stats /tmp/test log
这样我们要删除的log目录就会被清空了,删除的速度会非常快。
#!/bin/sh # encoding: utf-8 OPTS="ssh -i ~/.ssh/upyun/hzup.ssh.2020 -p65422" rsync -avz -e "$OPTS" --exclude "du" --exclude "myswarm" --exclude "Python-2.7.15" root@115.231.xx.xx100.110:/disk/ssd1/work . rsync -avz -e "$OPTS" root@115.231.xx.xx100.110:/disk/ssd1/html/dokuwiki.shaohy .
如果你坚持要对单个 100G 文件进行物理切片,可以使用以下流程:
使用 split 命令,它非常高效,能保持数据块的完整性。
# 将大文件切分为 1G 一个的块(生成 xaa, xab...) split -b 1G bigfile.iso "part_"
# 并发 10 个线程传输(100个可能导致 IO 跑满反而变慢,建议根据带宽调整) ls part_* | parallel -j 10 rsync -avz {} user@remote:/path/to/dest/
# 按顺序合并 cat part_* > bigfile.iso # 校验 MD5(必做) md5sum bigfile.iso
rclone 在 2026 年依然是高性能传输的首选,它内置了多线程分块传输功能,不需要手动切片和合并。
rclone copy /src/bigfile.iso remote:path/ --multi-thread-streams 16 --multi-thread-cutoff 250M --multi-thread-streams 16: 开启 16 个并发流。 --multi-thread-cutoff: 超过此大小的文件自动开启多线程。