rsync + inotify 实现不同linux服务器文件自动更新(图片备份容灾策略)

222 阅读6分钟

参考链接: zhuanlan.zhihu.com/p/488029990

一、简介

rsync(remote synchronize)是 Liunx/Unix 下的一个远程数据同步工具,它可通过 LAN/WAN 快速同步多台主机间的文件和目录。

Linux 之间同步文件一般有两种方式,分别是 rsync 与 scp 。scp 相当于复制,粘贴,文件不存在则新建,若存在则覆盖,而 rsync 则是比较两边文件是否相同,不相同才进行更新。所以 rsync 和 scp 在文件夹存在的情况下差异很大,因为 scp 是复制和覆盖,从执行性能来说 rsync 更胜一筹。而且 rsync 能将文件夹、文件的权限等信息也保存下来。

但是 rsync 也有一定的缺点,在同步数据时,需要扫描所有文件后进行比对,如果文件数量相当大时,扫描文件就非常耗费时间和性能。其次,rsync 不能够实时监测、同步数据,这就可能导致一些时间段数据不一致。解决这个问题的方法就是实时同步,所以需要使用 rsync+inotify 组合。

inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux 内核从2.6.13版本起,加入了对 inotify 的支持。通过 inotify 可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,inotify-tools 便可以监控文件系统下文件的各种变化情况了。

二、查看机器是否支持

  1. 查看机器是否安装了rsync

rsync --help

  1. 查看机器是否支持inotify

ll /proc/sys/fs/inotify

如果出现以下3个文件, 说明支持

-rw-r--r-- 1 root root 0 2月 22 15:45 max_queued_events

-rw-r--r-- 1 root root 0 2月 22 15:45 max_user_instances

-rw-r--r-- 1 root root 0 2月 22 15:45 max_user_watches

三、整体架构

四、同步节点部署

  1. 配置rsync , 先修改配置文件, 在etc 目录下有一个rsyncd.conf 的文件

    vim /etc/rsyncd.conf

  2. 修改内容如下

    uid = root

    gid = root

    use chroot = yes

    max connections = 10

    strict mode=yes

    pid file = /var/run/rsyncd.pid

    lock file=/var/run/rsync.lock

    log file=/var/log/rsyncd.log

    [backup] # 这个是模块的名称

    path = /hdd/pictures/ # 这里的文件夹一定要和那个节点保持一致

    comment = backup image

    ignore errrors

    read only=no

    write only=no

    hosts allow=192.168.2.18 # 这个是配置允许进行文件同步的ip

    hosts deny=*

    list=false

    uid=root

    gid=root

    auth users=root

    secrets file=/etc/rsync.password # 这个文件里面存储的是当其他端传递文件时的验证用户和密码

其中需要用到一个密码文件,也就是上面配置的 secrets file 的值 /etc/rsync.password,在 rsync3.1.3 版本中默认没有密码文件,需要手动创建,内容格式为:user:password,user 就是上面配置的 yxc,password 就是密码,如下所示。

echo "root:123456" > /etc/rsync.password

  1. 然后需要给密码文件600权限

chmod 600 /etc/rsync.password

  1. 启动 rsync 守护进程

/usr/local/bin/rsync --daemon

  1. 启动之后可查看 rsync 进程,如下

ps -ef | grep rsync

如有需要可加入系统自启动文件

echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local

  1. rsync 默认端口为873,所以开放873端口

firewall-cmd --add-port=873/tcp --permanent --zone=public

#重启防火墙(修改配置后要重启防火墙)

firewall-cmd --reload

五、源节点部署

源服务器节点,也就是 node1 192.168.157.129,需要部署 rsync 和 inotify。

1、安装rsync

rsync 安装方式和上面相同,就不详细讲解了。

解压

tar zxvf rsync-3.1.3.tar.gz

cd rsync-3.1.3/

配置

./configure

编译及安装

make && make install

2、配置rsync

源服务器节点中只需要配置认证密码文件,首先在 etc 文件夹下创建文件 rsync.password,只需要密码,不需要用户,密码需要和同步节点 node2 中的一致,我这里也就是123456。

vim /etc/rsync.password

修改密码文件权限

需要给密码文件600权限

chmod 600 /etc/rsync.password

启动 rsync 守护进程

/usr/local/bin/rsync --daemon

如有需要可加入系统自启动文件

echo "/usr/bin/rsync --daemon" >> /etc/rc.local

同样开放873端口,如下所示

firewall-cmd --add-port=873/tcp --permanent --zone=public

重启防火墙(修改配置后要重启防火墙)

firewall-cmd --reload

3、手动同步测试

先在源服务器节点的 /root/data/backuptest/ 目录下新建一个 test 文件夹

mkdir /hdd/pictures/test

然后使用如下命令进行同步测试,其中一些参数要和同步节点配置文件中相对应,比如下面的认证模块名 backup、用户名 yxc 等

rsync -avH --port 873 --delete /hdd/pictures/ root@192.168.157.130::backup --password-file=/etc/rsync.password

可以看到 node1 中文件夹 test 已经发送,查看同步节点 node2 中,如下

test 文件夹已经同步到 node2,所以我们的 rsync 配置成功,可以进行文件同步,接下来就是部署 inotify 实现实时同步,通过inotify监听文件或文件夹,如果有变动就进行同步。

(1)下载安装

inofity-tools下载地址:github.com/downloads/r…

inotify-tools 的详细介绍可以看:github.com/rvoicilas/i…

下载完成后,进行解压安装,如下

解压

tar zxvf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14/

配置

./configure

编译及安装

make && make install

(2)创建rsync同步的shell脚本

安装完成之后需要创建用于 rsync 同步的 shell 脚本,如果添加、修改、删除了文件或文件夹,inotify 可以监控到,然后通过 rsync 进行同步,这里我们就在需要进行监控的目录创建这个脚本


#!/bin/bash

host1=192.168.2.32

src=/hdd/pictures/

dst1=backup

user1=root

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \

| while read files

do

/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1

echo "${files} was rsynced." >> /tmp/rsync.log 2>&1

done

其中 host 是 client 的 ip,src 是 server 端要实时监控的目录,des 是认证的模块名,需要与 client 一致,user 是建立密码文件里的认证用户。

然后给这个脚本赋予权限

chmod 755 /root/data/backuptest/inotifyrsync.sh

后台运行这个脚本

/root/data/backuptest/inotifyrsync.sh &

有需要可以将脚本加入系统自启动文件中

echo "/root/data/backuptest/inotifyrsync.sh &" >> /etc/rc.local

七、 遇到的问题

  1. rsync遇到的问题

blog.csdn.net/qq_38483583…

  1. inotify 遇到的问题

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

解决方法:

[root@db zzh]# ll /proc/sys/fs/inotify (如果有下列三项则支持inotifytools)

total 0

-rw-r--r-- 1 root root 0 Sep 20 16:52 max_queued_events

-rw-r--r-- 1 root root 0 Sep 20 16:52 max_user_instances

-rw-r--r-- 1 root root 0 Sep 20 16:52 max_user_watches

解决:

ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0

八、自启动部署

使用了一些手段后发现不能在机器重启后进行部署, 所以进行了定时任务部署

定时任务脚本


ProcNumber=`ps -ef | grep "/usr/bin/rsync --daemon" | grep -v grep | wc -l`

if [ $ProcNumber -le 1 ];then

for((i=$ProcNumber; i<1; i++))

do

/usr/bin/rsync --daemon

done

fi


fi