首页 > 代码库 > rsync + inotify 用来实现数据实时同步

rsync + inotify 用来实现数据实时同步

一、简介

1、rsync

  • 比其cp、tar备份的方法,rsync的优点是,安全性高、备份迅速、支持增量备份。只能做对实时性要求不高的数据备份,例如:备份文件服务到远端从服务器、在本地磁盘上做数据镜像等  

  • 增量备份:就是rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。但是对于大量文件达到千万量级别时,扫描所有文件是非常耗时的。 如果发生改变的只是其中的一小部分的话,这是非常低效的方式。  

  • rsync 不能实时的去监测,同步数据,虽然它可以通过 linux 守护进程的方式进行触发同步,两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。  

  • rsync 是通过 crontab 守护进程进行触发,同步数据会有差异

2、inotify

  • 异步的文件系统事件监控机制  

  • Inotify 可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 就是这样的一个第三方软件  

  • inotify 可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync 同步,这样刚好解决了同步数据的实时性问题。


同步次序:

  • rsync 不是实时同步数据的话,  rsync服务器 同步数据到 客户端

  • rsync + inotify 实现实时同步数据的话, rsync客户端主动同步给rsync服务端数据,就是客户端向服务器端发送数据的过程

二、rsync是使用

rsync命令的工作模式有四种:
  1、shell模式,也称为本地模式,速度要比cp快
  2、远程shell模式,其可以借助于ssh协议承载其数据传输过程
  3、列表模式,其工作方式与ls相似,仅列出源的内容:-nv
  4、服务器模式,此时,rsync可以工作为守护进程,能够接收客户端的数据传输请求,在使用时可以在客户端使用rsync命令发送给守护进程,也可以向服务器主获取文件。  

rsync命令的选项:
  -n:如果担心命令执行不正确,一同步复制,可能这个复制的后果是致命的,那后果可就严重了,这里我们可以加-n先测试一下
  -v: --verbose,详细输出模式、显示详细过程的
  -q: --quiet,静默模式,尽可能输出少的信息
  -c: --checksum,可以对传输的文件进行较验的,强制对文件传输进行校验
  -r: --recursive,递归复制
  -a: --archives,归档,复制时可以保存原有的属主属主等属性信息,甚至包括一点额外的属性、如访问控制列表
  -p: --perms,保存文件的权限
  -t: --times,保留文件的时间戳
  -l: --links,保留文件的符号链接
  -g: --group,保留文件的属组
  -o: --owner,保留文件的属主
  -D: --devices,保留设备文件  

  -e SSH:远程复制时,表示使用ssh协议作承载
  -z:基于网络时使用,对文件压缩后传输
  --progress:显示压缩进度条的
  --stats:显示如何执行压缩和传输的,也就是显示传输状态的  

注意:rsync命令使用中,如果源参数的末尾有斜线,就会复制指定目录内容,而不复制目录本身;没有斜线,则会复制目录本身,因此有如下命令:
  # rsync -r /mydata/data /backups/:会把目录data直接同步至/backups目录中去
  # rsync -r /mydata/data/ /backups/:会把目录中的data/中的内容同步至/backups目录中  

rsync本地用法:
  # cd /etc /tmp/
  # rsync /tmp/etc/passwd /tmp/test/passwd -nv
推送到远程主机上去,把本地的etc文件推送到172.16.39.1主机上去:
  # rsync -r -e ssh /tmp/etc root@172.16.39.1:/tmp/

拉取远程服务器上的文件:
  # rsync -e ssh -r -a root@172.16.39.1:/etc/pam.d ./ --stats  

把文件推送到服务器端上去:
# rsync -auzv messages myuser@172.16.39.1::my_data_rsync

如果我们从服务器上拉取文件时必须要指定文件路径
# rsync myuser@172.16.39.1::my_data_rsync/messages /tmp/








三、 检测内核是否支持inotify8

因为内核版本在2.6.13版本以上才支持,所以要确保内核版本可以使用,使用命令 uname –r

[root@node1 ~]# uname -r
2.6.32-431.el6.x86_64
我的版本为 2.6.32  高于 2.6.13所以可以使用
  • 也可以通过如下方法判断内核是否支持inotify
