rsync+Inotifywait实现文件实时同步

rsync+Inotifywait实现实时同步

背景:

某客户想实现实现异地灾备,想达到的是A机房出现断电的时候。数据能实时的将数据同步到B上,并且域名切换到B之后能提供业务 。使用rsync+inotify做web数据和ftp(ftp主要是用户上传的图片文件)的数据实时同步.

一:软件介绍:
  1. rsync
    rsync是一个开源的快速备份工具,可以再不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,再传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
  2. inotify
    inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件,本实验基于此进行数据的监控并调用rsync进行数据实时同步
二 :实验环境:

操作系统:centos7
同步源端:10.10.1.128
同步目的端:10.10.1.129
如图:
rsync+Inotifywait实现文件实时同步
服务器A为同步源端,服务器B为同步目的端。

三:环境部署
  1. 配置rsync源服务器
    检查rsync是否安装,测试环境已经安装此服务,一般服务器已经集成了rsync服务,如未安装请自行网上找相关安装文档。

rsync+Inotifywait实现文件实时同步

  1. 修改rsync默认配置文件,位于/etc/rsyncd.conf。
    10.10.1.128的配置文件如下:

uid = root
gid = root
use chroot = yes
address = *
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 10.10.1.129
[datadir]
path = /var/www/html
read only = false
dont compress = .gz .tgz .zip .z .Z .rpm .deb .bz2
auth users = root
secrets file = /etc/rsyncd_users.db
10.10.1.129的配置文件如下:
uid = root
gid = root
use chroot = yes
address = *
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 10.10.1.128
[datadir]
path = /var/www/
read only = false
dont compress = .gz .tgz .zip .z .Z .rpm .deb .bz2
auth users = root*
secrets file = /etc/rsyncd_users.db

  1. 为备份账户创建数据文件
    根据上一步的设置,创建账号数据文件,添加一行用户记录,以冒号分隔,用户名称为root,密码为123456。由于账号信息采取明文存放,因此应调整文件权限,权限调整为600.

rsync+Inotifywait实现文件实时同步

  1. 在源端启动rsync进行全量数据同步
    命令:rsync --daemon

rsync+Inotifywait实现文件实时同步
在执行运程同步任务时,rsync命令需要指定同步源服务器中的资源位置。rsync同步源的资源表示方式为“用户名@主机地址::共享模块名”或者“rsync://用户名@主机地址/共享模块名”,前者为两个冒号分隔形式,后者为URL地址形式。
rsync -avz root@10.10.1.128::datadir /opt
rsync -avz rsync://root@10.10.1.128/datadir /opt
注意:此操作是先做全量的数据拉取。机房A和B用专线链接,如果数据量较大考虑非工作时间同步,避免影响客户应用。本次执行拉取数据量不大,与客户方沟通可在工作时间执行。
rsync+Inotifywait实现文件实时同步
测试:在源端创建三个文件分别是test111-333.txt文件,在目的端上将文件同步到本地
rsync+Inotifywait实现文件实时同步

    四 :部署inotify工具

软件安装

在源服务器上执行
/usr/local/inotify/bin/inotifywait -mrq -e modify,create,move,delete /var/www/html/监控源服务器的文件状态 。在/var/www/html/目录下删除文件,可以看到工具可以实时监控到源服务器出现文件变动情况
在源服务器删除文件test111----test666.txt的文件
Inotifywait工具实时监控到文件变动情况,如下截图
rsync+Inotifywait实现文件实时同步
rsync+Inotifywait实现文件实时同步
编写触发脚本:
rsync+Inotifywait实现文件实时同步
内容如下:
#!/bin/bash
INOTIFY_CMD="/usr/local/inotify/bin/inotifywait -mrq -e
modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -avH --port=873 --progress --delete /var/www/html root@10.10.1.129::datadir --password-file=/etc/server.pass"
$INOTIFY_CMD | while read file
do
$RSYNC_CMD
echo "${file}" >> /tmp/rsync.log 2>&1
done
/etc/server.pass的文件权限改成600,文件内部填写密码
启动脚本后台运行实时监控文件监控与同步
脚本实时监控文件的修改,删除,创建等操作后触发rsync进行增量的同步源服务器上 ,rsync的日志记录到/tmp/rsync.log , 进行验证
在源端上创建111-555 五个文件夹,可以看到数据实时的同步到目的端上,如下图
rsync+Inotifywait实现文件实时同步
在源端删除刚刚创建的目录,在目的端会看到目录自动删除
rsync+Inotifywait实现文件实时同步
使用rsync+inotifywait进行实时同步数据验证成。

上一篇:为什么 HashMap 是线程不安全的?(2)


下一篇:【面小易-面经04】蚂蚁金服机器学习实习生内推面试总结