一、什么是rsync
rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法,而且可以通过ssh方式来传输文件,这样其保密性也非常好,另外它还是免费的软件。
1.1rsync 包括如下的一些特性:
能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;
能用rsh、ssh 或直接端口做为传输入端口;
支持匿名rsync 同步文件,是理想的镜像工具;
二 工作场景
2.1 两台服务器之间数据拷贝
2.2 定时备份
三 三种模式
3.1 第1种方式
Local: rsync [OPTION...] SRC... [DEST]
rsync -avz/etc/hosts /tmp/ 这种情况相当于cp
[[email protected]~]# rsync -avz --delete /dev/null/ /tmp/ 我有点你必须有,我没有的你必须没有,相当于rm 命令
sending incremental file list
null
sent 34 bytes received 15 bytes 98.00 bytes/sec
total size is 0 speedup is 0.00
[[[email protected] ~]# ll /tmp/
total 0
3.2 第2种方式
Access via remote shell:
Pull:rsync [OPTION...] [[email protected]]HOST:SRC... [DEST]
Push:rsync [OPTION...] SRC... [[email protected]]HOST:DEST
[[email protected] ~]# ll /tmp/
total 0
-rw-------. 1 root root 0 Feb 21 17:28yum.log
[[email protected]~]# rsync -avzP -e ‘ssh -p22‘ /tmp/ [email protected]:/tmp 把本地的推送到远端/tmp目录下,注意:如果/tmp后面没有/ 那么推送到只是tmp目录下面的内容,如果加上/变成/tmp/ 那么这个时候的推送就包含整个tmp目录了
The authenticity of host ‘10.0.0.100(10.0.0.100)‘ can‘t be established.
RSA key fingerprint isdb:ce:a8:5a:d6:2b:23:5f:15:70:68:ce:84:38:ef:ef.
Are you sureyou want to continue connecting (yes/no)? y 这里是确认
Please type‘yes‘ or ‘no‘: yes 这里要求输入远端账号的密码
Warning: Permanently added ‘10.0.0.100‘(RSA) to the list of known hosts.
reverse mapping checking getaddrinfo forbogon [10.0.0.100] failed - POSSIBLE BREAK-IN ATTEMPT!
[email protected]‘s password:
sending incremental file list
./
yum.log
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1/3)
.ICE-unix/
sent 114 bytes received 38 bytes 16.00 bytes/sec
total size is 0 speedup is 0.00
把远端的数据拉回本地
[[email protected] ~]#rsync -avzP -e ‘ssh -p 22‘[email protected]:/tmp/ /tmp/ 从远端拉回来
reverse mapping checking getaddrinfo forbogon [10.0.0.100] failed - POSSIBLE BREAK-IN ATTEMPT!
[email protected]‘s password:
receiving incremental file list
./
pull.txt
5 100% 4.88kB/s 0:00:00 (xfer#1, to-check=2/4)
sent 34 bytes received 146 bytes 51.43 bytes/sec
total size is 5 speedup is 0.03
[[email protected] ~]# ll /tmp/
total 4
-rw-r--r--. 1 root root 5 Mar 3 03:58 pull.txt
-rw-------. 1 root root 0 Feb 21 17:28yum.log
[[email protected] ~]# cat /pull.txt
cat: /pull.txt: No such file ordirectory
[[email protected] ~]# cat /tmp/pull.txt
Pull
3.3 第3 种方式
Access via rsync daemon:
Pull: rsync [OPTION...] [[email protected]]HOST::SRC... [DEST]
rsync [OPTION...]rsync://[[email protected]]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [[email protected]]HOST::DEST
rsync [OPTION...] SRC...rsync://[[email protected]]HOST[:PORT]/DEST
四 客户端常用参数
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
rsync foo/bar/foo.c remote:/tmp/
Rsync 参数在/tmp目录下创建foo.c文件,而如果使用-R参数:
rsync -R foo/bar/foo.c remote:/tmp/
Rsync 参数会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p,--perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t,--times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定替代rsh的shell程序
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于--partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=FORMAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息
五 rsync配置
5.1 服务器配置
5.1.1建立配置文件
在/etc/文件目录下创建一个rsyncd.conf的配置文件,然后写入配置信息:
#Rsyncserver
#Created by kirk
#rsync.conf start#
uid = rsync
gid = rsync
user chroot = no
maxconnections = 200 并发连接数
timeout = 600 超时数
pid file =/var/run/rsyncd.pid 进程号放在这个文件
lock file = /var/run/rsync.lock
log file =/var/log/rsyncd.log 日志文件,出问题就来这里看。
igore erros
read only =false 可读写
list = false
hosts allow = 10.0.0.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#######################################
[backup]
comment = www by kirk
path = /backup
5.1.2启动服务:
[[email protected] ~]# rsync --daemon
[[email protected] ~]# ps -ef|grep rsync|grep-v grep
root 1794 1 0 05:11 ? 00:00:00 rsync --daemon
[[email protected] ~]# netstat -lntup|greprsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1794/rsync
tcp 0 0 :::873 :::* LISTEN 1794/rsync
[[email protected] ~]# lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 1794 root 3u IPv4 15101 0t0 TCP *:rsync (LISTEN)
rsync 1794 root 5u IPv6 15102 0t0 TCP *:rsync (LISTEN)
5.1.3服务器端配置:
[[email protected]~]# useradd rsync -s /sbin/nologin -M 建立虚拟账号
[[email protected]~]# mkdir /backup 建立备份目录
[[email protected]~]# chown -R rsync /backup/ 修改备份目录权限,客户端可以推送数据
[[email protected] ~]#echo "rsync_backup:oldboy" >>/etc/rsync.password 建立密码文件[K1]
[[email protected] ~]# cat /etc/rsync.password
rsync_backup:oldboy 给用户auth users = rsync_backup设定的密码是oldboy
5.1.4权限修改:
[[email protected]~]# chmod 600 /etc/rsync.password 其他人不可读写,安全
[[email protected] ~]# ll /etc/rsync.password
-rw-------. 1 root root 20 Mar 3 05:21 /etc/rsync.password
5.1.5图解:
5.1.6加入开机自启动:
[[email protected] ~]# echo "rsync--daemon" >>/etc/rc.local
[[email protected] ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after*all the other init scripts.
# You can put your own initializationstuff in here if you don‘t
# want to do the full Sys V style initstuff.
touch /var/lock/subsys/local
>/etc/udev/rules.d/70-persistent-net.rules
rsync --daemon
rsync --daemon
[[email protected] ~]#
5.2 客户端配置
5.2.1 创建配置密码文件
[[email protected] ~]# echo"oldboy" >/etc/rsync.password
[[email protected] ~]# chmod 600/etc/rsync.password
5.2.1 测试推送
[[email protected] ~]# rsync -avz /tmp/[email protected]::backup --password-file=/etc/rsync.password
sendingincremental file list
./
pull.txt
yum.log
.ICE-unix/
sent 176 bytes received 53 bytes 458.00 bytes/sec
total size is 5 speedup is 0.02
[[email protected] ~]# rsync-aPz /tmp/ [email protected]::backup--password-file=/etc/rsync.password
sending incremental file list
sent 89 bytes received 9 bytes 196.00 bytes/sec
total size is 5 speedup is 0.05
[[email protected] ~]#
六 安全优化
6.1 绑定IP或者端口
rsync --daemon --address=10.0.0.100
七 排错
7.1 服务器端排除
1、查看rsync服务配置文件路径是否正确,正常默认的路径是/etc/rsyncd.conf
2、查看配置文件里面host allow ,host deny,允许的Ip网段是否是允许的客户端访问
3、查看配置文件中的path参数里的路径是否存在,权限是否正确
4、查看rsync服务是否启动,查看命令为:ps -ef|grep rsync,端口是否存在netstat -lnutp|grep 873 or lsof -i :873
5、参考iptables防火墙和selinux是否开启允许rsync服务通过,也可以考虑关闭防火墙和selinux
6、查看服务器rsync配置的文件是否为600的权限,文件格式是否是正确user:passwd,文件路径和配置文件里的secrectfiles参数对应
7、如果是推送数据,要查看下,配置rsyncd.conf文件中用户是否对模块下有写的权限
7.2 客户端排除思路
1、查看您客户端rysnc配置的密码文件是否一致,权限是否600,密码文件格式是否正确
2、用Telnet连接rsync服务器ip地址873端口,查看服务是否启动eg:telnet 10.0.0.100 873
3、客户端执行命令是 rysnc -avzP [email protected]::backup/ /test/--password-file=/etc/rsync.password
八 crontab+rsync
1、建立rysnc的密码文件
echo "oldboy">>/etc/rsync.password
cat /etc/rsync.password
ll /etc/rsync.password
chmod 600 /etc/rsync.password
ll /etc/rsync.password
2、创建将要备份的目录,我这里是创建了以ip和时间为目录名字的。
mkdir -p /backup/`ifconfig eth0|awk -F"[ :]+" ‘NR==2 {print $4}‘`_$(date +%F)
[[email protected] scripts]# ll /backup/
total 4
drwxr-xr-x. 2root root 4096 Mar 4 09:41 10.0.0.101_2016-03-04 目录名字
3、我这里是要备份/cron/root 和/etc/rc.local。而且我复制他们后也用时间命名:
cp /var/spool/cron/root/backup/10.0.0.101_2016-03-04/cron_root_$(date +%F)
cp /etc/rc.local/backup/10.0.0.101_2016-03-04/rc.loacl_$(date +%F)
[[email protected] scripts]# ll/backup/10.0.0.101_2016-03-04/
total 8
-rw-------. 1 root root 150 Mar 4 09:42 cron_rsync_2016-03-04
-rwxr-xr-x. 1 root root 315 Mar 4 09:42 rc.loacl_2016-03-04
4、复制上面的命令编写脚本文件:
[[email protected] scripts]# cat cron_rsync.sh
#!/bin/sh
path=/backup
dir="`ifconfig eth0|awk -F "[:]+" ‘NR==2 {print $4}‘`_$(date +%F)"
mkdir $path/$dir -p &&\
/bin/cp /var/spool/cron/root$path/$dir/cron_rsync_$(date +%F) &&\
/bin/cp /etc/rc.local$path/$dir/rc.loacl_$(date +%F) &&\
rsync -az $path/[email protected]::backup/ --password-file=/etc/rsync.password
5.测试脚本
[[email protected] scripts]# sh cron_rsync.sh
6、服务器端查看测试命令
[[email protected] ~]# ll /backup/
total 16
drwxr-xr-x. 2 rsync rsync 4096 Mar 4 09:4110.0.0.101_2016-03-04
drwxr-xr-x. 2 rsync rsync 4096 Mar 3 16:06 10.0.0.102_2016-03-03
drwxr-xr-x. 2 rsync rsync 4096 Mar 4 10:26 10.0.0.102_2016-03-04
-rw-------. 1 rsync rsync 328 Mar 4 10:33 2016-03-04
7、创建定时任务
[[email protected] scripts]# crontab -l
########rysnc+crontab#################
00 01 * * */bin/sh /server/scripts/cron_rsync.sh>/dev/null 2>&1 脚本放置路径
优缺点
优点:
1、增量备份、支持scoket(daemon),集中备份(支持推拉,都是以客户端为参照物)
2、远程SHELL通道模式还可以加密(SSH)传输,scoket(daemon)需要加密传输,可以利用vpn服务或ipsec服务
缺点:
1、大量小文件情况下同步,比对时间较长,有的时候,rsync进程可能会停止
2、同步打文件,10G这样的打文件有时也会有问题,出现:中断,未完整同步前,是隐藏文件
rsync长时间传输的限速参数:
--bwlimit=KBPS
[K1]/etc/rsync.password 这个配置文件就是在/etc/rsyncd.conf配置文件中指定的那个密码文件和路径。rsync_backup是指定的用户auth users = rsync_backup。
[K2]这里是参数P和v的对比