文本目录
rsync命令介绍
rsync命令特性
rsync常用参数
rsync基础使用
rsync排除文件
rsync远程同步
rsync增量备份
rsync双向同步
企业数据存储需求
在企业里数据是重要的,因此需要将数据做好保存和备份,以此来避免由于一些特殊原因从而导致的数据丢失等严重问题。
这时可以考虑做一套 rsync + inotify 组成的文件实时双向自动同步功能
rsync 介绍
rsync 是远程(或本地)复制和同步文件常用的命令。借助 rsync 命令,你可以跨目录,跨磁盘和跨网络远程与本地数据进行复制和同步
举例来说:在两台Linux主机之间进行数据备份和镜像。本文介绍在Linux主机上进行远程和本地传输文件的常见用法,不需要root账户也可以允许rsync
rsync特性
高效地复制同步数据到对端,或者对端到本地
支持复制链接、设备、属主、属组、权限
rsync 使用远程更新协议 remote-update protocol ,这允许仅仅传输两组文件之间的差异
Rsync消耗较少的带宽,它使用压缩和解压缩方法,同时发送和接收数据
rsync同步基本说明
rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步。
不考虑rsync的实现细节,就文件同步而言,涉及了源文件和目标文件的概念,还涉及了以哪边文件为同步基准。
例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。
反之,如果想让本地主机上的文件和目标主机上的文件保持同步,则目标主机上的文件为同步基准,实现方式是将目标主机上的文件作为源文件拉取到本地。
当然,要保持本地的两个文件相互同步,rsync也一样能实现,这就像Linux中cp命令一样,以本地某文件作为源,另一文件作为目标文件,但请注意,虽然rsync和cp能达到相同的目的,但它们的实现方式是不一样的。
既然是文件同步,在同步过程中必然会涉及到源和目标两文件之间版本控制的问题,例如是否要删除源主机上没有但目标上多出来的文件,目标文件比源文件更新(newer than source)时是否仍要保持同步,遇到软链接时是拷贝软链接本身还是拷贝软链接所指向的文件,目标文件已存在时是否要先对其做个备份等等。
rsync同步过程中由两部分模式组成:决定哪些文件需要同步的检查模式以及文件同步时的同步模式。
-
检查模式是指按照指定规则来检查哪些文件需要被同步,例如哪些文件是明确被排除不传输的。
默认情况下,rsync使用"quick check"算法快速检查源文件和目标文件的大小、mtime(修改时间)是否一致,如果不一致则需要传输。
当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式。
rsync支持非常多的选项,其中检查模式的自定义性是非常有弹性的。
-
同步模式是指在文件确定要被同步后,在同步过程发生之前要做哪些额外工作。
例如上文所说的是否要先删除源主机上没有但目标主机上有的文件,是否要先备份已存在的目标文件,是否要追踪链接文件等额外操作。
rsync也提供非常多的选项使得同步模式变得更具弹性。
相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能。
rsync三种工作方式
本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。
前两者的本质是通过管道通信,即使是远程shell。而方式3则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。
常用参数
基础使用
| -r 参数
递归拷贝数据,不保留源文件属性
可以作为 cp 和 mv 命令的替代方法,将源目录同步到目标目录
# 针对单个文件
rsync -r /root/test01.txt /tmp
# 针对多个文件
rsync -r /root/test01.txt /root/test02.txt /tmp
| -a 参数
递归拷贝数据,保留源文件属性
-a 参数可以替代 -r ,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)
由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以 -a 比 -r 更有用
# 针对单个文件
rsync -a /root/test/test01.txt /tmp
# 针对目录下的所有文件
rsync -a /root/test/ /tmp
| --delete 参数
默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录
它不会使两个目录保持相同,并且不会删除文件
如果要使得目标目录成为源目录的镜像副本,则必须使用 --delete 参数,这将删除只存在于目标目录、不存在于源目录的文件
rsync -av --delete /root/test/ /tmp
排除文件
| --exclude 参数
有时,我们希望同步时排除某些文件或目录,这时可以用 --exclude 参数指定排除模式
注意,rsync 会同步以 " . " 开头的隐藏文件,如果要排除隐藏文件,可以这样写 --exclude=".*"
rsync -av --exclude=".*" /root/ /tmp
多个排除模式
--exclude="/root/test/*" 为排除该目录下的所有文件,但不包括目录本身
# 利用多个 --exclude 参数
rsync -av --exclude=".*" --exclude="/root/test/*" /root/ /tmp
# 利用 Bash 的大扩号的扩展功能
rsync -av --exclude={".*","/root/test/*"} /root/ /tmp
| --include 参数
用来指定必须同步的文件模式,往往与 --exclude 结合使用
# 指定同步时,排除所有文件,但是不包括以 .txt 结尾的文件
rsync -av --include="*.txt" --exclude='*' /root/ /tmp
远程同步
| SSH 协议
rsync 除了支持本地两个目录之间的同步,也支持远程同步
它可以将本地内容,同步到远程服务器
rsync -avz /root/test/ root@10.0.0.51:/test/
也可以将远程内容同步到本地
rsync -avz root@10.0.0.51:/test/ /root/test/
| rsync 协议
除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用 rsync://协议(默认端口873)进行传输
具体写法是服务器与目标目录之间使用双冒号分隔::
rsync -av /root/test/ 10.0.0.51::module/test/
注意,上面地址中的 module 并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配
如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令
rsync rsync://10.0.0.51
rsync 协议除了使用双冒号,也可以直接用 rsync:// 协议指定地址
rsync -av /root/test/ rsync://10.0.0.51::module/test/
增量备份
rsync 的大特点就是它可以完成增量备份,也就是默认只复制有变动的文件
除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录
具体做法是:
次同步是全量备份,所有文件在基准目录里面同步一份
以后每次同步都是增量备份,只同步源目录与基准目录之间有变动的部分
这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接
--link-dest 参数用来指定同步时的基准目录
rsync -a --delete --link-dest test02/path test01/path test03/path
上面命令中,--link-dest 参数指定基准目录 test02/path ,然后源目录 test01/path 跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录 test03/path
那些没变动的文件则会生成硬链接
这个命令的次备份时是全量备份,后面就都是增量备份了
rsync + inotify
| Server端
添加用户
useradd rsync -s /sbin/nologin
创建备份目录
mkdir -p /backup/
chown -R rsync: /backup/
创建身份验证文件
注意:
1、rsync服务是由那个用户启动的,该文件所属用户及用户组必须同启动用户
2、权限必须是600
echo "rsync_backup:123456" >> /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd
rsync配置文件(/etc/rsyncd.conf有直接vi没有直接创建)
# vi /etc/rsyncd.conf
######### 全局配置参数 ##########
port=888
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout =300
motd file = /var/rsyncd/rsync.motd
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
###########下面指定模块,并设定模块配置参数,可以创建多个模块###########
[backup]
path = /backup/ # 目录必须提前创建
ignore errors
read only = false
write only = false
#list = false
hosts allow = 10.0.0.0/24
auth users = rsync_backup
secrets file = /etc/rsyncd.passwd
启动服务
rsync --daemon
| Client端
免密登录文件
echo "123456" >> /etc/rsyncd.passwd # 只放密码即可
# 通过--password-file=/etc/rsyncd.passwd 指定文件
安装inotify
# 检查是否有安装inotify 如果没有就安装
rpm -qa inotify-tools
yum install inotify-tools –y
# 源码安装
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar -xf inotify-tools-3.14.tar.gz -C /application/
cd /application/inotify-tools-3.14
./configure
make&&make install
ln -s /application/inontify-tools-3.14 /application/inontify
测试监听路径
inotifywait -mrq --format '%T %w%f' -e creat /backup
# T 是指时间 w 是指路径 f 是指文件 详情看下方参数
总结
在本教程中,我们通过一些示例学习了如何使用 rsync 命令来复制或同步文件/目录。
感谢您的阅读,由于文档整理较费时费力,难免会有疏漏和不妥当地方,敬请谅解。
原文链接:https://mp.weixin.qq.com/s/2EzPIWO1vBIYNuh_DP0oYQ