[root@node1 ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Apr 28 12:18 max_queued_events
-rw-r--r-- 1 root root 0 Apr 28 12:18 max_user_instances
-rw-r--r-- 1 root root 0 Apr 28 12:18 max_user_watches

max_queued_evnets:表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。
  max_user_instances:表示每一个real user ID可创建的inotify instatnces的数量上限。
  max_user_watches:表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches

如果有上面3项输出,就表示系统默认支持inotify,可以开始安装inotify-tools工具了


四、企业应用案例

image

为了保证用户访问到的数据的一致性和实时性,必须保证3个节点上的数据和内容同发布节点上的数据始终是一致的。需要保证文件同步,那就需要rsync 、保证数据是实时的,那就需要inotify来监视内容发布节点文化的变化,如果内容有改动过,那么就启动rsync,将文件实时同步到3个节点上去。

剖析实现过程: sync+inotify 是客户端主动让服务端同步数据
  • 内容发布节点(sync+inotify)充当rsync客户端的角色
  • 服务节点(sync)充当 rsync服务端的角色
  • 数据同步过程: 客户端(sync+inotify)向服务端(rsync)同步数据的过程
  • 说白了,就是 内容发布节点主动将自己的内容同步到各服务节点上去的过程。
  • inotify监控着 内容发布节点的一举一动,只要有改变,就主动同步到3个服务节点上去,所以inotify要安装在内容发布节点上。
五、配置过程
  1. 给服务节点上配置rsync
各服务节点以服务端方式运行
以deamon守护方式运行
  1. 又因为是基于xinetd超级守护进程工作的,所以我们先要安装 xinetd    [root@node2 ~]# yum -y install xinetd
  2. 为rsync提供配置文件 /etc/rsyncd.conf,这个配置文件分为两段,一段是全局设定,一段是可以定义多个rsync共享目录
    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 定义共享目录的模块
     [web] 要同步的目录名称,多个目录名称是不能重名的
     path = /web/www2/ : 定义目录的路径
     ignore errors = yes : 表示如果中间复制过程有一个文件出错了是要继续复制还是中止复制,yes表示继续复制,no表示中止复制
     read only = no :如果打算让别人仅仅是来拉取数据的,yes就可以了,如果打算让别人推送过来做备份的那就为no,表示客户端是否可以推送的
     write noly = no :只允别人在里面写数据,但不可以拉取数据
     hosts allow = 192.168.1.112:做白名单的,是否允许哪些主机可以访问的
     hosts deny = * :黑名单的
        说明:
        1、二者都不出现时,默认为允许访问
        2、只出现hosts allow,定义白名单,但没有被匹配到的主机由默认规则处理,即为允许
        3、只出现hosts deny,定义黑名单,出现在名单中的都被拒绝
        4、二者同时出现,先检查hosts allow,如果匹配就allow,否则检查hosts deny,如果匹配则拒绝,如是二者都不匹配,则由默认规则处理,即为允许
    list = false :是否允许用户列出文件列表的
    uid = root :以哪个用户身份去获取文件的
    gid = root
    auth users = admin:做用户验证的,只允许哪个用户来复制
    secrets file = /etc/.rsync.passwd :存放验证用户的密码的

3、配置密码文件 /etc/.rsyncd.passwd 存放验证用户的密码的,权限给600

1、[root@node2 ~]# vim /etc/rsync.passwd

    admin:admin

2、[root@node2 ~]# chmod 600 /etc/rsync.passwd

        4、配置服务能够启动,监听在tcp / 873端口上

1、[root@node2 ~]# chkconfig rsync on
2、[root@node2 ~]# service xinetd start
   Starting xinetd:                                           [  OK  ]
3、[root@node2 ~]# ss -tnl
   State       Recv-Q Send-Q      Local Address:Port        Peer Address:Port 
   
   LISTEN      0      128                     *:50655                  *:*     
   LISTEN      0      64                     :::873                   :::*     
-----------------------服务端配置完毕-------------------------
2、配置客户端(rsync + inotify)
安装 inotify-tools 程序包
1、[root@node1 ~]# rpm -ivh inotify-tools-3.14-1.el6.x86_64.rpm 
    warning: inotify-tools-3.14-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
     Preparing...                ########################################### [100%]
     1:inotify-tools          ########################################### [100%

2、可以看到生成了两个二进制文件

    [root@node1 ~]# rpm -ql inotify-tools
    /usr/bin/inotifywait
    /usr/bin/inotifywatch


3、创建一个目录存放要同步的数据:


    [root@node1 ~]# mkdir -pv /web/www2
    mkdir: created directory `/web‘    mkdir: created directory `/web/www2‘

4、进入到改同步数据的目录中,创建一个脚本 inotifyrsync.sh

  查看我们在客户端上安装的rsync生成的二进制文件,一会在脚本要执行,我们需要知道路径

    [root@node2 ~]# rpm -ql rsync
     /etc/xinetd.d/rsync
     /usr/bin/rsync   这个为我们要在脚本中使用的二进制文件
   1、[root@node1 ~]# cd /web/www2
   2、[root@node1 www2]# vim inotifysync.sh
 
     #!/bin/bash
     host=192.168.1.111         #从服务器的主机地址
     data_dir=/web/www2/       #内容发布服务器上创建的同步数的路径 dst=web                     #要同步数据到服务端的(服务端配置文件中定义的共享模块的名称)                     
     username=admin               #从服务器上/etc/rsyncd.passwd这个文件中定义的用户名            
     /usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e modify,delete,create,attrib $data_dir | while read filesdo/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $data_dir $username@$host::$dstecho "${files} was rsynced" >> /tmp/rsync.log 2>&
            done
             inotifywait 程序的使用:

                   #决对路径执行inotifywait这个程序,

                   #-m, 即--monitor,表示始终保持事件监听状态。

                   #-r, 即--recursive,表示递归查询目录。

                   #-q, 即--quiet,表示打印出监控事件。

                   #-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等。

                   #--timefmt:指定时间的输出格式。

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

3、创建一个密码文件,和rsync服务端的在相同的路径
    里面你写如密码,不写账户名称
    1、[root@node1 www2]# vim /etc/rsyncd.passwd

        admin
        改权限为 600
    2、[root@node1 www2]# chmod 600 /etc/rsyncd.passwd
4、赋值执行权限和以后台模式运行
    1、[root@node1 www2]# chmod 755 /web/www2/inotifysync.sh 
    2、[root@node1 ~]# bash /web/www2/inotifysync.sh &
       








测试:

1、来看看rsync的服务器端目录下的文件:
image
什么都没有!!
2、我们来给rsync + inotify 客户端的 /web/www2/文件中放入一些文件,再查看rsync的服务端有没有同步过去
image
我们把 /etc/fstab 放到 /web/www2/共享目录中来
刚才运行在后台的  inotifysync.sh 已经记录下东西了,我们来看看
image
因为之前测试过一次了,所以这里传了两次的记录
3、再看看我们的  rsync 服务端文件有没有传过去
image
看到了吧,已经过来了,表示成功了
总结教训:
1、在rsync + inotify 客户端中不要忘记创建密码文件
   密码文件的名字和在rsync服务端创建的密码文件的名字相同

本文出自 “linux运维” 博客,请务必保留此出处http://xz159065974.blog.51cto.com/8618592/1405209