linux点滴:rsync

rsync(remote sync)是一款远程同步工具,可以实现全量备份、增量备份、本地备份、删除,核心功能是远程数据备份。

工作原理

rsync核心算法
1.分块checksum算法
首先,把文件平均切成若干个小块,然后对每块计算两个checksum

  • rolling checksum:弱checksum,用来区别不同。
  • md5 checksum:强checksum,用来确认相同。

2.传输算法
checksum列表

  • rolling checksum
  • md5 checksum
  • 文件块编号

源目标的checksum列表和目的目标的checksum列表做对比,获取文件块的改变信息。

3.checksum查找算法
源端拿到目录的checksum文件块后,会存放到哈希表中。

4.比对算法
取出文件块,做rolling checksum计算,从hash表中查找相应的值,如果没有,则不需要比较md5 checksum,表示有不同的信息。如果有,比较md5 checksumrolling checksummd5 checksum都相同,说明在目标端中有相同的块,然后记下这一块在目标端下的文件编号。总之,只要rolling checksum md5 checksum 其中有一个在目标端的checksum哈希表中找不到匹配项,那么触发算法对目标端的rolling动作。

优点

  • 支持daemon的增量备份
  • 远程shell通道模式可以加密传输

缺点

  • 同步大量小文件时,比对时间较长。
  • 同步大文件时有可能会中断

参数

  • -a:--archive,归档模式,以递归模式传输文件并保持文件属性,相当于-rtopgDI。
  • -v:--verbose,详细输出
  • -z:--compress,压缩传输
  • -e:指定传输时的协议,如ssh

1.本地模式##

一般用于拷贝或者删除
拷贝用法:

rsync -avz /tmp /mnt  

删除用法:

rsync -avz --delete /null /mnt  

注:--delete表示让目标目录和源目录保持同步

2.通道模式##

通过远程shell进行数据传输
语法:

Pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]  
Push:rsync [OPTION...] SRC... [USER@]HOST:DEST 

Pull:从远端拉取到本地

如:rsync -avz -e 'ssh -p 22' test@192.168.10.1:/test/ /tmp/

Push:从本地推送到远端

如:rsync -avz -e 'ssh -p 22'   

注:/表示该目录下,不加表示该目录。

3.daemon模式##

准备阶段

服务端:备份服务器-172.16.1.41  
客户端:NFS服务器-172.16.1.31  
#cat /etc/redhat-release  
CentOS release 6.7 (Final)  
#uname -r  
2.6.32-573.el6.x86\_64  
#uname -m  
x86_64  
#/etc/init.d/iptables stop	#关闭防火墙  
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]  
iptables: Flushing firewall rules:                         [  OK  ]  
iptables: Unloading modules:                               [  OK  ]  
Q:如果没有关闭防火墙,会出现如下错误  
rsync: failed to connect to 172.16.1.41: No route to host (113)  
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]  

服务端

  1. 查看安装包
#rpm -qa rsync	#如果不显示任何信息,使用yum安装  
rsync-3.0.6-12.el6.x86_64   
#yum install rsync -y   
  1. 配置rsyncd.conf
    需要手动创建
    #vim /etc/rsyncd.conf
###rsync_config start###  
uid = rsync		#用户名  
gid = rsync		#用户组  
use chroot = no		#不使用chroot  
max connections = 200	#最大连接数  
timeout = 300		#超时时间  
pid file = /var/run/rsyncd.pid	#进程文件  
lock file = /var/run/rsync.lock	#锁文件  
log file = /var/log/rsyncd.log	#日志文件  
ignore errors	#忽略一些无关的IO错误  
read only = false	#只读  
list = false	#列表  
hosts allow = 172.16.1.0/24	#允许的主机  
#hosts deny = 0.0.0.0/32	#禁止的主机  
auth users = rsync_backup	#认证用户,如果没有这行,表示匿名用户,此用户与系统无关。  
secrets file = /etc/rsync.password	#密码文件  
[backup]	#模块  
path = /backup	#备份路径  
[test]	#增加的模块  
path = /test	#备份路径  
#rsync_config end##  
cat /etc/rsyncd.conf	#查看   
  1. 创建rsync用户
#useradd rsync -s /sbin/nologin -M  
#tail -1 /etc/passwd  
Q1:如果没有创建用户,客户端推送会出现如下错误  
@ERROR: invalid uid rsync  
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]  
  1. 创建备份目录
#mkdir -p /backup  
#ls -ld /backup  
#chown -R rsync.rsync /backup/  
#ls -l /backup/  
Q2:如果没有给/backup/授权rsync用户文件拥有者的权限,会出现如下错误  
rsync: mkstemp ".1.upENcr" (in backup) failed: Permission denied (13)  
rsync: mkstemp ".10.ut1KcG" (in backup) failed: Permission denied (13)  
rsync: mkstemp ".2.DodKcV" (in backup) failed: Permission denied (13)  
  1. 创建密码文件
#echo "rsync_backup:123456" /etc/rsync.password  
#cat /etc/rsync.password  
#chmod 600 /etc/rsync.password  
#ls -l /etc/rsync.password  
Q3:如果没有创建密码文件、密码文件错误或没有给600权限,会出现如下错误  
@ERROR: auth failed on module backup  
rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6]  
  1. 启动服务
#rsync --daemon  
#lsof -i:873  
  1. 开机自启动
#echo "rsync --daemon" >>/etc/rc.local  
#tail -1 /etc/rc.local  
  1. 增加模块
[test]	#增加的模块  
path = /test	#备份路径  
  1. 小结

创建rsync用户
创建备份目录,并给文件拥有者。
创建密码文件,并给文件拥有者可读、可写的权限。
加入开机自启动

客户端

  1. 创建密码文件
#echo "123456" >/etc/rsync.password  
#cat /etc/rsync.password  
#chmod 600 /etc/rsync.password  
#ls -l /etc/rsync.password  
Q4:如果没有密码文件,会出现如下错误  
rsync: could not open password file "/etc/rsync.password": No such file or directory (2)  
Password:	#等待输入密码状态  
Q5:如果密码错误或没有给600权限,会出现如下错误  
password file must not be other-accessible  
continuing without password file  
Password: 	#等待输入密码状态  
  1. 创建目录
#mkdir /backup	#推送或拉取目录  
#ls -ld /backup
  1. 测试同步
Push:  
\#rsync –avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password	#方法1  
\#rysnc –avz /backup/ rsync://rsync_backup@172.16.1.41/backup/ --password-file=/etc/rsync.password	#方法2  
Pull:  
\#rysnc –avz /backup/ rsync_backup@10.0.0.41::backup --password-file=/etc/rsync.password	#方法1  
\#rsync –avz /backup/ rsync://rsync_backup@10.0.0.41/backup/ --password-file=/etc/rsync.password	#方法2  
  1. 排除同步
--exclude=a	#排除单个文件  
--exclude={a,b,c,d}	#排除多个文件  
--exclude-from=file	#排除文件中的列表  
  1. 小结

创建密码文件,并给文件拥有者可读、可写权限。
单独创建推送或拉取的目录

rsync一般结合cron定时任务实现全网备份,结合inotify或sersync实现实时备份。

作者:kaliylinux
出处:http://www.cnblogs.com/kaliy

posted @ 2016-04-26 08:42  warkly  阅读(271)  评论(0编辑  收藏  举报