目录

流式传输工具

系统备份(rsync)管理

什么是rsync

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应用比较广,能在同一台主机进行备份工作,还能在不同主机之间进行工作。在不同主机之间的进行备份,是必须架设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的新特性。

rsync的安装

软件安装过于简单,现在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   

rsync服务器的配置文件rsyncd.conf

我们可以参照 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,也可以指定整个网段,能提高安全性。
                    格式是ipipip和网段、网段和网段之间要用空格隔开;
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服务器

启动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 服务器。

rsync服务器和防火墙

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服务器上提供的内容

首先:我们看看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  

rsync 客户端同步数据

[geminis@linux.com:~]$rsync -avzP linux@linux.com::linuxhome /home/linux 

Password:

这里要输入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

rsync备份时排除指定目录或文件

要排除指定目录,可以在客户端命令行中使用–exclude-from命令

例如

rsync -avz --progress --delete --exclude-from=/home/pcfile root@a.b.c.d:/home/xxx /back/xxx

pcfile文件中,每条记录占一行,支持通配符

/tmp        ## 排除名为 tmp 的根目录  
.[a-z]*     ## 不备份以点开头的隐藏文件

Rsync与SSH结合进行文件同步

实现起来还是相对比较简单的。

1 安装 rsync.

我的操作系统是 AIX ,到 IBM 的站点下载软件.可以直接用 RPM 工具包远程安装。

2 创建公钥并配置

为了避免每次都询问口令(假定 OpenSSH 已经安装就绪),需要创建密钥。用 ssh-keygen 工具。然后把公钥添加到 rsync 的 Server 端相关用户目录下的 .ssh/authorized_keys 文件中。

3 测试是否可正常运行

rsync -avz -e "ssh -p65422" --delete --exclude=/trash remote_host:/opt/backup/ /backup/

注:很多文档都提及需要Server端的 Demon 需要启动,如果通过 ssh 的方式是不用的。更为灵活一些。

4 定制 Crontab ,使得任务自动化运行.

rsync的几种优化应用方案

rsync是用来做文件同步的一个很好的工具,传统的rsync就是使两个目录的文件保持一致,但随着文件数量增多,rsync会造成同步缓慢,系统负载比较高,直至系统死机。

为了解决文件增多导致rsync变慢的问题,方案是很多的。

1、使源目录保存较少文件

这是一个传统优化办法,因为rsync虽然是同步所有文件,但和同步最近更新的文件是一个道理,因此将源服务器上的目录删除,仅仅保持最近更新的文件,文件数量就变得不但很少,而且是稳定的,随着时间推移,这数量也不会涨得很快。但这样做有个缺点,就是rsync不能使用删除模式,如果有文件要删除,可以将其弄成空文件,假如有更严格要求,可以另一个程序来删除。

2、使用/dev/shm内存分区

在源目录保持较少文件的前提下,将文件不存在硬盘上而放入内存,就可以避免系统IO带来的问题,但是这个内存分区在系统reboot后会丢掉所有数据,虽然并不常常需要reboot,但是其中的风险也需要计算清楚。

3、使用推送方式

因为性能问题是出现在rsync的客户端,用生产服务器抓取源服务器的话,性能问题就会出现在生产服务器上,这当然不很妥当。假如在生产服务器上使用rsync daemon,源服务器执行rsync命令将文件推送到生产服务器上,性能问题就转移到了源服务器上,这在一定程度可以保证生产服务器的稳定性。

4、仅用一台作同步比较

假如源服务器的文件要被同步到很多台生产服务器,那么会出现rsync并发。可以分析到这些生产服务器在同一时刻文件是一致的,因此每台机都和源服务器做一次比较就是浪费的。这时可以让源服务器和生产服务器同步一次,并且使用-v参数打印出log,其它生产服务器通过同步这个log记录的文件就可以避免数次比较过程。

5、使用inotify

inotify就不是rsync了,inotify是一个守护进程,它可以监控到文件目录下的文件变动情况,根据其输出然后用rsync做文件传输,就可以减掉文件比较这个环节。inotify使用并不复杂,对文件变更情况的监控是实时的,也不消耗很多性能。

6、双路同步

以上均是对rsync性能方面做优化,但是优化也会带来问题。在3、4、5号方案中,假如生产服务器有一台机器因为负载或其它问题reboot了,在reboot过程中同步就失败了,这部分失败的文件假如没有其它处理,就永远不会再同步到生产服务器上。这时可以使用多一路rsync来处理,譬如使用inotify,做到了实时同步,然后再每小时进行一次完整的rsync同步。这样就可以保证有很高的同步速度,又能使丢失文件的风险控制在一小时之内。

使用rsync最快速删除海量文件

要在Linux下删除海量文件的情况,需要删除数十万个文件,这个时候,我们常用的删除命令rm -fr * 就不好用了,因为要等待的时间太长。所以必须要采取一些非常手段。我们可以使用rsync来实现快速删除大量文件。

#建立一个空的文件夹
mkdir /tmp/test
#用rsync删除目标目录
rsync -av -H --delete-before --progress --stats /tmp/test  log

这样我们要删除的log目录就会被清空了,删除的速度会非常快。

用rsync同步公司资料脚本

#!/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 .

比rsync更先进的同步方案

针对单大文件的物理切片

如果你坚持要对单个 100G 文件进行物理切片,可以使用以下流程:

1. 发送端:切片

使用 split 命令,它非常高效,能保持数据块的完整性。

# 将大文件切分为 1G 一个的块(生成 xaa, xab...)
split -b 1G bigfile.iso "part_"

2. 发送端:并行传输 (使用 GNU Parallel)

# 并发 10 个线程传输(100个可能导致 IO 跑满反而变慢,建议根据带宽调整)
ls part_* | parallel -j 10 rsync -avz {} user@remote:/path/to/dest/

3. 接收端:合并

# 按顺序合并
cat part_* > bigfile.iso
# 校验 MD5(必做)
md5sum bigfile.iso

更优雅的rclone方案 (无需物理切割)

使用 rclone 的多线程下载

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: 超过此大小的文件自动开启多线程。