关于IT运维技术的
最佳实践博客网站

在Linux中 使用rsync 进行数据镜像备份和定时数据同步

rsync

rsync 简介

  • rsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机之间的文件。也可以使用 rsync 同步本地硬盘中的不同目录。
  • rsync 是用于替代 rcp 的一个工具,rsync 使用所谓的 rsync算法 进行数据同步,这种算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 您可以参考 How Rsync Works A Practical Overview 进一步了解 rsync 的运作机制。
  • rsync 的初始作者是 Andrew Tridgell 和 Paul Mackerras,目前由 https://rsync.samba.org 维护。
  • rsync 支持大多数的类 Unix 系统,无论是 Linux、Solaris 还是 BSD上 都经过了良好的测试。CentOS系统默认就安装了 rsync 软件包。 此外,在 windows 平台下也有相应的版本,如 cwrsync 和DeltaCopy 等。

rsync 具有如下的基本特性:

  1. 可以镜像保存整个目录树和文件系统
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等
  3. 无须特殊权限即可安装
  4. 优化的流程,文件传输效率高
  5. 可以使用 rsh、ssh 方式来传输文件,当然也可以通过直接的 socket 连接
  6. 支持匿名传输,以方便进行网站镜象

在使用 rsync 进行远程同步时,可以使用两种方式:

  • 远程 Shell 方式(建议使用 ssh,用户验证由 ssh 负责)
  • C/S 方式(即客户连接远程 rsync 服务器,用户验证由 rsync 服务器负责)。

无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。
本节重点介绍 rsync 客户命令的使用,有关 rsync 服务器的配置和使用请参见下节。
rsync 在首次复制时没有速度优势,速度不如 tar。
因此当数据量很大时您可以考虑先使用 tar 进行首次复制,然后再 使用rsync 进行数据同步

镜像、备份和归档

实施备份的两种情况:

  • 需保留备份历史归档:在备份时保留历史的备份归档,是为了在系统出现错误后能恢复到从前正确的状态。这可以使用完全备份和增量备份来完成。
    • 可以使用 tar 命令保存归档文件。
    • 为了提高备份效率,也可以使用 rsync 结合 tar 来完成。
  • 无需保留备份历史归档:若无需从历史备份恢复到正确状态,则只备份系统最“新鲜”的状态即可。这可以简单地使用 rsync 同步来完成。此时通常称为镜像。镜像可以分为两种:
    • 被镜像的目录在各个主机上保持相同的位置。此时一般是为了实施负载均衡而对多个主机进行同步镜像。例如:将主机 A 的 /srv/www 目录同步到主机 B 的 /srv/www 目录等。
    • 被镜像的目录在各个主机上不保持相同的位置。例如:主机 A 和主机 B 都运行着各自的业务,同时又互为镜像备份。此时主机 A 的 /srv/www 目录同步到主机 B 的 /backups/hosta/www 目录;主机 B 的 /srv/www 目录同步到主机 A 的 /backups/hostb/www 目录等。

rsync 命令

rsync 是一个功能非常强大的工具,其命令也有很多功能选项。rsync 的命令格式为:

1)本地使用:

rsync [OPTION...] SRC... [DEST]

2)通过远程 Shell 使用:

拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST:DEST

3)访问 rsync 服务器:

拉: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST::DEST
拉: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

说明:

  • SRC: 是要复制的源位置
  • DEST: 是复制目标位置
  • 若本地登录用户与远程主机上的用户一致,可以省略 USER@
  • 使用远程 shell 同步时,主机名与资源之间使用单个冒号“:”作为分隔符
  • 使用 rsync 服务器同步时,主机名与资源之间使用两个冒号“::”作为分隔符
  • 当访问 rsync 服务器时也可以使用 rsync:// URL
  • “拉”复制是指从远程主机复制文件到本地主机
  • “推”复制是指从本地主机复制文件到远程主机
  • 当进行“拉”复制时,若指定一个 SRC 且省略 DEST,则只列出资源而不进行复制

rsync 的基本使用

在本地磁盘同步数据

在指定复制源时,路径是否有最后的 “/” 有不同的含义。

实例1:将整个 /etc 目录复制到目标目录(包含目录本身)

rsync /etc /opt/

实例2:将 /opt 目录中的所有内容复制到目标目录(不包含目录本身)

rsync -avz /opt/ /mnt/

使用基于 ssh 的 rsync 远程同步数据

实例1:同步静态主机hosts文件

