Rsync服务

一、简介
1、认识
Rsync英文全称为Remotesynchronization,Rsync具有使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,类似ssh带的scp命令,scp每次拷贝都是全量拷贝,而rsync还可以增量拷贝。Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,类似cp命令,同样cp每次拷贝都是全量拷贝。Rsync还可以实现删除文件和目录的功能,又相当于rm命令。
小提示:
一个rsync相当于scp、cp、rm,但其在功能上又优于他们每一个命令;
cp、scp工具属于完整拷贝;rsync既能完整拷贝又能增量拷贝,从同步数据的性能及效率上Rsync工具更好;
同步备份数据时,默认情况下,Rsync通过其独特的“quickcheck”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,也可根据权限、属主等属性的变化同步,甚至可以实现只同步一个文件里有变化的内容,所以可以实现快速的同步备份数据。
2、原理
Rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配置文件;Rsync可以通过rsh或ssh使用,也能以daemon模式去运行
在以daemon方式运行时Rsyncserver会打开一个873 端口,等待客户端去连接。连接时,Rsyncserver会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份
3、特点
# 支持拷贝特殊文件如链接文件,设备等
#可以排除指定文件或目录同步的功能,相当于打包命令tar的排除功能
#可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变-p
#可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高,tar -N
#可以使用rcp,rsh,ssh等方式来配合传输文件(rsync本身不对数据加密)
#可以通过socket(进程方式)传输文件和数据(服务端和客户端)
#支持匿名或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像
4、Rsync的企业工作场景说明
第一种:两台服务器之间数据同步(定时任务),即crond+rsync
第二种:实时同步(解决存储服务器等单点问题)
利用rsync结合inotify的功能做实时数据同步,根据存储服务器上目录的变化,把变化的数据通过inotify或sersync结合rsync命令,同步到备份服务器还可以通过drbd方案以及双写的方案实现双机数据同步
5、Rsync常用参数
-v, --verbose详细模式输出,传输时的进度等信息
-z, --compress传输时进行压缩以提高传输效率
-a, --archive归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive对子目录以递归模式,即目录下的所有目录都同样传输
-t, --times 保持文件时间信息
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-p, --perms 保持文件权限
-D, --devices 保持设备文件信息
-P –progress显示同步的过程及传输时的进度等信息
-l, --links 保持软链接
-e, --rsh=COMMAND使用的信道协议,指定替代rsh的shell程序,例如:ssh
--exclude=PATTERN指定排除不需要传输的文件模式
--exclude-from=FILE文件名所在的目录文件
--bwlimit=KBPS limitI/O bandwidth,限制IO带宽(案例:某DBA做数据同步(白天操作将带宽占满),导致用户无法访问网站,解决办法:rsync限速功能)
--delete让目标目录dst和源目录src数据一致
 
