zoukankan      html  css  js  c++  java
  • rsync+inotify实现实时同步

    rsync+inotify实现实时同步

    1、数据同步:

    1.数据同步:

    A服务器的一个目录同步到B服务器上的一个目录

    方法是:可以在A服务器上把这个目录共享(如ftp,http等),然后B服务器上写shell脚本,用crontab做定时任务下载过来(数据同步不实时)

    实时同步

    方法是:rsync远程目录实时同步

                 drbd远程存储实时同步(很老的方案)

                 共享存储,就是同一个磁盘设备同时被很多人用

                 分布式存储(云存储)

    2、同步、异步和远程同步

    sync同步

    async异步

    rsync 远程同步

    这里主要说rsync,在开始之前需要了解以下几个问题:

    rsync是什么;rsync的工作原理;rsync优点不足;rsync认证方式;安装rsync;rsync命令参数详解;配置rsync;rsync的启动与关闭;rsync同步实例

    2.1 rsync是什么

    rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。

    rsync第一次会全量传输,后续会对比两个文件的不同,只传输文件更新的部分,传输速度比一般工具快。

    rsync还可以拷贝、显示目录属性及拷贝文件,并可选择性的压缩及递归拷贝。

    2.2 rsync的工作原理

    2.2.1 命令或者脚本运行之后,同步端开始构造FileList,FileList就是被同步端需要同步的文件索引,name->id(每个文件都有一个id值,如MD5)

    2.2.2 同步端构造完成之后,将FileList发送到被同步端,被同步端rsync处理发送的FileList,然后开始同步。

    2.2.3第二次同步时,因为两边的都有文件,同步端构造发送这边的FileList,被同步端rsync处理同步端发送的FileList,根据MD5值比较,删除同步端已经相同的文件信息,保留不存在和更新的文件,来构建新的FileList。

    2.2.4 同步端收到被同步端新的FileList,然后开始同步文件到同步端。

    2.3 rsync有点

    优点:

    安全性高

    备份迅速,使用同步算法,只比较变化

    支持增量备份

    保存源目录整个目录树和文件系统

    保持源文件的权限、时间、软硬连接等

    无需特使权限即可安装

    优化流程和比较高的文件传输效率。

    多样方式来传输文件。

    支持匿名运行,方便网站镜像。

    与scp相比,rsync传输速度远在scp之上。(局域网测试,rsync是scp的20倍)

    解决对实时性要求不高的数据备份需求

    不足:

    同步数据,需要扫描所有文件进行对比,才进行差量传输。如果文件数量达到百万甚至千万级,扫描文件对比文件将非常耗时,降低了rsync效率。

    rsync不能实时地区监测、同步数据。虽然可以通过守护进程方式触发同步,但两次动作间有时间差,导致数据不一致,无法应对出现故障时完全恢复数据。

    解决: rsync+inotify来弥补不足。

    2.4 认证方式

    2.4.1 两种方式

    rsync-daemon

    ssh

    注意:在使用rsync时,同步端和被同步端都必须安装rsync程序。

    2.4.2 rsync-daemon认证

    在rsync-daemon认证方式下,默认监听毒tcp的873端口

    在rsync-daemon认证下,rsync可以把密码写入到一个文件中。

    注意:被同步端的rsync必须启动,配置文件。同步端可以不起动服务,但必须有这个应用。

    2.4.3 ssh认证

    通过ssh隧道进行传输,类似于scp工具,同步操作不在局限于rsync中定义的同步文件夹,并且双方只要安装rsync,也不要双方启动rsync。

    如:rsync -avz /root/test root@192.168.19.248:/root/

    若rsync服务端SSH为非标准端口,可通过rsync的-e参数进行端口指定。使用方式如下:

    rsync -avz /root/test -e ‘ssh -p1234’ root@192.168.19.248:/root/

    2.5一般用到的工具跟实例

    2.5.1 wget工具

    wget http://10.1.1.9/linux_basic01.txt   --直接下载到当前目录

    wget --no-check-certificate https://www.baidu.com/img/bd_logo1.png   # 有https连接的,下载时需要加--no-check-certificate参数

    wget http://10.1.1.9/linux_basic01.txt -O /test/123  #把文件下载下来改名为/test/123

    wget -m -k -np http://10.1.1.9/shell/#只下载shell目录,但注意shell后面一定要加/

    wget -m  http://www.xxx.com#下载整个网站

    2.5.2 转化本地yum源:

    如何下载一个epel的扩展yum源,并转化成本地的yum源

    使用wget下载;使用reposync下载

    reposync下载的做法步骤如下:

    先在本地yum配置里写上你要下载的yum源的路径,如

    # vim /etc/yum.repos.d/rhel-source.repo

    [epel]

    server=epel

    baseurl=http://xxx.xxx.xxx/--网络路径

    gpgcheck=0

    enabled=1

    # yum repolist    --列出你现在所有配置的repo的名字

    # reposync --repoid=epel--把epel路径的所有软件包下载到本地当前目录

    下载到本机目录后,cd进去,使用createrepo  .命令创建软件仓库的货物清单目录repodata

    把yum的写法改成

    # vim /etc/yum.repos.d/rhel-source.repo

    [epel]

    server=epel

    baseurl=file:///xxx/--写上你的本地目录路径(也就是repodata的上级目录地址)

    gpgcheck=0

    enabled=1

    3 安装rsync

    两种方式:源码安装和rpm安装

    3.1源码安装

    3.1.1 下载

    先去官网下载源码包

    https://rsync.samba.org/

    wget --no-check-certificate https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz

    有https连接的,下载时需要加--no-check-certificate参数

    3.1.2 安装

    [root@localhost rsync-3.1.2]# tar xf rsync-3.1.2.tar.gz 

    [root@localhost rsync-3.1.2]# cd rsync-3.1.2

    [root@localhost rsync-3.1.2]# ./configure

    [root@localhost rsync-3.1.2]# make && make install

    注意:需要gcc库要提前安装

    默认会安装到/usr/local/下,通过./configure --help

    wKiom1keTdDhsqfGAAANQJJ3kUE385.png-wh_50

    安装完成后,查看rsync帮助,需要切换到/usr/local/bin目录下:

    /usr/local/bin

    rsync -h

    [root@localhost rsync-3.1.2]# cd /usr/local/bin

    [root@localhost bin]# ll

    total 1344

    -rwxr-xr-x 1 root root 1373922 May 16 18:46 rsync

    [root@localhost bin]# pwd

    /usr/local/bin

    源码安装的rsync,需要开机启动,把启动命令放在rc.local文件中,如下:

    echo “/usr/local/bin/rsync –daemon –config=/etc/rsyncd.conf”>>/etc/rc.local

    也可以写成:

    echo “/usr/local/bin/rsync –daemon”>>/etc/rc.local

    cat /etc/rc.local

    3.2 RPM方式安装

    直接yum安装:yum -y install rsync

    查看rsync安装位置,如下:

    [root@localhost bin]# rpm -ql rsync

    rsync安装到了/usr/bin,并且生成一个/etc/xinetd.d/rsync文件。

    查看安装时产生的帮助文档:

    [root@localhost bin]# more /usr/share/doc/rsync-3.0.6/README

    which rsync

    rsync --help

    3.3 能否把rsync做成服务的形式,加上一些控制功能或日志记录功能

    3.3.1两个知识点:

    xinetd

    man rsyncd.conf

    两个一起共存,共同控制rsync

    3.3.2 xinetd介绍

    xinetd类似于一个托管服务,托管其他一些其它小服务,好处是可以使用xinetd强大的参数来控制这些服务

    如:

    /etc/xinetd.conf--主配置文件,一般不用配置,主要配置子配置文件

    /etc/xinetd.d--子配置文件目录

    xinetd服务相当于是所有被拖管服务的总开关

    # yum install  -y xinetd

    xinted需要配置文件:

    vi /etc/xinetd.d/rsync    --(man xinetd.conf参考帮助)

    service rsync

    {

    disable = no     --yes表示关闭,no表示开启 (启动rsync服务,两个条件:1,disable = no 2,xinetd服务要启动)

    flags = IPv6

    socket_type = stream

    wait = no        --并发连接

    user = root      --跑守护进程的用户

    server = /usr/bin/rsync  --启动程序路径

    server_args = –daemon –config=/etc/rsyncd.conf --启动参数(这三个参数合起来就是表示用root身份执行/usr/bin/rsync --daemon来启动rsync服务)

    log_on_failure += USERID  --控制日志格式,表示登录服务失败时,在日志原格式上加上记录USERID

    }

    配置完毕,还需要安装xinted软件包,否则无法启动xinetd

    root@localhost bin]# yum install -y xinetd

    [root@localhost bin]# /etc/init.d/xinetd start

    Starting xinetd:                                           [  OK  ]

    [root@localhost bin]# /etc/init.d/xinetd start

    Starting xinetd:                                           [  OK  ]

    [root@localhost bin]# chkconfig xinetd on

    [root@localhost bin]# netstat -tlunp |grep 873

    tcp        0      0 :::873                      :::*                        LISTEN      8831/xinetd

    4 rsync命令参数详解

    查看参数最好的方法就是去查看帮助信息:

    rsync --help

    4.1 常用参数

    -v, –verbose详细模式输出。

    -a, –archive归档模式,表示以递归方式传输文件,并保持所有文件属性不变。

    -l 保留软链接

    -R 保留相对路径

    -H 保留硬链接

    -p,-o,-g,-A  分别保留权限,属主,属组,acl等,但如果加了-a,这些就都包括了

    -z, –compress对备份的文件在传输时进行压缩处理。

    -D    等于--devices  --specials    表示支持b,c,s,p类型的文件

    –delete:删除那些DST中存在而在SRC中没有的文件。

    4.2 普通应用

    rsync -av  /home/    /backup/     --本机上的同步,把/home目录下的内容同步到/backup目录下(包括隐藏文件)

    rsync -av /home/ 192.168.19.248:/backup/    --把本地的/home目录内容,同步到远端218的/backup目录下,需要远程的192.168.19.248的密码

    rsync -av 192.168.19.248:/backup/ /backup/    --把远端218的/backup目录下的内容同步到本地的/backup目录,需要远程的192.168.19.248的密码

    rsync  -a /test/ '-e ssh -p 2222' 192.168.19.248:/test1/  --如果远程机192.168.19.248的ssh端口不为默认的22,比如改成了2222,那么需要这样写

    注意的问题:

    同步时保留原路径,也就是把/home同步到/backup会变成/backup/home/*再内容

    --原目录后面加不加/也影响你的同步

    下面这三个有区别:

    rsync -av /home/ /backup/       

    --/home下的内容直接同步到/backup下

    rsync -av  /home    /backup/

    rsync -aRv  /home/    /backup/

    --这两上是/home被同步成/backup/home/*

    # rsync -av /share/20160516 /backup/

    --被同步成/backup/20160516/*

    # rsync -aRv /share/20160516  /backup/

    --被同步成/backup/share/20160516/*

    如果源目录有文件被删除了,那同步的目标目录是删除还是不删除,是否可以用参数来控制?

    --delete

    # rsync  -aHAX --delete /test/ /test1/        --比较完整的一个写法

    扩展file extended attributes

    # lsattr /etc/shadow        --列出文件属性

    -------------e- /etc/shadow

    # chattr +i /etc/shadow        --对这个文件加一个i属性(i属性表示文件完全不可变,不可删),会让所有用户不能修改密码

    # lsattr /etc/shadow

    ----i--------e- /etc/shadow

    # chattr -i /etc/shadow        --去掉i属性

    5 配置rsync

    5.1rsync被同步端配置

    两个文件:rsyncd.conf rsyncd.password

    字面上看,一个是主配置文件,一个是存放认证用户密码的。安装完成rsync时,不会生成这个两个配置文件,需要手工创建。cat /etc/rsyncd.conf --此文件不存在,需要手动建立(man rsyncd.conf参考帮助),路径必须是/etc/rsyncd.conf

    motd file=/etc/rsyncd.welcome  --欢迎文件,路径自定义

    uid = root

    gid = root

    user chroot = no

    max connections = 200

    timeout = 600

    pid file = /var/run/rsyncd.pid

    lock file = /var/run/rsyncd.lock

    log file = /var/run/rsyncd.log

    [backup]       -共享给客户端看到的名字,名字自定义

    path = /backup/  --实际共享的服务器路径,名字必须是你要共享的实际路径

    ignore errors

    read only = no

    list = no

    hosts allow = 192.168.19.0/255.255.255.0

    auth users = test

    secrets file = /etc/rsyncd.password

    [www]

    path = /www/

    ignore errors

    read only = no

    list = no

    hosts allow = 192.168.19.0/255.255.255.0

    auth users = apache

    secrets file = /etc/rsyncd.password

    vim /etc/rsyncd.welcome--手动建立自己定义的motd文件,并写上自定义的欢迎信息

    rsyncd.password的配置

    echo “test:test”>>/etc/rsyncd.password

    echo “apache:apache”>>/etc/rsyncd.password

    cat /etc/rsyncd.password

    注意:该密码文件中的用户和密码可以进行自定义,同时该用户不一定要在服务器中的系统用户存在。

    密码文件创建完毕后,要把其权限要设置为600,否则会在以后同步时提示验证出错。如下:

    chmod 600 /etc/rsyncd.password

    以上两个文件创建完毕后,我们来创建其对应的目录并授权,如下:

    mkdir /{backup,www}

    chown root:root –R /backup/

    chown root:root –R /www/

    5.2同步端配置

    不需要启动rsync服务,创建密码文件即可。

    echo “apache”>>/etc/rsyncd.password

    chmod 600 /etc/rsyncd.password

    注意:该密码文件中只能存放一个用户的密码,并且该文件与rsync服务器端的密码文件一样也需要把其权限设置为600。

    5.3 验证

    # rsync -a 10.1.1.9::--直接这样可以查看10.1.1.9这个服务器共享了哪些

            "hello today! @_@"--这就是你rsyncd.welcome里写的欢迎内容

    notes                   --这就是共享的名字

    # rsync -a 10.1.1.9::notes /notes/

    --这样同步,是不需要密码的;注意notes为共享名,前面有两个:: 后面/notes为本地目录

    --没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步。如果要密码写脚本就要用到expect自动应答。坏处就是不安全,但你可以使用iptables等来加强安全。

    --如果你希望有密码,也不用传密码的话,可以用rsyncd本身自带的secrets file来做验证的用户

    5.4 同步出现的问题

    如果同步报permission denied这种,可能是服务端selinux没有关闭

    关闭selinux的方法:

    # setenforce 0    --这是马上把selinux由强制模式改成警告模式

    # vim /etc/selinux/config

    SELINUX=disabled--把这个改成disabled,然后需要重启电脑才能生效

    同步时间慢

    解决方法:绑定对方主机名

    5.5在上面的基础上加上一些功能

    要求:

    把日志记录到/var/log/rsyncd.log

    共享模块要求隐藏(也就是说客户端查看不到这个模块名)  

    并且同时只能1个客户端连接进行同步这个module

    只能允许192.168.19.x(ip你自定义)同步这个module

    只能早上9点到下午6点同步

    实现:

    方法1:在/etc/xinetd.d/rsync 加上参数log_type file /var/log/rsyncd.log;

    方法2:在/etc/xinetd.d/rsync 加上参数log_type syslog local5;

    方法3:在/etc/rsyncd.conf加上参数 log file=/var/log/rsyncd.log;

    方法4:在/etc/rsyncd.conf加上参数syslog facility=local5;   --但这一句在rhel6.5经测试,必须要放在global配置里,放到modules配置里不能产生日志

    --方法2和4还需要在/etc/rsyslog.conf里加上local5.*  /var/log/rsyncd.log

    # vim /etc/rsyncd.conf

    motd file=/etc/rsyncd.welcome

    [notes]

    path=/share/20160516

    list=false

    max connections=1

    log file=/var/log/rsyncd.log

    hosts allow=192.168.19.x   

    # vim /etc/xinetd.d/rsync

    access_times = 9:00-18:00

    # /etc/init.d/xinetd restart

    6 rsync的启动与关闭

    6.1启动服务

    源码包安装的rsync,使用rsync-daemon来启动rsync。

    echo PATH=$PATH:/usr/local/bin/>>/etc/profile

    source /etc/profile

    rsync –daemon   #启动命令

    ps aux |grep rsync

    netstat -tunlp |grep 873

    如果配置不在默认位置需要手动加载 rsync –daemon –config=/etc/rsyncd.conf

    如果加载可以查看帮助文档: rsync –daemon –help

    rpm的加入到xinetd中,直接启动xinetd即可

    6.2关闭服务

    源码 pkill rsync

    rpm /etc/init.d/xinetd stop

    实现实时同步(也就是源一变化,它就会触发同步)

    7 inotify

    7.1 inotify是什么

    inotify是一种强大的、细粒度的、异步的文件系统事件监控机制。

     通过inotify可以监控文件系统中的添加、删除、修改、移 动等各种细微事件。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样一个第三方软件。rsync同步数据的实时性问题刚好有inotify得到弥补

    7.2 inotify相关参数解析

    inotify定义了三个接口参数,可以用来限制inotify消耗kernel memory的大小。

    这些参数是内存参数,可以根据需求实时调节大小。

    /proc/sys/fs/inotify/max_queued_evnets

    表示请求events数的最大值,超出这个值的事件将被丢弃。该值默认为16384。 

    注意:max_queued_events是inotify管理的队列的最大长度,文件系统变化越频繁,这个值就应该越大。

    如果你在日志中看到Event Queue Overflow,说明max_queued_events太小需要调整参数后再次使用。

    /proc/sys/fs/inotify/max_user_instances

    表示每个user可创建的instances数量上限。该值默认为128。

    /proc/sys/fs/inotify/max_user_watches

    表示可监控目录的最大数。该值默认为8192。

    要修改以上默认值,我们可以使用以下类似手段修改。如下:

    echo 30000000>/proc/sys/fs/inotify/max_user_watches

    8 inotify监控文件事件类型

    inotify可监控的文件系统事件类型,如下:

    IN_ACCESS:文件被访问。

    IN_MODIFY:文件被write。

    IN_ATTRIB:文件属性被修改,如chmod、chown等。

    IN_CLOSE_WRITE:可写文件被close。

    IN_CLOSE_NOWRITE:不可写文件被close。

    IN_OPEN:文件被open。

    IN_MOVED_FROM:文件被移出被监控目录,如mv。

    IN_MOVED_TO:文件被移入被监控目录,如mv、cp。

    IN_CREATE:文件/文件夹被创建。

    IN_DELETE:文件/文件夹被删除,如rm。

    IN_DELETE_SELF:自删除,即一个可执行文件在执行时删除自己。

    IN_MOVE_SELF:自移动,即一个可执行文件在执行时移动自己。

    IN_UNMOUNT:宿主文件系统被umount。

    IN_CLOSE:文件被关闭,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。

    IN_MOVE:文件被移动,等同于(IN_MOVED_FROM|IN_MOVED_TO)。

    注意:上面所说的文件也包括目录。

    9 inotify-tools是什么

    inotify是一个API,需要通过开发应用程序进行调用。inotify-tools就是这样的一个inotify软件,它是一套组件,包括一个C库和几个命令行工具。

    inotify是为替代dnotify而设计的,它克服了dnotify的缺陷,提供了更好用的,更简洁而强大的文件变化通知机制。

    1)inotify不需要对被监视的目标打开文件描述符,如果被监视目标在可移动介质上,那么在umount该介质上的文件系统后,被监视目标对应的watch将被自动删除,并且会产生一个umount事件。

    2)inotify既可以监视文件,又可以监视目录。

    3)inotify使用系统调用而非SIGIO信号来通知文件系统事件。

    4)inotify使用文件描述符作为接口,因而可以使用通常的文件I/O操作select和poll来监视文件系统的变化。

    10 安装inotify-tools

    两种方式:源码和rpm

    注意:inotify-tools主要是通过inotifywait和inotifywatch,这两个命令进行工作。而inotifywait命令,是生产环境中使用最多的命令。

    10.1 源码包安装

    下载地址:https://github.com/rvoicilas/inotify-tools/wiki

    注意:不建议使用wget下载inotify-tools,因为网站原因下载不成功,wget https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

    我们可以先通过浏览器下载本地,然后通过rz命令上传到服务器。

    要使用rz命令,我们需要安装lrzsz软件,如下:

    yum -y install lrzsz

    tar -xf inotify-tools-3.14.tar.gz

    ./configure

    make&&make install

    ls /usr/local/bin/

    # /usr/local/bin/inotifywait --help

    /usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or director 

    如果报错,找不到那个库,这个库实际上是在/usr/local/lib下的

    解决方法 

    # echo /usr/local/lib/  > /etc/ld.so.conf.d/abc.conf

    # ldconfig

    10.2 rpm包安装

    配置yum源

    我们可以去下面这个连接下载最新的yum源,如下:

    http://dl.fedoraproject.org/pub/epel/6/x86_64/

    下载epel-release-6-8.noarch.rpm软件包并安装,如下:

    wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 

    rpm -ivh epel-release-6-8.noarch.rpm

    yum –y install inotify-tools

    rpm -ql inotify-tools

    安装完成后,会产生下面两个命令

    [root@localhost test]# ls /usr/bin/inotify*

    /usr/bin/inotifywait  /usr/bin/inotifywatch

    11.inotifywait使用详解

    inotifywait是一个监控等待事件,它主要用于监控文件或目录的变化,并且可以递归地监控整个目录树。

    11.1 .inotifywait命令详解

    通过inotifywait -h来查看帮助信息

    -m表示始终保持事件监听状态。

    -r表示递归查询目录。

    -q表示打印出监控事件。

    -e通过此参数可以指定要监控的事件。可监听的事件,如下:

    access:访问,读取文件。

    modify:修改,文件内容被修改。

    attrib:属性,文件元数据被修改。

    move:移动,对文件进行移动操作。以及重命名,对文件进行重命名。

    create:创建,生成新文件

    open:打开,对文件进行打开操作。

    close:关闭,对文件进行关闭操作。

    delete:删除,文件被删除。

    –timefmt是指定时间的输出格式,用于–format选项中的%T格式。

    –format指定文件变化的详细信息输出格式。格式参数如下:

    %w表示发生事件的目录

    %f表示发生事件的文件

    %e表示发生的事件

    %T使用由–timefmt定义的时间格式

    %Xe事件以“X”分隔

    11.2 inotifywait命令实例

    我们要监测/home目录下所有文件及目录的变化情况,命令如下:

    inotifywait -mrq –timefmt ‘%y/%m/%d/%H:%M’ –format ‘%T %w %f %e’ -e modify,delete,create,attrib,move,open,close,access /home/

    这条命令是对/home目录下所有文件及目录的操作进行监控。

    打开一台机的两个窗口,一边建文件,一边查看状态看看是否会有变化

    12. inotifywatch使用详解

    inotifywatch主要用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。

    12.1.inotifywatch命令详解

    inotifywatch -h 查看帮助信息

    inotifywatch参数说明如下:

    -h:输出帮助信息。

    -v:输出详细信息。

    @:排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

    –-fromfile:从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。

    -z:输出表格的行和列,即使元素为空。

    –-exclude:正则匹配需要排除的文件,大小写敏感。

    –-excludei:正则匹配需要排除的文件,忽略大小写。

    -r:监视一个目录下的所有子目录。

    -t:设置超时时间。

    -e:只监听指定的事件。该事件与inotifywait监听的事件类型一样。

    -a:以指定事件升序排列。

    -d:以指定事件降序排列。

    要求统计60秒内/home目录下文件系统的事件,使用如下命令:

    inotifywatch -v -e modify,delete,create,attrib,move,open,close,access -e modify -t 60 -r /home

    打开一台机的两个窗口,一边建文件,一边查看状态看看是否会有变化

    13 inotify-tools与rsync集成

    inotify-tools与rsync的集成主要是通过inotifywait命令与rsync命令集成来实现的,并且该集成主要是体现的rsync被同步端,而rsync同步端不需要太多配置。

    注意:该集成的主要目的是把rsync被同步端需要备份的文件实时推送到rsync同步端上。

    通过下面的实例来说明

    14 应用实例

    14.1 实现单向本地目录实时同步

    测试本机/test目录里一有(增,删,改,属性改变),就会同步到/test1目录

    --使用下面的脚本来做

    #vim /tmp/1.sh

    #!/bin/bash

    /usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events

    do

                    rsync -a --delete /test/ /test1/

                    echo "`date +'%F %T'`出现事件$events" >> /var/log/rsync.log 2>&1

    done

    # nohup sh /tmp/1.sh  &       

    --使用nohup挂起到后台执行,终端关闭,这个进程也不会被关闭

    --如果你希望实现开机自动启动,可以把此命令加到/etc/rc.local里,或者写成shell服务脚本,让其支持chkconfig开机自动启动

    再然后对/test进行各种操作,验证可以实时同步到/test1

    14.2 实现双向本地目录的实时同步

    也有相关的软件(比如unison)可以专门来做双向的实时同步

    但我们就可以用inotify反向再做一次再写一个脚本也一样可以简单去实现,这里不再介绍

    14.3 远程实时同步

    方法一:inotify+rsync+nfs

    这个方法的思路是:

    把远程的目录通过nfs服务挂载到本地,然后当做本地目录一样来使用,这样就避免了rsync同步远程时要输密码的问题

    在rhel6.5测试为:使用innotify监控远程nfs挂载的目录再同步到本地目录,无法成功;(在远程机器操作,不会同步到本地。但在挂到本地的目录操作,也会同步到本地。原因:就是inotify只能监控本机上的目录,不能监控另外一台机器上的目录)

    但是反过来,使用innotify监控本地目录,再同步到远程nfs挂载的目录,可以成功

    实现把10.1.1.9上的/test目录实时同步到192.168.19.248上的/test1目录

        10.1.1.9 /test目录        192.168.19.248  /test1目录

    在192.168.19.248上   

    # vim /etc/exports

    /test1  *(rw,no_root_squash)

    # /etc/init.d/rpcbind restart

    # /etc/init.d/nfs  restart

    在10.1.1.9上

    # mkdir /test1/

    # mount -t nfs -o vers=3 192.168.19.248:/test1  /test1    --用nfs3版本挂载过来,那么/test1目录就是192.168.19.248上的远程/test1目录了

    执行上面讲的两个本地目录同步一样的脚本,测试就可以了

    #vim /tmp/1.sh

    #!/bin/bash

    /usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events

    do

                    rsync -a --delete /test/ /test1/

                    echo "`date +'%F %T'`出现事件$events" >> /var/log/rsync.log 2>&1

    done

    #nohup sh /tmp/1.sh  &

    测试(过程省略)但注意在测试之前把前面例子运行的脚本进程通过ps找出来,并kill掉

    --扩展,如果把nfs换成samba服务,通过mount -t cifs指令把远程samba共享目录挂载到本地,是否可行?

    方法二:使用ssh等效性(ssh密钥登录)让远程机器连接不需要密码,就很容易使用远程监控或同步了

    在10.1.1.9上产生一对密钥

    # ssh-keygen

    # scp /root/.ssh/id_rsa.pub 192.168.19.248:/root/.ssh/authorized_keys

    # ssh-add /root/.ssh/id_rsa

    然后实现远程实时同步,只需要在原来的脚本基础上把远程目录前加上远程IP就可以了(因为做了ssh等效性,不需要密码)

    #!/bin/bash

    /usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events

    do

                    rsync -a --delete /test/ 192.168.19.248:/test1/

                    echo "`date +'%F %T'`出现事件events" >> /var/log/rsync.log 2>&1

    done

    方法三:不做上面方法二的ssh密钥,使用expect脚本来解决密码问题

    #!/bin/bash

    /usr/local/bin/inotifywait -mrq  -e modify,delete,create,move /test |while read events

    do

    sed -i '/^192.168.19.248/d' /root/.ssh/known_hosts

    expect <<EOF &> /dev/null

    spawn rsync -a --delete /test/ 192.168.19.248:/test1/

    expect "no)?"

    send "yes "

    expect "password:"

    send "123456 "

    expect eof

    EOF

            echo "`date +'%F %T'`出现事件events" &>> /var/log/rsync.log

    done

    测试:要先把上面执行的脚本进程都kill掉,再重新执行这个脚本来验证

    方法四,使用rsync的secrets file的方法然后写脚本

    例:     

            本地同步端 ----->远程被同步端

            10.1.1.9    192.168.19.248

    我要实现把本地同步端10.1.1.9上的/test/目录里的内容实时同步到远程被同步端192.168.19.248的/test1/目录

    准备:

    关闭iptables和selinux

    实现过程

    在远程被同步端192.168.19.248上操作

    # mkdir /test1/    --创建测试的被同步目录

    # vim /etc/rsyncd.conf

    uid=root       

    gid=root        --这里指定使用root身份同步到192.168.19.248,否则默认使用nobody用户(这样你需要把/test1/目录改成757的权限,才有权限写)

    [testsource]

    path=/test1/

    ignore errors

    read only=no        --服务级别给写权限

    auth users=test        --验证的用户取名为test(此用户与系统用户无关)

    secrets file=/etc/rsyncd.secrets    --验证用户test的用户名和密码的存放文件,此文件需要同步端和被同步端都要有(这样我们就可以用这种方式来进行验证,而不需要远程的ssh密码验证了)

    hosts allow=10.1.1.9        --进一步加强安全,只允许10.1.1.9同步

    # vim /etc/rsyncd.secrets    --创建这个密码文件,用户名要与上面的auth users指定的一致,密码随意(我这里以321来测试)

    test:321

    # chmod 600 /etc/rsyncd.secrets    --为了安全性,把权限改成600,只让root读写(很多其它软件的密码文件也会要求你改成600权限)

    #  yum install xinetd -y

    # vim /etc/xinetd.d/rsync

          disable = no        -- disable 后面值由yes改为no

    # /etc/init.d/xinetd restart    --重启服务

    # netstat -ntlup |grep :873    --验证873端口是否启动

    tcp        0      0 :::873                      :::*                        LISTEN      50438/xinetd  

    # chkconfig xinetd on    --设置开机自动启动

    在本地同步端10.1.1.9操作

    先安装inotify软件,步骤参照上面过程,这里省略

    # mkdir /test/    --创建测试的同步目录
    # vim /etc/rsyncd.secrets    --也要创建这个密码文件,里面只写密码就可以了。用户我们在后面的脚本里的命令里指定
    321
    # chmod 600 /etc/rsyncd.secrets  --也改成600的权限 
    # vim /tmp/rsync.sh    --脚本及其内容(这里强调一下,这里是测试方便,所以才放到/tmp下,生产环境可以放到/bin这种目录下做成一个命令) 
    #!/bin/bash
    /usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events
    do                
                rsync -a --delete  --password-file=/etc/rsyncd.secrets /test/ test@192.168.19.248::testsource
    done 
    # chmod 755 /tmp/rsync.sh   --给执行权限,方便执行 
    # nohup sh /tmp/rsync.sh &   --后面挂起执行 
    # vim /etc/rc.local        --加到rc.local里让其开头自动启动
    #nohup sh /tmp/rsync.sh &
  • 相关阅读:
    线程池
    队列Queue、栈LifoQueue、优先级队列PriorityQueue
    线程的定时器Timer
    线程的条件Condiition
    线程的信号量Semaphore
    死锁的原因及解决办法RLock递归锁
    线程锁Lock
    守护线程daemon
    threding模块的其他用法
    变量的存储方式和生存期
  • 原文地址:https://www.cnblogs.com/koushuige/p/9172897.html
Copyright © 2011-2022 走看看