1. Rsync 概述
1.1 Rsync 软件介绍及原理
Rsync (Remote synchronization)是一款开源的、快速的、多功能的、可实现全量和增量的本地或远程数据同步备份的优秀工具,Rsync 软件适用于 UNIX/LINUX/WINDOWS 等多种操作系统平台。
Rsync 具有可使本地和远端两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于 ssh 带的 scp( 加密的拷贝 ) 命令。scp 每次都是全量拷贝,而 rsync 可以增量拷贝。
Rsync 还可以在本地主机的不同分区或目录之间全量及增量的复制数据,类似于 cp 命令。
Rsync 还可以实现删除文件和目录的功能,类似于 rm 命令。
Rsync 相当于 scp 、cp 、rm 三个命令,但是还优于它们每一个命令。
在同步备份数据时,默认情况下,rsync 通过其独特的 "quick check" 算法,仅同步大小或者最后修改时间发生变化的文件或目录,当然也可以根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以可以实现快速的同步备份数据。
传统的 cp 、scp 工具拷贝,每次均为完整的拷贝,而 rsync 除了可以完整拷贝外,还具备增量拷贝的功能。因此,从同步数据的性能及效率上,rsync 工具更胜一筹。
1.2 Rsync 的特性
① 支持拷贝特殊文件,如链接文件、设备等。
② 可以有排除指定文件或目录同步的功能,相当于打包命令 tar 的排除功能。
③ 可以做到保持原文件或目录的权限、时间、软硬链接、属主、属组、等所有属性均不改变(-p)。
④ 可以实现增量同步,即只同步发生变化的数据,因此数据传输效率很高。
⑤ 可以使用 rcp 、rsh 、ssh 等方式来配合传输文件(rsync 本身不对文件加密)。
⑥ 可以通过 socket (进程方式)传输文件和数据(服务端和客户端)。
⑦ 支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。
1.3 Rsync企业工作典型应用场景说明
① 两台服务器之间数据同步。
② 定时备份【cron + rsync】,例如:Web 服务器上的 /etc/rc.local 、MySQL 数据库等的数据需要借助定时任务定时备份到备份服务器。
③ rsync 结合 inotify 的功能做实时的数据同步 【rsync + inotify 或 sersync】。例如:nfs_server 热备数据需要通过 rsync 实时同步到备份服务器。 实时同步需要有一个监控 nfs 服务目录的变化,目录发生变化就调用 rsync 软件把变化的数据实时同步备份。
1.4 企业案例:全网服务器数据备份解决方案提出及负责实施
① 针对公司重要数据备份混乱状况提出及负责实施。
② 通过本地打包备份,然后 rsync 结合 inotify 应用把全网数据统一备份到一个固定存储服务器上。存储服务器上通过脚本检查并报警管理员备份结果。
③ 定期将 IDC 机房的数据备份到公司内部服务器,防止机房地震及火灾问题导致数据丢失。
1.5 Rsync 的工作方式
1.5.1 常用的工作方式介绍
① 单个主机本地之间的数据传输(类似于 cp 命令的功能)。
② 借助 rcp 、 ssh 等通道来传输数据(类似于 scp 命令的功能)。
③ 以守护进程(socket)的方式传输数据(这个是 rsync 自身的重要功能)。
1.5.2 通过 man rsync 获取帮助信息
SYNOPSIS
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
2. Rsync 简单运用实战
2.1 Rsync的第一种工作模式:在本地同步备份或删除
2.1.1 语法
Local: rsync [OPTION...] SRC... [DEST]
本地: 命令 参数 内容 路径
2.1.2 实践操作
[root@nfs-server ~]# rsync -avz /etc/hosts /tmp/ # 保持属性的把 hosts 拷贝到 /tmp 。
sending incremental file list
hosts
sent 155 bytes received 31 bytes 372.00 bytes/sec
total size is 199 speedup is 1.07
[root@nfs-server ~]# cp -a /etc/hosts /tmp/
cp: overwrite `/tmp/hosts'? y
# rsync -avz /etc/hosts /tmp/ cp -a /etc/hosts /tmp/ 效果是一样的。
[root@nfs-server ]# mkdir /null # 创建空目录。
[root@nfs-server ]# rsync -avz --delete /null/ /tmp/ # 把 /tmp 目录变成空。
sending incremental file list
./
deleting oldboy/
deleting .ICE-unix/
deleting web_check.log
deleting hosts
sent 29 bytes received 15 bytes 88.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs-server ]# ll /tmp # 查看目录,/tmp 为空。
total 0
# rsync -avz --delete /null/ /tmp/ 相当于 rm 删除 /tmp 下内容。
2.1.3 第一种模式小结(local)
rsync 命令本身是客户端命令
rsync -avz /etc/hosts /tmp/ === c p
rsync -avz --delete /null/ /tmp/ === r m
2.2 Rsync的第二种工作模式:通过隧道远程同步备份
2.2.1 语法
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
2.2.2 实践操作
① 把 /tmp 目录下内容推到远端IP为192.168.136.132的服务器上:
[root@nfs-server ~]# ll /tmp # 可以看到原来只有下面一个文件。
total 128
-rw-r--r--. 1 root root 127304 Sep 22 16:00 service_2017-09-22-16.tar.gz
[root@nfs-server ~]# cd /tmp
[root@nfs-server tmp]# touch {1..5} # 创建文件1 .. 5 。
[root@nfs-server tmp]# rsync -avzP -e 'ssh -p 22' /tmp/ [email protected]:/tmp/
# 把 /tmp 目录下内容推到远端IP为192.168.136.132的服务器上。
# 目录后面是否加 / 的问题:/tmp/ 只复制目录下的内容,/tmp 会把目录也复制过去。
[email protected]'s password: # 提示输入远端 root 密码。
切换到IP为192.168.136.132的服务器:
[root@lamp01 ~]# ls /tmp # 可以看到数据被同步(推)到了这里。
1 2 3 4 5 oldboy service_2017-09-22-16.tar.gz web_check.log
② 把远端IP为192.168.136.132的服务器上 /tmp 目录下内容拉到本地/opt目录: .
[root@nfs-server tmp]# rsync -avzP -e 'ssh -p 22' [email protected]:/tmp/ /opt/
[email protected]'s password:
[root@nfs-server ~]# ls /opt # 查看本地 /opt 目录。可以看到远端 /tmp 目录下内容被同步到了(拉)本地的 /opt 目录下。
1 2 3 4 5 oldboy rh service_2017-09-22-16.tar.gz web_check.log
2.2.3 第二种模式小结
push (推):把本地 /tmp 目录下内容推到远端IP为192.168.136.132的服务器上/tmp目录:
rsync -avzP -e 'ssh -p 22' /tmp/ [email protected]:/tmp/
pu l l (拉): 把远端IP为192.168.136.132的服务器上 /tmp 目录下内容拉到本地/opt目录:
rsync -avzP -e 'ssh -p 22' [email protected]:/tmp/ /opt/
2.2.4 上面命令关键语法的说明
① /tmp/ 只复制目录下的内容,/tmp 会把目录也复制过去。(目录后面是否加 / 的问题)
② -avz 表示同步时文件和目录属性不变。
③ -p 显示同步的过程,可用 -progress 替换。
④ -e ‘ssh -p 22’ 表示通过 ssh 的通道传输数据 ( -p 22 可省略 ) 。
⑤ [email protected]:/opt 远程的主机系统用户、地址、路径。
⑥ /tmp 本地的路径。
2.3 Rsync的第三种工作模式:通过 Rsync 进程(服务)访问同步备份
2.3.1 语法
Access via rsync daemon:
Pu l l: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
2.3.2 Rsync 客户端命令常用参数选项
-v 详细模式输出传输时的进度等信息。
-z 传输时进行压缩以提高传输效率。
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl 。
-e 指定使用的通道协议,指定代替 rsh 的 shell 程序,例如: ssh 。
--exclude=PATTERN 指定排除不需要传输的文件模式。
3. 配置 Rsync 服务端
3.1 查看 Rsync 版本
[root@backup ~]# rsync --version
rsync version 3.0.6 protocol version 30
3.2 查看 Rsync 安装包
[root@backup ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64
3.3 创建并编辑配置文件
[root@backup ~]# ll /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
# 上面是 NFS 服务的配置文件,Rsync 的配置文件默认是不存在的,需要自己创建。
[root@backup ~]# touch /etc/rsyncd.conf # 创建 Rsync 服务端配置文件。
[root@backup ~]# vi /etc/rsyncd.conf # 编辑配置文件,加入如下内容(去掉汉字注释)。
3.4 Rsync 配置文件详解
# Rsync server
# created by ZhangLei 17:32 2017-12-01
# rsyncd.conf start #
uid = rsync # 客户端连接时具备该用户的权限。
gid = rsync # 客户端连接时具备该用户的权限。
use chroot = yes # 和安全相关。
max connections = 2000 # 同时连接的服务器数。
timeout = 600 # 服务端超时时间,超过则踢掉。
pid file = /var/run/rsyncd.pid # 进程号的文件。
lock file = /var/run/rsync.lock # 锁文件。
log file = /var/log/rsyncd.log # rsync日志文件,一般出问题找这个文件。
ignore errors # 忽略错误。
read only = no # 可读写。
list = false # 不让列表,也就是不能看服务端有什么。
hosts allow = 10.0.0.0/24 # 允许的ip 。
hosts deny = 0.0.0.0/0
auth users = rsync_backup # 远程连接的用户。
secrets file = /etc/rsync.password # rsync用户的账号和密码的文件。
######################################################
[backup] # 模块 。
comment = backup server by ZhangLei 17:32 2017-12-01
path = /backup
3.5 Rsync 服务的启动
[root@backup ~]# rsync --daemon # 启动 rsync 服务。
[root@backup ~]# ps -ef|grep rsync|grep -v grep # 查看 rsync 服务进程。
root 4537 1 0 09:35 ? 00:00:00 rsync --daemon
[root@backup ~]# netstat -lntup|grep rsync # 查看 rsync 服务,端口为873。
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4537/rsync
tcp 0 0 :::873 :::* LISTEN 4537/rsync
[root@backup ~]# ss -lntup|grep rsync # 已知端口为873查看该服务(CentOS 7 的 ss 命令)。
tcp LISTEN 0 5 :::873 :::* users:(("rsync",4537,5))
tcp LISTEN 0 5 *:873 *:* users:(("rsync",4537,3))
[root@backup ~]# lsof -i :873 # 已知端口为873,查看 rsync 服务。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 4537 root 3u IPv4 23789 0t0 TCP *:rsync (LISTEN)
rsync 4537 root 5u IPv6 23790 0t0 TCP *:rsync (LISTEN)
3.6 Rsync 服务端深度配置
[root@backup ~]# cat /etc/rsyncd.conf # 以下是未配置的摘选信息。
uid = rsync # 客户端连接时具备该用户的权限。
gid = rsync # 客户端连接时具备该用户的权限。
read only = yes # 可读写。
auth users = rsync_backup # 远程连接的用户。
secrets file = /etc/rsync.password # rsync用户的账号和密码的文件。
path = /backup
3.7 其他详细配置步骤
[root@backup ~]# useradd rsync -s /sbin/nologin -M # 创建 rsync 不需要登录的虚拟用户(不创建家目录)
[root@backup ~]# id rsync
uid=510(rsync) gid=511(rsync) groups=511(rsync)
[root@backup ~]# mkdir /backup # 创建共享的目录:path = /backup。
[root@backup ~]# chown -R rsync /backup/ # 允许客户端推送文件需要把该目录属主改成 rsync 。
[root@backup ~]# ls -ld /backup
drwxr-xr-x. 2 rsync root 4096 Sep 19 06:52 /backup # 客户端有读写权限。
3.8 创建该虚拟用户的账号密码文件并设置密码为 alinuxer
账号密码文件为 /etc/rsync.password
直接 echo 用户名和密码到 /etc/rsync.password:(echo 可自动创建文件,但不能创建目录)。
[root@backup ~]# echo "rsync_backup:alinuxer" > /etc/rsync.password
[root@backup ~]# cat /etc/rsync.password
rsync_backup:alinuxer (非交互式使用账号密码)
因为是密码,所以要给它设置 600 权限并检查:
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# ll /etc/rsync.password
-rw-------. 1 root root 20 Sep 24 10:15 /etc/rsync.password # 权限成功设置为 600 。
3.9 Rsync 服务端配置步骤小结:
① 创建并编辑 /etc/rsyncd.conf 配置文件加入配置参数。
② 创建 rsync 用户及共享目录 /backup,并给目录授权属主为 rsync 。
useradd rsync -s /sbin/nologin -M
id rsync
mkdir /backup
chown -R rsync /backup/
③ 创建密码文件。
echo "rsync_backup:alinuxer" > /etc/rsync.password
cat /etc/rsync.password
chmod 600 /etc/rsync.password
ll /etc/rsync.password
④ 启动并检查:
rsync --daemon # 启动 rsync 服务。
ps -ef|grep rsync|grep -v grep # 查看 rsync 服务进程。
查看 rsync 服务,端口为873:
netstat -lntup|grep rsync 或 ss -lntup|grep rsync 或 lsof -i :873
⑤ 加入开机自启动并检查:
echo "rsync --daemon" >>/etc/rc.local
cat /etc/rc.local
4. 配置 Rsync 客户端并推送数据到服务端
4.1 创建密码文件
echo "alinuxer" > /etc/rsync.password
chmod 600 /etc/rsync.password
ls -l /etc/rsync.password
cat /etc/rsync.password
4.2 向 rsync 服务端测试推送文件
rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password
4.3 实践操作: 把客户端本地的 /tmp 目录下文件推到远端服务端 /backup/ 目录
4.3.1 配置客户端
[root@lamp01 ~]# echo "alinuxer" >/etc/rsync.password
[root@lamp01 ~]# chmod 600 /etc/rsync.password
[root@lamp01 ~]# ls -l /etc/rsync.password
-rw-------. 1 root root 7 Sep 22 21:22 /etc/rsync.password
[root@lamp01 ~]# cat /etc/rsync.password
alinuxer
4.3.2 推送数据
[root@lamp01 ~]# rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password
sending incremental file list
./
1
2
3
4
5
service_2017-09-22-16.tar.gz
service_2017-09-22-18.tar.gz
service_2017-09-22-20.tar.gz
web_check.log
.ICE-unix/
oldboy/
sent 382612 bytes received 190 bytes 765604.00 bytes/sec
total size is 381931 speedup is 1.00
4.3.3 切换到服务端查看数据备份结果
[root@backup ~]# ls /backup/
1 3 5 service_2017-09-22-16.tar.gz service_2017-09-22-20.tar.gz
2 4 oldboy service_2017-09-22-18.tar.gz web_check.log
4.3.4 在客户端的 /tmp 目录下创建文件重新推送:
[root@lamp01 ~]# cd /tmp
[root@lamp01 tmp]# touch {a..g}
[root@lamp01 tmp]# cd -
/root
[root@lamp01 ~]# rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password
sending incremental file list
./
a
b
c
d
e
f
g
sent 579 bytes received 146 bytes 1450.00 bytes/sec
total size is 381931 speedup is 526.80
4.3.5 在服务端查看备份结果:(可以看到新创建的文件也同步备份了)
[root@backup ~]# ls /backup/
1 4 b e oldboy service_2017-09-22-20.tar.gz
2 5 c f service_2017-09-22-16.tar.gz web_check.log
3 a d g service_2017-09-22-18.tar.gz
4.3.6 把服务端 /backup 目录下文件拉到客户端本地的 /tmp 目录。
[root@backup ~]# ls /backup # 服务端 /backup 下只有一个 oldboy 。
oldboy
[root@lamp01 ~]# rm -fr /tmp
[root@lamp01 ~]# mkdir /tmp
[root@lamp01 ~]# ls /tmp/ # 删除并创建空目录 /tmp 。
[root@lamp01 ~]# rsync -avz [email protected]::backup/ /tmp/ --password-file=/etc/rsync.password
# 把服务端 /backup 目录下文件拉到客户端本地的 /tmp 目录。
receiving incremental file list
./
.ICE-unix/
oldboy/
sent 75 bytes received 155 bytes 460.00 bytes/sec
total size is 0 speedup is 0.00
[root@lamp01 ~]# ls /tmp/ # 可以看到客户端本地 /tmp 下同步了 oldboy 。
oldboy
[root@backup backup]# touch {1..4} # 在服务端 /backup 创建文件 1 2 3 4 。
[root@lamp01 ~]# rsync -avz [email protected]::backup/ /tmp/ --password-file=/etc/rsync.password
# 再从客户端拉取服务端 /backup 文件到本地 /tmp 目录。
receiving incremental file list
./
1
2
3
4
sent 145 bytes received 344 bytes 978.00 bytes/sec
total size is 0 speedup is 0.00
[root@lamp01 ~]# ls /tmp/ # 可以看到客户端本地 /tmp 下同步了 1 2 3 4 。
1 2 3 4 oldboy
5. Rsync 服务小结:
5.1 Rsync 服务运用小结
① 推、拉都是客户端操作。
② 注意目录后面斜线的问题。
服务端配置:
path=/backup/
客户端命令:
rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password.
rsync -avz [email protected]::backup/ /tmp/ --password-file=/etc/rsync.password
③ 同步安全优化: 绑定指定 IP 地址提供服务。
[root@backup backup]# netstat -lntup|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1172/rsync
tcp 0 0 :::873 :::* LISTEN 1172/rsync
上面的 0.0.0.0 表示只要访问网卡上的 IP ,服务端都会响应。如果有外网 IP,会产生安全问题,所以要把它绑到内网网卡上。(873端口也可以改,但是工作中不需要改)
--address=ADDRESS 绑定网卡的参数。
--port=PORT 修改端口的参数。
如果只允许局域网 IP 传输,就要绑定指定IP地址提供服务:(安全优化的选项)
[root@backup backup]# pkill rsync
[root@backup backup]# netstat -lntup|grep rsync
[root@backup backup]# rsync --daemon --address=192.168.136.130
[root@backup backup]# netstat -lntup|grep rsync
tcp 0 0 192.168.136.130:873 0.0.0.0:* LISTEN 1986/rsync
即:客户端只有访问服务端 192.168.136.130 这个IP ,服务端才会响应。
如果跨机房做数据同步:【直接用公网 IP 做数据同步不安全】可以拉专线把两个机房做成同一网路或者用 VPN 做成局域网再进行数据传输。
5.2 Rsync 服务排错思路小结:
前提:熟练服务的操作思路,根据正确步骤分析问题所在。
5.2.1 服务端排错思路:
① 查看rsync 服务配置文件路径是否正确,正确的默认路径问为:/etc/rsyncd.conf 。
② 查看配置文件里host allow,host deny 允许的 IP 网段是否是允许客户端访问的 IP 网段。
③ 查看配置文件中的 path 路径是否存在,权限是否正确。(属主)
④ 查看服务是否启动(ps -ef),查看端口是否存在。
⑤ 查看防火墙和 selinux 是否开启允许 rsync 服务通过,或关闭防火墙,selinux 。
⑥ 查看服务端 rsync 配置的密码文件格式是否正确。权限是否 600 。
⑦ 如果推送数据,要查看服务端配置文件 /etc/rsyncd.conf 中用户是否对模块下目录有读写权限。
⑧ 出错查看日志:cat /var/log/rsync.log , 看不清就 >/var/log/rsync.log(清空)再操作并查看。
5.2.2 客户端排错思路:
① 查看客户端密码配置文件格式是否正确、权限是否 600 ,注意只有密码,并和服务端一致。
② 通过telnet ip port 查看服务是否启动(防火墙是否阻挡服务)。
③ 注意命令格式,ip 和 模块 之间的双冒号(::)等。
提示:可通过模拟错误总结提示信息,排错经验以提高以后工作效率。
5.3 简单了解 rsync 协议的运用
5.3.1 语法格式
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
拉: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
推: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
5.3.2 使用示例
拉取:rsync -avz rsync://[email protected]/backup /tmp/ --password-file=/etc/rsync.password
推送: rsync -avz /tmp/ rsync://[email protected]/backup --password-file=/etc/rsync.password
5.4 Rsync 服务的优缺点
优点:增量同步备份、支持 socket(daemon)、集中备份。
缺点:① 大量小文件同步时比对时间较长,有时 rsync 进程会停止。
解决思路:a.打包同步。 b.drbd (文件系统同步) 复制 block 数据块。
② 同步类似 10 G 这样的大文件时有时会中断。未完整同步前是隐藏文件,同步完成后自动改为正常文件。 (可以限速)
无差异同步的风险:(--delete)
① 需要同步的两个目录一模一样的时候,用 --delete 参数,谨慎使用!
② 如果用该参数拉取时,远端有什么本地就有什么(本地比远端多的会自动删除),所以要先备份本地数据或确定本地数据无用。;用该参数推送时,本地有什么远端有什么(远端比本地多的会自动删除),所以要先备份远端数据或确定远端数据无用。
③ 放在脚本中先备份后操作。