rsync
是一种非常常用的文件同步工具,能够在两台服务器之间高效地同步文件和目录。它支持增量传输,只同步发生了变化的文件部分,极大提升了传输效率。以下是使用 rsync
命令同步两台服务器之间文件的步骤与详细示例。
前提条件
- 两台服务器,假设它们的 IP 分别为
ServerA: 192.168.1.100
和ServerB: 192.168.1.101
。 - SSH 访问权限:
rsync
默认通过 SSH 进行安全连接,因此需要确保可以通过 SSH 从ServerA
连接到ServerB
。 - 安装 rsync:确保两台服务器上都已安装
rsync
。
rsync 命令基本格式
rsync [选项] 源文件路径 目标文件路径
常用选项
-a
:归档模式,表示递归传输文件并保持文件属性(相当于-rlptgoD
)。-v
:显示传输过程中的详细信息。-z
:在传输过程中压缩文件。-P
:显示传输进度,并在中断后可以继续传输。-e
:指定远程 shell 程序(如ssh
)。--delete
:删除目标目录中源文件已删除的文件,使两端完全同步。
1. 从本地服务器同步到远程服务器
假设我们在 ServerA
上执行 rsync
,同步文件到 ServerB
。
例子:将本地目录 /var/www/
同步到 ServerB
上的 /backup/www/
rsync -avzP -e ssh /var/www/ [email protected]:/backup/www/
解释:
-a
:归档模式,保留文件属性。-v
:显示详细信息。-z
:传输时压缩文件。-P
:显示进度并支持断点续传。-e ssh
:使用 SSH 连接到远程服务器。[email protected]
:远程服务器的 SSH 用户名和 IP 地址。/backup/www/
:远程服务器的目标目录。
带有 --delete 参数的同步
如果需要目标目录与源目录完全同步(包括删除目标中不存在的文件),可以使用 --delete
选项。
rsync -avzP --delete -e ssh /var/www/ [email protected]:/backup/www/
2. 从远程服务器同步到本地服务器
如果我们想从 ServerB
上的 /backup/www/
目录同步到本地 ServerA
的 /var/www/
目录,可以执行以下命令:
rsync -avzP -e ssh [email protected]:/backup/www/ /var/www/
3. 使用免密码的 SSH 登录
为了避免每次执行 rsync
时输入密码,可以配置 SSH 密钥认证。
步骤:
-
生成 SSH 密钥对(如果还没有):
ssh-keygen -t rsa
按提示生成公钥和私钥(一般位于
~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
)。 -
将公钥复制到远程服务器:
ssh-copy-id [email protected]
这会将公钥添加到远程服务器
~/.ssh/authorized_keys
文件中。 -
测试免密登录:
ssh [email protected]
如果无需输入密码即可登录,SSH 免密码认证配置成功。
-
再次使用 rsync:
现在可以使用rsync
进行同步,而不需要输入密码:rsync -avzP /var/www/ [email protected]:/backup/www/
4. 在 crontab 中自动执行 rsync
你可以将 rsync
命令添加到 crontab
中,以实现定时自动同步。
步骤:
-
编辑
crontab
:crontab -e
-
添加定时任务,例如每天凌晨 2 点同步:
0 2 * * * rsync -avzP /var/www/ [email protected]:/backup/www/
这会每天凌晨 2 点自动执行
rsync
同步。
5. 使用排除文件
有时候,你不想同步某些文件或目录,可以使用 --exclude
选项。
例子:排除 .git
目录和日志文件:
rsync -avzP --exclude='.git/' --exclude='*.log' /var/www/ [email protected]:/backup/www/
总结
rsync
是一个高效的文件同步工具,特别适合大文件和远程服务器之间的增量同步。- 结合 SSH 免密登录和
crontab
,可以实现自动化、无干预的文件备份和同步。