rsync+inotify实现两台服务器某个目录及其子目录下的文件的同步

  • Post author:
  • Post category:其他




1.说明

将主服务器(源服务器)的文件备份到从服务器(目标服务器)上。通过inotify监听源服务器上 /var/www 目录下文件的新增、修改、删除等事件,当触发事件时,调用 rsync 实现将文件同步到目标服务器相同的目录下。

源服务器:10.1.5.43 简称43

目标服务器:10.1.5.44 简称44



2.同步实现



2.1目标服务器(44)与源服务器(43)都需要安装rsync


安装rsync

yum -y install rsync



2.2在目标服务器(44)执行以下操作


修改/etc/rsyncd.conf,配置如下内容

vim /etc/rsyncd.conf

rsyncd.conf 添加以下配置信息

uid = root
gid = root
use chroot = yes
#最大连接数
max connections = 10
#日志文件
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
motd file = /etc/rsyncd.motd

#保留发送日志
transfer logging = yes
#超时时间
timeout = 900

[vsftpd]
    #路径,若修改同步目录,需要修改此处,需要和源服务器脚本(inotify.sh)中的 src 一致
    path = /var/www
    #忽略错误
    ignore errors
    #如果为true,则不能上传文件到该模块的目录下,推数据使用.
    read only = false
    #指定密码文件
    secrets file = /etc/rsync.password

可以看到,/etc/rsyncd.motd、/var/log/rsyncd.log与/etc/rsync.password默认是没有的,需要我们自己touch。touch好后,在/etc/rsync.password里面需要写上用户名与对应的密码,密码随意,这里以vsftpd为例。在/etc/rsyncd.motd中写上一些登录提醒信息,内容随意。

vim /etc/rsyncd.motd

rsyncd.motd 添加以下提醒信息

Welcome!

创建 rsyncd.log 文件

touch /var/log/rsyncd.log

创建 rsync.password 文件

touch /etc/rsync.password

rsync.password 添加以下信息

文件格式是 用户名:密码

vsftpd:123456

设置文件权限,只设置文件所有者具有读取、写入权限即可

chmod 600 /etc/rsync.password



2.3在源服务器(43)执行以下操作

创建认证密码文件,只需要密码,不需要用户

vim /etc/rsyncp.password

rsyncp.password 添加目标服务器 rsync.password 文件中配置的用户对应的密码

只需要密码,不需要用户

123456

设置文件权限,只设置文件所有者具有读取、写入权限即可

chmod 600 /etc/rsyncp.password



2.4在源服务器(43)安装inotify-tools工具

yum -y install inotify-tools



2.5在源服务器(43)创建同步脚本

创建脚本存放目录

mkdir /opt/product/scripts

创建脚本

touch /opt/product/scripts/inotify.sh

编写脚本

vim /opt/aspire/product/scripts/inotify.sh

inotify.sh 添加以下内容

#!/bin/bash
# 需要同步的路径,若修改同步目录,需要修改此处,需要和目标服务器中rsyncd.conf 的 path 一致
src=/var/www
# 目标服务器上 rsync --daemon 发布名称
des=vsftpd
# rsync验证的密码文件
rsync_passwd_file=/etc/rsyncp.password
# 目标(备份)服务器,注意要更换为自己的目标服务器 ip
ip=10.1.5.44
# rsync --daemon定义的验证用户名
user=vsftpd
cd ${src}
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e create,delete,attrib,close_write,move ./ $src |while read file
do
    # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
    INO_EVENT=$(echo $file |awk '{print $1}')
    # 把inotify输出切割 把文件路径部分赋值给INO_FILE
    INO_FILE=$(echo $file |awk '{print $2}')
    echo "--------------------$(date)---------------------"
echo ${INO_FILE}
    # 判断事件类型
    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
    then
        echo 'CREATE or CLOSE_WRITE or MOVED_TO'
        echo $(dirname ${INO_FILE})
        rsync -avzcR --exclude *.swp --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip}::${des}
    fi
    if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
    then
        echo 'DELETE or MOVED_FROM'
        echo $(dirname ${INO_FILE})
        rsync -avzR --exclude *.swp --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip}::${des}
    fi
    if [[ $INO_EVENT =~ 'ATTRIB' ]]
    then
        echo 'ATTRIB'
        if [ ! -d "$INO_FILE" ]
        then
            rsync -avzcR --exclude *.swp --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip}::${des}
        fi
    fi
done


当对目录修改用户权限时,只有其目录下的文件发生修改后才可以修改成功!



移动文件时,移动文件的目录必须是 /var/www目录及其子目录下,否则目标服务器上的文件会丢失!

修改脚本权限

chmod 755 /opt/aspire/product/scripts/inotify.sh



2.6 在源服务器(43)启动脚本

cd /opt/product/scripts
bash -s /opt/product/scripts/inotify.sh
nohup bash /opt/product/scripts/inotify.sh &

/opt/product/scripts/nohup.out文件中有传输日志

文件同步开始



3.更换同步目录

将inotify.sh脚本任务关闭,修改目标服务器的/etc/rsyncd.conf配置文件的

path

和源服务器的inotify.sh同步脚本中的

src

, 将这两处修改为需同步目录,然后重启脚本。例:若同步目录为 /home/test,将 /var/www 修改为 /home/test



4. 源服务器(43)异常处理



4.1 说明

当源服务器(43)有异常时,把目标服务器(44)作为新的源服务器,源服务器(43)作为目标服务器,两台服务器主从互换。



4.2 准备工作

在源服务器(43)执行

2.2

操作

在目标服务器(44)执行

2.3

操作

在目标服务器(44)执行

2.4

操作

在目标服务器(44)执行

2.5

操作,注意将同步脚本中的

ip

修改为10.1.5.43



4.3 操作

将源服务器(43)的同步脚本关闭

ps -ef | grep inotify.sh

共有三个进程(/opt/aspire/product/scripts/inotify.sh),全部杀掉

Kill -9 进程id

在目标服务器(44)执行

2.6

操作

此时服务器以44为主,43为从服务器,对44文件进行操作,会同步到43服务器。



版权声明:本文为qq_44989208原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。