二、Rsync模式实例演示
1、本地模式(类似cp)
Local模式语法格式:
rsync [OPTION...]SRC... [DEST]
演示实例:
# cp -a /etc/hosts/tmp/
# rsync /etc/hosts/tmp/test
# ls /tmp/ /tmp/test/
/tmp/:
hosts test yum.log
/tmp/test/:
Hosts
#保留文件属性信息
# rsync -vzrtopg/etc/hosts /tmp/test/
# ls -l /tmp/test/
2、借助ssh通道远程传输数据(类似scp)
案例描述
将10.0.0.41主机上的/etc/hosts文件备份到10.0.0.31主机的/tmp目录下,rsync命令将在10.0.0.41主机上执行操作
远程模式语法格式:
拉取Pull: rsync[OPTION...] [USER@]HOST:SRC... [DEST]
推送Push: rsync[OPTION...] SRC... [USER@]HOST:DEST
推送Push演示实例:
# rsync -avz /etc/hosts-e 'ssh -p 22' root@10.0.0.31:/tmp/
# ls -l /tmp/
拉取Pull演示实例:
# rsync -avz -e 'ssh -p22' root@10.0.0.31:/etc/hosts /tmp/
# ls -l /tmp/
小提示:
生产环境采用sshkey秘钥结合rsync实现数据分发的方案
3、Rsync优缺点
Rsync优点:
#增量备份,支持socket(daemon),集中备份(支持推送拉取,都是以客户端为参照物)
#远程shell通道模式还可以加密SSH传输,socket(daemon)需要加密传输,可以利用vpn(pptp、openvpn、ipsec)服务
Rsync缺点:
#大量小文件同步时,比对时间较长,可能会导致rsync进程停止
#同步大文件,10G这样的大文件有时会中断;未完成同步前是隐藏文件,可以通过续传等参数实现传输
#一次性远程拷贝可以使用scp命令进行操作
4、以守护进程(socket)的方式传输数据
创建rsync服务对应的用户,管理本地目录
# useradd rsync -s/sbin/nologin -M
# tail -1 /etc/passwd
rsync:x:501:501::/home/rsync:/sbin/nologin
生成rsyncd.conf配置文件(manrsyncd.conf查看帮助)
# vi /etc/rsyncd.conf
#rsync_config________start
#created by wolfdreams2018-07-14
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file =/var/log/rsyncd.log
[backup]
path = /backup
ignore errors = yes
read only = false
list = false
hosts allow =192.168.10.0/24
#hosts deny =0.0.0.0/32
auth users =rsync_backup
secrets file =/etc/rsync.password
#rsync_config________end
创建备份目录并赋予特定的权限
# mkdir /backup
# chown -R rsync:rsync/backup
根据rsyncd.conf配置文件auth_users配置账户并根据secretsfile参数生成密码文件(远程连接验证使用)
# echo"rsync_backup:tang" >> /etc/rsync.password
给secretsfile参数生成密码文件赋予特定的权限
# chmod 600/etc/rsync.password
启动rsync服务并检查端口是否正常
# rsync --daemon
# ps -ef | grep rsync |grep -v grep
# lsof -i :873
COMMAND PID USER FDTYPE DEVICE SIZE/OFF NODE NAME
rsync 25039 root 4uIPv4 30783 0t0 TCP *:rsync (LISTEN)
rsync 25039 root 5uIPv6 30784 0t0 TCP *:rsync (LISTEN)
# netstat -lntup | grep873
tcp 0 0 0.0.0.0:8730.0.0.0:* LISTEN 25039/rsync
tcp 0 0 :::873 :::*LISTEN 25039/rsync
加入开机自启动
# echo"/usr/bin/rsync --daemon" >>/etc/rc.d/rc.local
# tail -1/etc/rc.d/rc.local
/usr/bin/rsync --daemon
5、Rsync daemon服务端排错步骤
输出过程信息检查
查看rsyncd.conf配置文件中定义的日志文件/var/log/rsyncd.log
# tail/var/log/rsyncd.log
检查Rsync daemon服务配置步骤
6、Rsync客户端配置
查询rsync软件包是否安装
# rpm -qa rsync
生成连接服务器端需要的密码文件
# vim/etc/rsync.password
tang
给客户端密码文件赋予权限
# chmod 600/etc/rsync.password
在客户端上面创建一个和Rsyncdaemon服务端一样的/backup目录
# mkdir -p /backup
Rsync与Rsyncdaemon之间同步文件
Rsync客户端创建测试文件
# cd /backup/
# touch test{01..10}
push推送方式
1)Push推送操作命令
# rsync -az /backup/rsync_backup@192.168.10.7::backup/ --password-file=/etc/rsync.password
# rsync -az /backup/rsync://rsync_backup@192.168.10.7/backup/ --password-file=/etc/rsync.password
2)Rsync daemon服务端进行验证
# cd /backup/
Rsync daemon服务端创建测试文件
# cd /backup/
# touch {a..g}01
pull拉取方式
1)pull拉取操作命令
# rsync -avzrsync_backup@192.168.10.7::backup/ /backup/ --password-file=/etc/rsync.password
# rsync -avzrsync://rsync_backup@192.168.10.7/backup/ /backup/--password-file=/etc/rsync.password
2)Rsync客户端进行验证
# ls
a01 b01 c01 d01 e01 f01g01
排除不需要备份的文件
1)排除单个文件或目录
命令演示:
# rsync -az /backup/--exclude=a01 rsync_backup@192.168.10.7::backup/--password-file=/etc/rsync.password
服务器端验证:
# ls
b01 c01 d01 e01 f01 g01
2)排除多个不连续的文件
命令演示:
# rsync -az /backup/--exclude={a01,e01} rsync_backup@192.168.10.7::backup/--password-file=/etc/rsync.password
服务器端验证:
# ls
b01 c01 d01 f01 g01
3)排除多个连续的文件
命令演示:
# rsync -az /backup/--exclude={a..c}01 rsync_backup@192.168.10.7::backup/--password-file=/etc/rsync.password
服务器端验证:
# ls
d01 e01 f01 g01
4)排除多个不同文件和目录
模拟环境:
# echo "a01 c01d01 f01" |xargs -n 1 >> exclude.log
# cat exclude.log
a01
c01
d01
f01
命令演示:
# rsync -az /backup/--exclude-from=exclude.log rsync_backup@192.168.10.7::backup/--password-file=/etc/rsync.password
服务器端验证:
# ls
b01 e01 exclude.log g01
Rsync无差异同步,使用参数--delete
1)客户端文件
# ls
a01 b01 c01 d01 e01exclude.log f01 g01
2)服务器端文件
# ls
b01 e01 exclude.log g01
3)命令演示:
#会把远端目录内容清除,并写入与本地端一模一样的数据文件
# rsync -az /backup/--delete rsync_backup@192.168.10.7::backup/ --password-file=/etc/rsync.password
#会把本地目录内容清除,并写入与远端一模一样的数据文件
# rsync -az --deletersync_backup@192.168.10.7::backup/ /backup/ --password-file=/etc/rsync.password
4)验证服务器端/backup目录文件
# ls
a01 b01 c01 d01 e01exclude.log f01 g01
Rsync排错思路
Rsync服务端排错思路
查看rsync服务器配置文件路径是否正确,默认路径为:/etc/rsyncd.conf
查看配置文件里host allow、hostdeny,允许的IP网段是否允许客户端访问的IP网段
查看配置文件中path参数里的路径是否存在,权限是否正确
查看rsync服务是否启动,查看命令为:ps-ef | grep rsync;端口是否存在lsof –i :873
查看iptables和selinux是否开启允许rsync服务通过
查看服务端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,正确格式为用户名:密码,文件路径和配置文件里的secrectfile参数对应
查看配置文件rsyncd.conf中用户是否对模块下目录有可读写的权限
Rsync客户端排错思路
查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确;注意:客户端仅需要有密码并且和服务端的密码一致
telnet测试rsync服务器IP地址873端口,查看服务是否启动(测试服务器端防火墙是否阻挡,网络策略是否开通相应端口)
客户端执行命令时,细节要记清楚,主机IP地址双冒号后面接的服务器端rsyncd.conf配置文件中的模块名称
7、附录
Rsyncdaemon服务端rsyncd.conf配置文件详解
#rsync_config________start
#created by wolfdreams2018-07-14
uid = rsync #用户远端的命令使用rsync访问共享目录
gid = rsync #用户组
use chroot = no 安全相关
max connections = 200最大连接数
timeout = 300 超时时间
pid file =/var/run/rsyncd.pid 进程对应的进程号文件
lock file =/var/run/rsync.lock 锁文件
log file =/var/log/rsyncd.log 日志文件
[backup] 模块名称
path = /backup服务器端提供访问的目录
ignore errors = yes忽略错误
read only = false 可写
list = false 不能列表ls
hosts allow =192.168.10.0/24 允许备份的主机网段
#hosts deny =0.0.0.0/32 禁止那些主机网段通过(allow与deny只能二选一,不能同时存在)
auth users =rsync_backup 虚拟用户独立于系统账号之后
secrets file =/etc/rsync.password 虚拟用户对应的用户和密码(远程连接用于身份验证是否正常)
#rsync_config________end
多模块rsyncd.conf配置文件
#rsync_config________start
#created by wolfdreams2018-07-14
uid = rsync #用户远端的命令使用rsync访问共享目录
gid = rsync #用户组
use chroot = no 安全相关
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 =yes  忽略错误
read only = false 可写
list = false 不能列表ls
hosts allow =192.168.10.0/24 允许备份的主机网段
#hosts deny =0.0.0.0/32 禁止那些主机网段通过(allow与deny只能二选一,不能同时存在)
auth users =rsync_backup 虚拟用户独立于系统账号之后
secrets file =/etc/rsync.password 虚拟用户对应的用户和密码(远程连接用于身份验证是否正常)
[backup] 模块名称
path = /backup服务器端提供访问的目录
[data] 模块名称
path = /data服务器端提供访问的目录
#rsync_config________end
 