#执行“推送”复制同步:把本地/etc目录 推送到主机 /opt目录下面
rsync --delete -avzP /etc/* -e 'ssh -p 52113' root@10.8.0.132:/opt
#执行“拉取”复制同步:拉取主机/opt目录 到本地/etc下面
rsync --delete -avzP -e 'ssh -p 52113' root@10.8.0.132:/opt/* /etc

实例2:同步用户的环境文件

#执行“推送”复制同步:把本地的.bash*文件推送给远程主机某用户的主目录下
rsync --delete -avzP ~/.bash* -e 'ssh -p 52113' root@10.8.0.132:~
#执行“拉取”复制同步:把远程主机某用户的主目录下的.bash*文件推送给本地
rsync --delete -avzP -e 'ssh -p 52113' root@10.8.0.132:~/.bash* ~

实例3:同步站点根目录

#执行“推送”复制同步
rsync --delete -avzP /home/wwwroot/www.cnhzz.com -e 'ssh -p 52113' root@10.8.0.132:/home/wwwroot/www.cnhzz.com/
#执行“拉取”复制同步
rsync --delete -avzP -e 'ssh -p 52113' root@10.8.0.132:/home/wwwroot/www.cnhzz.com /home/wwwroot/www.cnhzz.com

说明:

  • avzP 是保持相关属性的参数,且显示复制详情,实际生产环境下,很少用显示详情,可以去掉v
  • –delete 删除那些接收端还有而发送端已经不存在的文件
  • -e ‘ssh -p 52113’是说使用SSH且端口号为52113
  • root@10.8.0.132 远程主机和用户
  • :后面跟的是远程主机的目录

###使用 rsync 从远程 rsync 服务器同步数据(Linux软件源同步)###

下面以镜像 CentOS 和 Ubuntu 的软件库为例来说明。
您可以到如下站点查找离自己最近的提供 rsync 服务的镜像站点

  • CentOS — https://www.centos.org/download/mirrors/
  • Ubuntu — https://launchpad.net/ubuntu/+archivemirrors

然后执行类似如下命令:

#centos镜像同步
rsync -aqzH --delete --delay-updates rsync://mirrors.hust.edu.cn/centos/ /var/www/mirror/centos
#Ubuntu镜像同步
rsync -aqzH --delete --delay-updates rsync://mirrors.sohu.com/ubuntu/ /var/www/mirror/ubuntu

为了每天不断更新,可以安排一个 cron 任务:

#打开定时任务编辑器
crontab -e
#每晚0点10分开始同步centos镜像
10 0 * * * rsync -aqzH --delete --delay-updates rsync://mirrors.hust.edu.cn/centos/ /var/www/mirror/centos
#每晚2点10分开始同步Ubuntu镜像
10 2 * * * rsync -aqzH --delete --delay-updates rsync://mirrors.sohu.com/ubuntu/ /var/www/mirror/ubuntu

筛选 rsync 的传输目标

使用 –exclude/–include 选项

可以使用 ––exclude 选项排除源目录中要传输的文件;同样地,也可以使用 ––include 选项指定要传输的文件。

实例1:例如:下面的 rsync 命令将 :10.8.0.132 主机上的 /www 目录(不包含 /www/logs 和 /www/conf子目录)复制到本地的 /home/wwwroot/www.cnhzz.com/

rsync -vzrtopg --delete --exclude "logs/" --exclude "conf/" --progress -e "ssh -p 52113" root@10.8.0.132:/home/wwwroot/www.cnhzz.com/ /home/wwwroot/www.cnhzz.com/

实例2:仅同步目录结构而忽略掉目录中的文件。

rsync -av --include '*/' --exclude '*' -e 'ssh -p 52113' root@10.8.0.132:/home/wwwroot/ /home/wwwroot/

####使用 –exclude-from/–include-from 选项 ####
当 include/exclude 的规则较复杂时,可以将规则写入规则文件。使用规则文件可以灵活地选择传输哪些文件(include)以及忽略哪些文件(exclude)。

  • 若文件/目录在剔除列表中,则忽略传输
  • 若文件/目录在包含列表中,则传输之
  • 若文件/目录未被提及,也传输之

在 rsync 的命令行中使用 ––exclude-from=FILE 或 ––include-from=FILE 读取规则文件。

规则文件 FILE 的书写约定:

  • 每行书写一条规则 RULE
  • 以 # 或 ; 开始的行为注释行

包含(include)和排除(exclude)规则的语法如下:

  • include PATTERN 或简写为 + PATTERN
  • exclude PATTERN 或简写为 PATTERN

PATTERN 的书写规则如下:

  • 以 / 开头:匹配被传输的跟路径上的文件或目录
  • 以 / 结尾:匹配目录而非普通文件、链接文件或设备文件
  • 使用通配符
  • *:匹配非空目录或文件(遇到 / 截止)
  • **:匹配任何路径(包含 / )
  • ?:匹配除了 / 的任意单个字符
  • [:匹配字符集中的任意一个字符,如 [a-z] 或 [[:alpha:]]
  • 可以使用转义字符 \ 将上述通配符还原为字符本身含义

几个使用规则的例子:

# 不传输所有后缀为 .o 的文件
    - *.o
# 不传输传输根目录下名为 foo 的文件或目录
    - /foo
# 不传输名为 foo 的目录
    - foo/
# 不传输 /foo 目录下的名为 bar 的文件或目录
    - /foo/bar
# 传输所有目录和C语言源文件并禁止传输其他文件
    + */
    + *.c
    - *
# 仅传输 foo 目录和其下的 bar.c 文件
    + foo/
    + foo/bar.c
    - *

实际案例一枚:把下面的规则写入文件www-rsync-rules文件

# 不传输 logs 目录
    - logs/
# 不传输后缀为 .tmp 的文件
    - *.tmp
# 传输 Apache 虚拟主机文档目录(/*/ 匹配域名)
    + /srv/www/
    + /srv/www/*/
    + /srv/www/*/htdocs/
    + /srv/www/*/htdocs/**
# 传输每个用户的 public_html 目录(/*/ 匹配用户名)
    + /home/
    + /home/*/
    + /home/*/public_html/
    + /home/*/public_html/**
# 禁止传输其他
    - *

执行rsync命令并且引入过滤规则

rsync -avzP --delete --exclude-from=www-rsync-rules /home/wwwrootbak/ -e 'ssh -p 52113' root@10.8.0.132:/home/wwwroot/www/
未经允许不得转载:菜鸟HOW站长 » 在Linux中 使用rsync 进行数据镜像备份和定时数据同步
分享到: 更多 (0)

留下你的脚印

1 评论 开启 "在Linux中 使用rsync 进行数据镜像备份和定时数据同步"

  订阅  
最新 最旧 得票最多
关注动态
过客

写得很详细,例子也很好,非常喜欢!