LOADING

正在加载

rsync详解

壹 rsync简介

1.1 介绍

rsyncremote synchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分(即支持增量备份),因此其传输速度相当快。除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。

在远程同步任务中,负责发起rsync同步操作的客户机称为发起端(客户端),而负责响应来自客机的rsync同步操作的服务器称为备份源(服务端)。

1.2 优缺点

  • 优点:
可以保存整个目录树和文件系统
可以保持原来文件的权限、时间、软硬链接等
无需特殊权限即可安装
增量备份:第一次同步时rsync复制全部内容,但在下一次只传输修改过的内容
压缩传输:rysnc在传输的过程中可以实行压缩及解压缩操作,可以使用更少的带宽
安全:可以使用scp、ssh等方式来进行文件传输
支持匿名传输,以方便进行网站镜像
不仅可以远程同步数据(类似于scp),而且可以本地同步数据(类似于cp),做差异同步
  • 缺点:
大量小文件同步,时间长,有时会导致rsync进程中断或挂起
由于rsync同步时,需要将客户端与服务端的文件进行对比,所以在文件数量庞大时,对比速度较慢,同时压缩过程也慢
在同步大文件时,可能存在rsync进程中断,不过可以通过参数`--partail`来实现续传
在同步完成前,文件是隐藏的,但是磁盘占用是发生的,如果在传输时出现中断就会生成隐藏文件占用磁盘资源

1.3 rsync与scp区别

可能有人会问为什么不用scp,而用rsync

  • scp不支持软硬链接拷贝,而rsync支持本地、远程的软硬链接拷贝
  • scp更多的使用场景是复制,而rsync更多的是同步,rsync只需要将第一次的数据同步给另一个环境,后面就可以通过增量备份的方法将出现不同的地方进行更新即可
  • 在设置服务器同步数据时,建议使用rsync,而在复制时scprsync的作用差不多,均可使用

所以需要在Liunx/Unix服务器之间互传海量数据时,建议选择rsync进行传输。

贰 rsync工作原理

2.1 rsync工作原理

rsync的工作原理就是客户端要给服务端同步数据时,客户端会构造FileList(我们可以理解为客户端文件的被切成很多个数据块的校验值),客户端将FileList发送给服务端,服务端将本地的文件也进行构造FileList,然后与客户端发来的FileList进行对比,保留不同的地方的校验值信息,将这些信息再构造成新的NewFileList,发给客户端,客户端将这些对应的数据传输给服务端,即可实现增量同步。

2.2 三种工作模式

  • local模式
    这种模式其实就是在本地进行数据同步,就类似与cp命令。因为只能是本地同步,所以在进行异地服务器间同步时,不建议使用。

  • remote shell模式
    通过ssh隧道进行传输,用于不同的服务器之间,类似与scp命令。该模式可以进行异地间同步,而且不需要配置rsync配置文件,但是需要系统的用户,这时候如果泛用或者滥用,就会导致用户名密码泄露。

  • daemon模式
    该模式是通过守护进程运行的,为其他客户端提供备份源,配置rsync备份源需要建立配置文件rsync.conf,创建备份账户,然后将rsync程序以--daemon选项运行。该模式更适合在异地同步,因为客户端只需要知道一个虚拟的用户信息即可,但是需要服务端配置rsync配置文件,以下操作就是用的该模式。

叁 命令

格式:rsync [选项] 源文件 目标文件
常用选项:
-a:--archive,归档模式,表示以递归的方式传输文件,并且保持文件属性,等同于-rlptgoD
-r:-recursive,对子目录以递归模式处理
-v:显示同步过程的详细信息
--version:输出rsync版本
-z:--compress,表示压缩传输
--delete:删除那些目标位置有而备份源没有的文件,无差别备份,就相当于删除(慎用)
--delete-before: 接收者在传输之前进行删除操作
-H:-hard-links,表示硬链接文件
-l:--links,表示复制所有的连接,拷贝链接文件
-p:--perms,表示保持文件原有权限
-t:--times,表示保持文件原有时间
-g:--group,表示保持文件原有属用户组
-o:--owner,表示保持文件所有者,只能是root
-D:--devices,表示块设备文件信息,只能是root
-A:-acls,保留ACL属性信息,需要配合 -perms
-P:显示传输进度
-u:--update,仅仅进行更新,跳过所有已经存在于目标位置,并且文件时间晚于要备份的文件
--port=PORT:指定其他的rsync服务端口(预设为tcp 873)
--password-file=FILE:指定密码文件获取用户密码,只能在rsync运行使用
--bwlimit=KBPS:限制 I/O 带宽
--filter=filename:需要过滤的文件
--exclude=filname:需要过滤的文件
--progress:显示备份过程

肆 环境设置

服务端和客户端都要安装rsync

# centos
# 查看是否安装rsync
rpm -qa | grep rsync
# 安装rsync
yum install rsync -y

9d49f9649b0131c15e8a880b448048d6.png

# ubuntu
# 查看是否安装rsync
dpkg -l | grep rsync
# 安装rsync
apt install rsync -y

587b92201e4faf0f265593f4903dc51c.png

PS:时间的同步!

伍 设置rsync服务

我们假设一个场景存在两台服务器ABA为服务端,B为客户端。他们之间的网络带宽比较小,但是我们需要将B的数据同步到A中,这时候我们可以设置rsync服务。