三、rsync用法案例
$ mkdir {dirA,dirB}//创建两个测试目录
//分别在两个目录创建相应的文件
$ touchdirA/{fileA1.txt,fileA2.txt,fileA3.txt}
$ touchdirB/{fileA1.txt,fileA2.txt,fileA3.txt,fileB1.txt,fileB2.txt,fileB3.txt}
1)将dirA的所有文件同步到dirB内,并保留文件的属主,属组,文件权限等信息。
$ rsync -avz dirA/dirB/
sending incrementalfile list
./
fileA1.txt
fileA2.txt
fileA3.txt
sent 199 bytes received72 bytes 542.00 bytes/sec
total size is 0 speedupis 0.00
2)将dirA的所有文件同步到dirB内,并删除dirB内多余的文件
$ rsync -avz --deletedirA/ dirB/      #源目录和目标目录结构一定要一致!!不能是dirA/* dirB/ 或者dirA/ dirB/*  或者 dirA/* dirB/*
sending incrementalfile list
./
deleting fileB3.txt
deleting fileB2.txt
deleting fileB1.txt
fileA1.txt
fileA2.txt
fileA3.txt
sent 203 bytes received72 bytes 550.00 bytes/sec
total size is 0 speedupis 0.00
3)将dirA的所有文件同步到dirB,但是在dirB内除了fileB3.txt这个文件不删之外,其他的都删除。
$ rsync -avz --delete--exclude "fileB3.txt" dirA/ dirB/
sending incrementalfile list
./
deleting fileB2.txt
deleting fileB1.txt
fileA1.txt
fileA2.txt
fileA3.txt
sent 203 bytes received72 bytes 550.00 bytes/sec
total size is 0 speedupis 0.00
4)将dirA目录内的fileA1.txt和fileA2.txt不同步到dirB目录内。
$ rsync -avz--exclude="fileA1.txt" --exclude="fileA2.txt" dirA/ dirB/
sending incrementalfile list
fileA3.txt
sent 106 bytes received31 bytes 274.00 bytes/sec
total size is 0 speedupis 0.00
5)将dirA目录内的fileA1.txt和fileA2.txt不同步到dirB目录内,并且在dirB目录内删除多余的文件。
$ rsync -avz--exclude="fileA1.txt" --exclude="fileA2.txt" --deletedirA/ dirB/
sending incrementalfile list
deleting fileB3.txt
deleting fileB2.txt
deleting fileB1.txt
fileA3.txt
sent 106 bytes received31 bytes 274.00 bytes/sec
total size is 0 speedupis 0.00
6)将dirA目录内的fileA1.txt和fileA2.txt不同步到dirB目录内,并且在dirB目录内删除多余的文件,同时,如果dirB内有fileA2.txt和fileA1.txt这两个被排除同步的文件,仍然将其删除。
$ rsync -avz--exclude="fileA1.txt" --exclude="fileA2.txt"--delete-excluded dirA/ dirB/
sending incrementalfile list
./
deleting fileB3.txt
deleting fileB2.txt
deleting fileB1.txt
deleting fileA2.txt
deleting fileA1.txt
fileA3.txt
sent 109 bytes received34 bytes 286.00 bytes/sec
total size is 0 speedupis 0.00
这里可以看到只有fileA3.txt被同步到dirB目录内,同时dirB目录内的fileA1.txt和fileA2.txt两个被过滤的文件也被删除掉了。
*********************************************************************************************************
要在Linux下删除海量文件的情况,需要删除数十万个文件。这个是之前的程序写的日志,增长很快,而且没什么用。这个时候,我们常用的删除命令rm-fr * 就不好用了,因为要等待的时间太长。所以必须要采取一些非常手段。我们可以使用rsync的--delete-before参数来实现快速删除大量文件。
1)建立一个空的文件夹:
mkdir /tmp/test
2)用rsync删除目标目录:
rsync --delete-before-a -H -v --progress --stats /tmp/test/ log/
这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
选项说明:
--delete-before接收者在传输之前进行删除操作
--progress 在传输时显示传输过程
--a归档模式,表示以递归方式传输文件,并保持所有文件属性
--H 保持硬连接的文件
--v 详细输出模式
--stats 给出某些文件的传输状态