Rsync远程同步

rsync简介:

rsync是一款优秀的、快速的、多平台的本地或远程数据镜像同步备份工具。适用于Unix/Linux/Windows等多种平台。

在同步备份时,默认情况下,rsync通过其独特的quick check算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需指定参数)甚至是只同步一个文件里有变化的内容部分,所以,可以实现快速的同步数据的功能。

rsync和cp,scp的区别:

cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整备份,还具备增量拷贝的功能,因此,从性能及效率上更胜一筹。

rsync工作方式:   
  rsync大致使用三种主要的方式来传输数据:
  1.本地数据传输
  2.通过rcp,ssh等通道传输
  3.以守护进程的方式传输数据

本地数据传输
语法:
  rsync [OPTION] SRC... [DEST]
SRC:源文件
DEST:目标文件
option参数说明:    #一般使用-avz就可以
-a:归档模式,递归并保留对象属性,等同于 -rlptgoD
-r:递归模式,包含目录及子目录中所有文件
-l:对于符号链接文件仍然复制为符号链接文件
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-D:保留设备文件及其他特殊文件
-v:显示同步过程的详细(verbose)信息
-z:在传输文件时进行压缩(compress)
-H:保留硬连接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据对象的校验和来决定是否跳过文件

演示:将/etc 目录下的文件拷贝到/tmp 目录下
 [root@localhost ~]# rsync -avz -P /etc /tmp/  #第一次拷贝的时候时间比较长,输出信息也比较多
第二次拷贝非常快,因为/etc目录下没有数据更新
 [root@localhost ~]# rsync -avz -P /etc /tmp/
building file list ...
2141 files to consider

sent 61983 bytes  received 20 bytes  124006.00 bytes/sec
total size is 88435897  speedup is 1426.32
 
注意:rsync -avz -P /etc/ /tmp/      仅同步etc目录里的内容,etc本身不同步 
      rsync -avz -P /etc /tmp/      把etc和etc里面的内容全部考到tmp目录下
 
通过远程shell进行数据传输:
语法:
拉取:rsync [option] [USER@]HOST:SRC...  [DEST]
推送:rsync [option] SRC... [USER@]HOST:DEST
[USER@]HOST:为Rsync同步的远程的连接用户和主机地址
SRC:为源,即拷贝的分区、文件或目录等,和HOST之间用一个冒号连接;
[DEST]为目的分区、文件或目录等


演示:要事先做好ssh通道
将本地的etc目录推送到tmp目录下,由于有ssh通道,所以没有要密码
[root@localhost ~]# rsync -avz -P /etc -e 'ssh -p 22' [email protected]:/tmp/

将远端的etc目录备份到本地的tmp目录下
[root@localhost ~]# rsync -avz -P -e 'ssh -p 22' [email protected]:/etc /tmp/

守护进程的方式:
[root@localhost ~]# vim /etc/rsyncd.conf
uid = root
gid = root
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
[www]                    #模块,读取数据的时候需要用这个名
path= /var/www/html/    #远端备份的路径,抓取也是从这里抓,如果用户上传uid和gid用户需要用上传权限,如果度也要有读取权限
ignore errors            #忽略错误
read only = false        #只读为假就是可以上传数据,如果是true那么就不能上传数据了
list = false 
hosts allow = 192.168.0.0/24
hosts deny = 0.0.0.0/32
auth users = rbackup                #认证的用户
secrets file = /etc/rsync.password  #存放用户和密码文件

创建存放认证用户的文件
[root@localhost ~]# vim /etc/rsync.password
rbackup:RedHat
[root@localhost ~]# chmod 600 /etc/rsync.password  #权限必须是600
[root@localhost ~]# ls /etc/rsync.password -l
-rw------- 1 root root 15 12-10 10:18 /etc/rsync.password

启动服务
[root@localhost ~]# rsync --daemon    #--daemon表示以守护进程的方式启动
[root@localhost ~]# ps -ef | grep rsync | grep -v grep
root      7915    1  0 10:20 ?        00:00:00 rsync --daemon
[root@localhost ~]# netstat -lnt | grep 873
tcp        0      0 0.0.0.0:873                0.0.0.0:*                  LISTEN     
tcp        0      0 :::873                      :::*                        LISTEN

