码迷,mamicode.com
首页 > 其他好文 > 详细

rsync+inotify 数据实时同步备份

时间:2015-04-20 07:05:25      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:rsync   inotify   dnspot-sr   同步   

一、rsync

rsync - a fast, versatile, remote (and local) file-copying tool.

rsync synopsis:

    rsync 支持三种传输模式:

  • local    本地

  • remote shell   (ssh, rsh)

  • rsync daemon     

    rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
    当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
    特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。

Local:  rsync [OPTION...] SRC... [DEST]

Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

Access via rsync daemon:
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
Usages with just one SRC arg and no DEST arg will list the source files instead of copying.

    Rsync is a fast and extranordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon. Rsync finds files that need to be transferred using a "quick check" algorithm(by default) that looks for files that have changed in size or in last-modified time. Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file‘s data does not need to be updated.


    A trailing slash on the source changes this behavior to avoid creating an additional directory level at the destination. You can think of a trailing / on a source as meaning "copy the contents of this directory" as opposed to "copy the directory by name", but in both cases the attributes of the containing directory are transferred to the containing directory on the destination. In other words, each of the following commands copies the files in the same way, including their setting of the attributes of /dest/foo:

rsync -av /src/foo /dest            # create foo directory in /dest/
rsync -av /src/foo/ /dest/foo          # cp /src/foo/* /dest/foo

CONNECTING TO AN RSYNC DAEMON

    It is also possible to use rsync without a remote shell as the transport. In this case you will directly connect to a remote rsync daemon, typically using TCP port 873. (This obviously requires the daemon to be running on the remote system, so refer to the STARTING AN RSYNC DAEMON TO ACCEPT CONNECTIONS section below for information on that.)

    Some modules on the remote daemon may require authentication. If so, you will receive a password prompt when you connect. You can avoid the password prompt by setting the environment variable RSYNC_PASSWORD to the password you want to use or using the --password-file option. This may be useful when scripting rsync.

WARNING: On some systems environment variables are visible to all users. On those systems using --password-file is recommended.


rsync 的安装

for CentOS:
# yum -y install rsync

for ubuntu/debian
# sudo apt-get install rsync

rsync 的配置文件

    rsync daemon,有两种方式。其一是通过xinetd进程来管理;其二作为一个独立的进程启动。

经由 xinetd 控管:

第一步:安装 xinetd
# yum -y install xinetd

第二步:编辑配置文件, 启动 rsync
# vim /etc/xinetd.d/rsync 
disable = yes        # 将disable=yes改为no
修改为:
disable = no

第三步:重新启动 xinetd 进程
# service xinetd restart

查看状态:
[root@skype ~]# ss -tulpn | grep 873
tcp    LISTEN     0      64                    :::873                  :::*      users:(("xinetd",1446,5))

作为独立进程启动:

运行的时候,加上 --daemon 选项
# /usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf

下面我们将涉及到三个文件 rsyncd.conf,rsyncd.secrets 和rsyncd.motd。

rsyncd.conf 是rsync服务器主要配置文件。
rsyncd.secrets是登录rsync服务器的密码文件。
rsyncd.motd是定义rysnc 服务器信息的,也就是用户登录时,所显示的信息。

我们需要手动建立这三个文件:

[root@skype ~]# mkdir /etc/rsync.d
[root@skype ~]# touch /etc/rsync.d/rsyncd.{conf,secrets,motd} 
[root@skype ~]# tree /etc/rsync.d
/etc/rsync.d
|-- rsyncd.conf
|-- rsyncd.motd
`-- rsyncd.secrets

为了安全性,我们必须把 /etc/rsync.d/secrets 权限设置为 600
[root@skype ~]# chmod 600 /etc/rsync.d/rsyncd.secrets 
[root@skype ~]# ls -l /etc/rsync.d/rsyncd.secrets
-rw-------. 1 root root 0 Apr 19 15:54 /etc/rsync.d/rsyncd.secrets

rsyncd.secrets 格式

user1:123456    # 用户名:密码, 一行表示一个用户,此用户和系统用户无关

这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!


rsyncd.conf 格式

# Global Settings 全局设定
uid = nobody :以哪个用户的身份运行或获取数据的
gid = nobody :用户都以来宾帐号的方式运行
use chroot = no :在服务运行时要不要把他锁定在家目录
max connections = 10 :做为服务器端最大并发连接数
strict modes = yes :表示是否工作在严格模式下,严格检查文件权限等相关信息
pid file = /var/run/rsyncd.pid : 定义pid文件路径
log file = /var/log/rsyncd.log : 定义日志文件存放路径的
# Directory to be synced  定义共享目录的模块
[my_data_rsync] 要同步的目录名称,多个目录名称是不能重名的
path = /myrsync/data : 定义目录的路径
ignore errors = yes : 表示如果中间复制过程有一个文件出错了是要继续复制还是中止复制,yes表示继续复制,no表示中止复制
read only = no :如果打算让别人仅仅是来拉取数据的,yes就可以了,如果打算让别人推送过来做备份的那就为no,表示客户端是否可以推送的
write only = no :只允别人在里面写数据,但不可以拉取数据
hosts allow = 172.16.251.244:做白名单的,是否允许哪些主机可以访问的
hosts deny = * :黑名单的
    说明:
    1、二者都不出现时,默认为允许访问
    2、只出现hosts allow,定义白名单,但没有被匹配到的主机由默认规则处理,即为允许
    3、只出现hosts deny,定义黑名单,出现在名单中的都被拒绝
    4、二者同时出现,先检查hosts allow,如果匹配就allow,否则检查hosts deny,如果匹配则拒绝,如是二者都不匹配,则由默认规则处理,即为允许
list = false :是否允许用户列出文件列表的
uid = root :以哪个用户身份去获取文件的
gid = root
auth users = myuser:做用户验证的,只允许哪个用户来复制
secrets file = /etc/.rsync.passwd :存放验证用户的密码的


# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
 
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid   
port = 873
address = 192.168.3.134
#uid = nobody
#gid = nobody   
uid = root   
gid = root   
 
use chroot = yes 
read only = yes     
 
 
#limit access to private LANs
hosts allow=192.168.3.0/255.255.255.0 10.0.1.0/255.255.255.0 
hosts deny=*
 
max connections = 5
motd file = /etc/rsyncd/rsyncd.motd
 
#This will give you a separate log file
#log file = /var/log/rsync.log
 
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
 
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
 
[linuxsirhome]   
path = /home   
list=yes
ignore errors
auth users = user1
secrets file = /etc/rsyncd/rsyncd.secrets 
comment = linuxsir home 
exclude = beinan/  samba/

读取 rsync.password 这个文件。这个文件内容只是linuxsir用户的密码


  1. -a:归档模式,保持文件的所有属性,相当于-rlptgoD 

  2. -r:递归模式 

  3. -e:指定一个远程shell 

  4. -z:文件传输时进行压缩处理 

  5. --delete:镜像中常用,删除DEST中那些SRC中不存在的文件 


二、inotify

在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如:

  • 通知配置文件的改变

  • 跟踪某些关键的系统文件的变化

  • 监控某个分区磁盘的整体使用情况

  • 系统崩溃时进行自动清理

  • 自动触发备份进程

  • 向服务器上传文件结束时发出通知

    通常使用文件轮询的通知机制,但是这种机制只适用于经常改变的文件(因为它可以确保每过x秒就可以得到i/o),其他情况下都非常低效,并且有时候会丢失某些类型的变化,例如文件的修改时间没有改变。像Tripwire这样的数据完整性系统,它们基于时间调度来跟踪文件变化,但是如果想实时监控文件的变化的话,那么时间调度就束手无策了。Inotify就这样应运而生了。

Inotify到底是什么?

    Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。在BSD和Mac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化(增加、删除、修改、移动等各种细微事件)。近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:

% grep INOTIFY_USER /boot/config-$(uname -r)
CONFIG_INOTIFY_USER=y

如果输出(‘CONFIG_INOTIFY_USER=y‘),那么你可以马上享受Inotify之旅了。

安装inotify-tools

# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar xf inotify-tools-3.14.tar.gz 
# cd inotify-tools-3.14

# ./configure
# make && make install

inotifywait命令使用

#!/bin/bash
#filename watchdir.sh
path=$1
# /usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y/%H:%M‘ --format ‘%T %w %f‘ -e  modify,delete,create,attrib $path

/usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e modify,delete,create,attrib $data_dir | while read files
   do
   #rsync -avzP $host::$dst $data_dir
   rsync -avzP --delete --progress $data_dir $host::$dst
   echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 
done
[root@node1 inotify-tools-3.14]# chmod u+x inotify_rsync.sh 
[root@node1 inotify-tools-3.14]# bash inotify_rsync.sh &
[1] 4533
[root@node1 inotify-tools-3.14]# ps -ef | grep inoti | grep -v "grep"
root      4533  1880  0 18:02 pts/1    00:00:00 bash inotify_rsync.sh
root      4534  4533  0 18:02 pts/1    00:00:00 /usr/local/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e modify,delete,create,attrib /data/node1/
root      4535  4533  0 18:02 pts/1    00:00:00 bash inotify_rsync.sh

inotifywait命令参数

  • -m是要持续监视变化。

  • -r使用递归形式监视目录。

  • -q减少冗余信息,只打印出需要的信息。

  • -e指定要监视的事件列表。

  • --timefmt是指定时间的输出格式。

  • --format指定文件变化的详细信息。

技术分享

三、rsync + inotify 实时同步

master: 192.168.3.133 (rsync 分发节点,推送, inotify)

slave:  192.168.3.134 (rsync 服务节点,配置rsync --daemon 方式启动)


配置 slave(192.168.3.134): 

1、安装 rsync 软件

# yum install rsync

2、手动创建rsync配置文件

# mkdir /etc/rsync.d
# vim /etc/rsync.d/rsyncd.conf
#全局配置开始,运行rsync的用户
uid = root                             
gid = root                            
usechroot = no                   
max connections = 10           
timeout = 600                      
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log


[dnspod-sr]                            
path = /root
ignore errors
read only = no
write only = no
list = false   
hosts allow = 192.168.3.133
# hosts allow = 192.168.1.0/24 
# hosts deny = 0.0.0.0/32   
auth users = backuser    
secrets file = /etc/rsync.d/rsyncd.secrets

3、创建备份目录

# mkdir  dnspod-sr

4、建立 rsync 用户和密码文件

  • /etc/rsync.d/ rsyncd.secrets 格式为: username:password 

  • 权限必须是600, chmod 600 /etc/rsync.d/rsyncd.secrets

# echo ‘backuser:123‘ >> /etc/rsync.d/rsyncd.secrets
更改权限,必须是 600
# chmod 600 /etc/rsync.d/rsyncd.secrets

5、启动rsync并添加开机启动

# /usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf
# echo "/usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf" >> /etc/rc.local


配置 master:  inotify

1. 安装 inotify 软件包

# wget  http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

# tar zxf inotify-tools-3.14.tar.gz

# cd inotify-tools-3.14

# ./configure && make && make install

2. 写一个脚本来实现,当 /root/dnspod-sr 中文件有变化时,让各rsync服务节点同步数据:

# vim /root/inotify.sh

#!/bin/bash

src=/root/dnspod-sr            #此文件是rsync客户端本地文件,需要上传到各个rsync服务节点

des=dnspod-sr                     # slave 需要被上传推送的目录, rsyncd.conf 指定的模块 [dnspod-sr]

host=192.168.3.134                     #rsync服务节点

user=backuser                 

/usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f‘ -emodify,delete,create,attrib $src | while read file

do

   #rsync -avzP $host::$dst $data_dir

 /usr/bin/rsync -avzP --delete --progress $src $user@$host::$des --password-file=/etc/rsync.password

   echo "${file} was rsynced" >> /var/log/rsync.log 2>&1 

done

注释:
inotifywait
-m:保持监听事件。
-r:递归查看目录。
-q:打印出事件。
-e modify,delete,create,attrib:监听写入,删除,创建,属性改变事件。

rsync
-a:存档模式,相当于使用-rlptgoD。
-v:详细模式输出。
-z:传输过程中压缩文件。

3. 给予执行权限

创建 /etc/rsync.password 文件,可以放在任意位置, 为之前指定的 backuser 保存密码

  • 格式为:password    # 在这里被坑了一次

  • 权限为600:chmod 600 rsync.password

# echo "123" >> /etc/rsync.password

# chmod 600 /etc/rsync.password

# chmod +x /root/inotify.sh

# /root/inotify.sh &        #在后台执行

4.最后,将此脚本加入系统自启动文件

# echo "/root/inotify.sh" >> /etc/rc.local


四、rsync如何排除不想同步的目录或文件

单个文件排除:比如我不想同步/opt/aa.php文件,直接使用 --exclude “aa.php”

rsync -vzrtopg --delete --progress --exclude"aa.php" $src backuser@$ip::$des--password-file=/etc/rsync.password > /dev/null 2>&1 && echo"$src was rsynced"
多个文件或目录排除:使用--exclude-from=“/root/xx.list”,文件列表,此文件名写绝对路径,写在哪里都可以,不必就写在/opt目录下

rsync -vzrtopg --delete --progress --exclude-from="/root/xx.list" $src backuser@$ip::$des --password-file=/etc/rsync.password > /dev/null2>&1 && echo "$src was rsynced"

编辑要排除文件的列表,即/root/xx.list

编辑要排除的文件列表,其中目录直接写目录名,文本文件写相对路径


本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1635859

rsync+inotify 数据实时同步备份

标签:rsync   inotify   dnspot-sr   同步   

原文地址:http://skypegnu1.blog.51cto.com/8991766/1635859

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!