首页 > 代码库 > 利用rsync+inotify实现主从服务器数据同步的简单案例

利用rsync+inotify实现主从服务器数据同步的简单案例


写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正。如有不明白的地方,愿可一起探讨。



    rsync是Linux下一款非常强大的同步工具,其最大的劣势在于每次执行rsync命令都会遍历目标目录。想象一下这样一种情况:当目录下改动的文件数量并不多且目录下本身文件数量达到一定规模时,每次遍历都会消耗很多资源。那么有没有这样一种工具,当某文件改动后,主动触发rsync命令去同步修改过的文件呢?答案是肯定的,要不然就没有这篇文章了,这个工具就是:inotify。


    接下来,本文就利用rsync+inotify来简单实现主从服务器数据同步,其解决方案图形如下:

    wKioL1P4qjuQUmwEAABmx369h9Q315.jpg


配置从服务器


    安装xinetd和rsync并设置其开机启动:

        # yum -y install xinetd

            默认情况下,rsync已经安装

        # chkconfig xinetd on

        # chkconfig rsync on

    为rsync提供配置文件:

        # vim /etc/rsyncd.conf

        其内容如下:    

        # Global Settings

        uid = nobody

        gid = nobody

        use chroot = no

        max connections = 10

        strict modes = yes

        pid file = /var/run/rsyncd.pid

        log file = /var/run/rsyncd.log

        

        # Directory to be rsynced

        [rsync-dst]

        path = /home/www

        ignores errors = yes

        read only = no

        write only = no

        hosts allow = 10.170.2.0/255.255.252.0

        hosts deny = *

        list = true

        uid = root

        gid = root

        auth users = rsync-user

        secrets file = /etc/rsync-dst.passwd

    创建密码文件/etc/rsync-dst.passwd

        # vim /etc/rsync-dst.passwd

        # echo "rsync-user:******" > /etc/rsync-dst.passwd 

        # chmod 600 /etc/rsync-dst.passwd 

    启动xinetd服务

        # service xinetd start


配置主服务器


    下载inotify-tools-3.14:

        下载路径:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

        本文将所下载的inotify-tools-3.14.tar.gz放到了/tmp目录下

    安装inotify-tools-3.14:

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

        # cd inotify-tools-3.14

        # ./configure --prefix=/usr/local

        # make && make install

    创建rsync同步密码文件并修改其权限:

        # vim /etc/rsync-src.passwd

        # echo "******" > /etc/rsync.passwd

        # chmod 600 /etc/rsync-src.passwd 

    创建rsync同步脚本:

        # mkdir -pv /home/muluhe/rsync-src

        # vim /etc/init.d/rsyncd.sh

        其脚本如下:

        #!/bin/bash

        

        src=http://www.mamicode.com/home/muluhe/rsync-src

        dst=rsync-user@10.170.2.80::rsynce-dst

        

        /usr/local/bin/inotifywait -mrq --timeout ‘%d/%m%y %H:%M‘ --format ‘%T %w %f‘ \

                -e modify,delete,create,attrib ${src} | while read files

        do

                /usr/bin/rsync -avz --delete --progress ${src} ${dst} \

                        --password-file=/etc/rsync-src.passwd &> /dev/null

                echo "${files} has been rsynced... OK" >> /var/log/rsync.log

        done


    修改rsyncd.sh脚本的权限并使其自启动:

        # chmod +x /etc/init.d/rsyncd.sh 

        # echo "/etc/init.d/rsyncd.sh" >> /etc/rc.local 


测试主从数据同步


    开启主服务的终端

        其中一个终端执行:

            # bash /etc/init.d/rsyncd.sh 

        另外一个终端进行如下操作:

            切换到主服务器中的/home/muluhe/rsync-src/目录

            # cd /home/muluhe/rsync-src/

            创建一个新文件

            # touch test.txt

            复制一个文件

            # cp /etc/fstab ./

        在执行bash /etc/init.d/rsyncd.sh 命令的终端下可以看到如下结果

            wKioL1P4vZ_jSS7KAAIB1ko7B7w234.jpg


            

利用rsync+inotify实现主从服务器数据同步的简单案例