设置开机自动启动
[root@localhost ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.d/rc.local
[root@localhost ~]# tail -1 /etc/rc.d/rc.local
/usr/bin/rsync --daemon

客户端部署
[root@localhost ~]# echo "redhat" > /etc/rsync.password  #仅需密码无须帐号
[root@localhost ~]# chmod 600 /etc/rsync.password        #文件权限600
[root@localhost ~]# cat /etc/rsync.password
redhat

使用守护进程的方式数据传输
拉取:rsync[OPTION][USER@]HOST::SRC [DEST]
      rsync[OPTION] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送:rsync[OPTION] SRC... [USER@]HOST::DEST
      rsync[OPTION] SRC... rsync://[USER@]HOST[:PORT]/DEST
     
客户端创建一个文件推送到服务器端
[root@localhost html]# touch a.txt
[root@localhost html]# rsync -avz -P /var/www/html/ [email protected]::www/ --password-file=/etc/rsync.password
或者
[root@localhost html]# rsync -avz -P /var/www/html/ rsync://[email protected]:/www --password-file=/etc/rsync.password
building file list ...
2 files to consider
./
a.txt
          0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 100 bytes  received 44 bytes  96.00 bytes/sec
total size is 0  speedup is 0.00

服务器端查看推送成功
[root@localhost html]# ls
a.txt  index.html  index.php

--deleted参数:保证本地数据和远端数据完全一致,本地有啥远端就有啥,如果本地没有远端就删除
客户端执行
[root@localhost ~]# mkdir aaa创建一个空目录
[root@localhost ~]# rsync -avz -P --delete /root/aaa/ [email protected]::www/ --password-file=/etc/rsync.password
building file list ...
1 file to consider
deleting index.php
deleting index.html
deleting a.txt
./

sent 50 bytes  received 22 bytes  13.09 bytes/sec
total size is 0  speedup is 0.00
服务端查看/var/www/html目录下面什么都没有了
[root@localhost ~]# ll /var/www/html/
总计 0

服务器端多个目录,配置文件写法
[root@localhost ~]# vim /etc/rsyncd.conf
uid = root
gid = root
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
read only = false
list = false
hosts allow = 192.168.0.0/24
hosts deny = 0.0.0.0/32
auth users = rbackup
secrets file = /etc/rsync.password
[www]
path = /www
[bbs]
path = /bbs
[blog]
path = /blog

更改完成重启服务
[root@localhost ~]# pkill rsync && rsync --daemon

rsync+inotify实现触发式自动同步,inotify端创建或者一个文件rsync备份源也自动创建一个一模一样的文件,inotify删除一个文件rsync备份源也自动删除文件。

注意:inotify是部署在rsync服务成功的情况下

演示:
查看当前系统是否支持inotify
[root@localhost ~]# ls -l /proc/sys/fs/inotify/
总计 0
-rw-r--r-- 1 root root 0 12-11 10:36 max_queued_events  #监控事件队列
-rw-r--r-- 1 root root 0 12-11 10:36 max_user_instances  #最多监控实例数
-rw-r--r-- 1 root root 0 12-11 10:36 max_user_watches    #每个实例最多监控文件数

编译安装inotify
tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify-tools-3.14
make && make install

脚本

host01=10.0.0.191            #定义IP
src=/data0/www/www/          #定义源目录
dst=www                      #目标目录
user=rsync_backup            #备份的用户
rsync_passfile=/etc/rsync.password      #密码文件
inotify_home=/usr/local/inotify-tools-3.14/  #inotify的目录
#judge                                       
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
  echo "Check File and Folder"              #判断上面的文件是否存在如果不存在就报错并且退出执行
  exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file        #监控的事件delete,create,attrib监控到之后通过read读取
        do
    cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
        done
exit 0

把脚本放到后台执行
[root@localhost ~]# sh inotify.sh &
[1] 8216
[root@localhost ~]# ps -ef | grep inotify
root      8216  7503  0 11:15 pts/2    00:00:00 sh inotify.sh
root      8217  8216  0 11:15 pts/2    00:00:00 /usr/local/inotify-tools-3.14//bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f -e close_write,delete,create,attrib /var/www/html
root      8218  8216  0 11:15 pts/2    00:00:00 sh inotify.sh
root      8220  7503  0 11:15 pts/2    00:00:00 grep inotify

这时创建几个文件
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# touch a b c d
备份服务器查看就已经同步了
[root@localhost etc]# cd /var/www/html/
[root@localhost html]# ls
a  a.txt  b  c  d

--------------------------------------分割线 --------------------------------------

Rsync 的详细介绍:请点这里
Rsync 的下载地址:请点这里

相关推荐