rsync+inotify实现实时同步原理和应用

Rsync介绍

rsync
rsync(remote synchronize),是一款开源的快速实现远程同步和数据备份的优秀工具。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能同时它在同步文件的同时可以保持原来文件的权限、时间、软硬链接等附加信息。 rsync使用 “rsync 算法”可以实现数据的差异化备份(只同步有变化的内容)

Rsync特性

1)支持拷贝特殊文件如链接,设备等
2)可以有排除指定文件或目录同步的功能,相当于打包命令tar
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接
6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。

Rsync安装
高版本得centos和ubuntu均已默认安装 rsync的官方网站http://rsync.samba.org/

tar  zxvf rsync-3.1.0.tar.gz 
cd rsync-3.1.0
./configure --prefix=/usr/local/
make && make install
#*服务器和客户端均要安装rsync*

rsync六种工作模式

  1. 拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如:rsync -a /data /backup
  2. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如:rsync -avz *.c foo:src
  3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如:rsync -avz foo:src/bar /data
  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。如:rsync -av [email protected]::www /databack
  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如:rsync -av /databack [email protected]::www
  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://192.168.78.192/www

常用选项和含义(详细使用man rsync)

-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-v, –verbose 详细模式输出。
-z, –compress 对备份的文件在传输时进行压缩处理。
-q, –quiet 精简输出模式。
-r, –recursive 对子目录以递归模式处理。
-R, –relative 使用相对路径信息。
-h, –help 显示帮助信息。

实例:通过推送方式和拉取方式实现远程数据同步
推送方式
rsync -avz -e 'ssh' filename user@host:/Catalog
案例1

rsync -avz -e 'ssh' /home/anan/bin/*  anan@10.1.11.145:/home/anan/bin #同步/home/anan/bin/下的所有文件到10.1.11.145主机/home/anan/bin目录

拉取方式
rsync -avz -e 'ssh' user@host:/catalog/filename /Catalog
案例2

rsync -avz -e 'ssh' anan@10.1.11.177:/home/anan/bin/*  /home/anan/bin #将10.1.11.177的/home/anan/bin目录下的所有文件都同步到本机的/home/anan/bin目录

后台服务方式
启动rsync服务,编辑/etc/xinetd.d/rsync文件,将其中的disable=yes改为disable=no,并重启xinetd服务。

service rsync
{
        disable = yes #修改为no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

service xinetd restart
创建配置文件/etc/rsync.conf #实现对web页面的备份

uid=root
gid=root
max connections=4
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
secrets file=/etc/rsyncd.passwd
hosts allow=10.1.11.33/22

[www]
comment= backup web
path=/var/www/
read only = no
exclude=test
auth users=root

创建密码文件

echo "root:password" >> /etc/rsyncd.passwd #这里输入你的密码
chmod 600 /etc/rsyncd.passwd

开始备份
rsync -avz --progress --delete [email protected]:/var/www /databack/
进行数据恢复
rsync -avz --progress /var/www [email protected]:/databack

推荐参考:
rsync命令 http://man.linuxde.net/rsync

Inotify介绍

inotify
Inotify可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检测的对象。

安装

rpm -qa inotify-tools #如果没安装
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install inotify-tools -y

参数详解

-e: 事件 
-d:后台运行
-m:始终保持事件监听状态
-q:打印很少的信息,仅仅打印监控事件的信息  安静状态
-r :递归查询目录
-timefmt:指定时间输出的格式
-excluder:排除文件或者目录的时候不区分大小写
Events:

        access          file or directory contents were read   访问

        modify          file or directory contents were written  修改

        attrib          file or directory attributes changed  属性发生变化

        close_write     file or directory closed, after being opened in  写入之后关闭

                        writeable mode

        close_nowrite   file or directory closed, after being opened in  

                        read-only mode

        close           file or directory closed, regardless of read/write mode 

        open            file or directory opened

        moved_to        file or directory moved to watched directory  移动到哪里

        moved_from      file or directory moved from watched directory

        move            file or directory moved to or from watched directory

        create          file or directory created within watched directory

        delete          file or directory deleted within watched directory

        delete_self     file or directory was deleted

        unmount         file system containing file or directory unmounted卸载

案例实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-06-05
# @Author  : ${anan} ($mail})
# @Link    : ${link}
# @Version : $v1.0$
# function :实现对当前目录的监控,若当前目录有文件内容修改,则将修改的日志打印出来。
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG,
                            format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
try:
    while True:
        time.sleep(30)
except KeyboardInterrupt:
    observer.stop()
    observer.join()

猜你喜欢

转载自blog.csdn.net/sinat_34789167/article/details/80597562