假设服务端的IP地址是192.168.239.143,客户端的IP地址是192.168.239.164

5.1 服务端

创建配置文件rsyncd.conf

# 编辑/etc/rsyncd.conf文件

# 以 rsync 用户启动进程
uid = rsync
gid = rsync
 # 无需让rsync以root身份运行,允许接收文件的完整属性
fake super = yes
# 禁固推送的数据至某个目录, 不允许跳出该目录
use chroot = no
# 日志文件存放目录
log file = /var/log/rsyncd.log
# 最大连接数
max connections = 20
# 超时时间
timeout = 600
# 忽略错误程序、信息
ignore errors
# 是否允许查看模块信息
list = true

#### 以上是全局定义的配置,下面定义的是模块化基本信息,如果多个模块,直接在后面追加即可,当然如果需要模块内的配置设置为全局配置,将其放在上面的全局定义配置处即可
# 模块名称
[backup]
# 注释该模块作用
comment = commit
# 该模块同步的文件路径
path = /datebackup
# 定义该模块的虚拟用户,作为连接认证用户
auth users = myuser
# 定义rsync服务用户连接认证密码文件路径
secrets file = /etc/rsync.passwd
# 该模块内的备份数据是否只读
read only = false
# 准许访问rsync服务端的客户端IP地址范围
hosts allow = 192.168.239.0/24
# 禁止访问rsync服务端的客户端IP地址范围
# hosts deny = *

72b05a0e52dfd899dd2b45a80d4df442.png

配置并启动守护进程:

# 因为配置文件中设置了uid,所以我们可以需要一个rsync进程运行时使用的普通用户
useradd rsync -M -s /sbin/nologin

# 要连接服务端对应的模块,需要虚拟用户名和密码,如果有多个模块,可以设置全局用户名密码,这里设置的是模块内部的,密码文件的形式为user:passwd,需要注意这里的user一定要与rsyncd.conf配置的用户名一直
echo "myuser:password" > /etc/rsync.passwd
# 注意权限一定是600,否则客户端将不能连接服务器
chmod 600 /etc/rsync.passwd

# 创建模块同步的文件路径,客户端的数据都会存放在这里
mkdir /datebackup
# 添加权限
chown -R rsync.rsync /datebackup

# 启动daemon模式服务
rsync --daemon

# 加入开机自启动
echo "rsync --daemon" >> /etc/rc.local

# 查看服务
ps aux | grep rsync
netstat -lntp|grep 873

# 需要注意如果有防火墙阻拦,放开rsync服务即可

eb7475107fce597f70f204618940a1ea.png

5.2 客户端

客户端安装完rsync后,不需要启动rsync服务,只需要在客户端创建连接rsync服务器时,验证用户所需要的密码文件,该密码文件的密码与rsync的服务端密码文件中密码对应。

# 注意这里密码文件的形式不是user:passwd,而是passwd
echo "password" >> /etc/rsync.passwd
# 添加权限
chmod 600 /etc/rsync.passwd

可以通过查看rsync守护程序分配的所有module列表,确认服务端是否正常启动:

# 如果服务端没有开启,输出错误,否则可以看到模块列表,前提是服务端的rsyncd.conf配置文件中list = true,否则不输出
rsync rsync://服务端IP

a78c2624f9050ff16a60cb983921a380.png

进行数据同步:

把本地的文件同步到远程服务器
rsync [OPTION] [SRC] [USER@]HOST::DEST
# rsync [选项] [--port=]  [--password-file=] [本地路径] [用户名]@服务端IP::[模块名]
rsync -av --password-file=/etc/rsync.passwd /tmp myuser@192.168.239.143::backup

# 把远程机器的文件同步到本地
# rsync [OPTION] [USER@]HOST::SRC [DEST]
# rsync [选项] [--port=] [--password-file=] [用户名@]服务端IP::[模块名]  [本地路径]
rsync -av --password-file=/etc/rsync.passwd myuser@192.168.239.143::backup /tmp

# PS:
# 服务器与目标目录之间使用双冒号分隔"::",地址中的模块名并不是实际路径名,而是 rsync 守护程序指定的模块名

d31186dbea5430819c546425a401a62b.png

陆 设置定时任务实现自动同步

在客户端创建脚本:

touch /root/rsyncd.sh

在脚本文件中添加拉去文件的指令:

# vim /root/rsyncd.sh
rsync -avz --password-file=/etc/rsync.passwd /tmp myuser@192.168.239.143::backup >/dev/null 2>&1

授权脚本文件:

cd /root
chmod 755 rsyncd.sh

设置定时任务每小时同步一次:

# 执行crontab -e
0 * * * * /root/rsyncd.sh

8933d40ee9d151009cf566d49fdea1c7.png

柒 配置rsync时出现的问题

  • 问题1:rsync同步时由于注释问题引起的@ERROR: chdir failed
    这个问题一般是由于在rsync.conf配置文件下,存在注释导致的,例如:
    b3061194d8323deb7846eaa570c04e6a.png
    将其注释去掉即可解决。

  • 问题2:cwrsync module is read only
    这个问题是因为在rsync.conf配置文件中readonly参数配置不正确,应该设置为false

捌 参考

rsync工作原理
Rsync(优势、缺陷)
Linux如何实现自动文件同步
rsync详解
read only问题
chdir failed问题
scp与rsync常见区别
Rsync的三种工作模式

avatar
小C&天天

修学储能 先博后渊


今日诗句