rsync+inotify实时同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsync+inotify实时同步相关的知识,希望对你有一定的参考价值。

rsync+inotify实时同步

一、rsync与inotify介绍:

1、rsync (remote sync)是一款非常好的数据同步工具,能够通过对比同步双方的数据变动,实现增量同步,还可以通过LAN/WAN实现远程多台主机间文件的同步,还能结合crond任务计划来执行自动备份,又可以结合ssh实现远程数据备份的安全,种种特性使他看起来相当优秀。但如果需备份数据十分庞大时,它的不足之处就显现出来了,比如每次执行同步操作时,rsync都会扫描全部数据进而计算出增量部分,而后再同步增量数据,这将会十分耗时,使其变得低效;并且受限于crond计划任务最小时间间隔为一分钟,会导致同步源端和目的段数据不一致,这在高可用环境中是不被允许的。这个时候我们就可以构建rsync+Inotify架构来解决此应用瓶颈。

2、inotify介绍

Inotify 是一个Linux特性,是一种强大的、细粒度的、异步的文件系统监控机制,linux内核从2.6.13起便加入了Inotify支持,通过Inotify可以监控文件系统中添加、修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样的一个第三方软件。Inotify反应灵敏,用法简单,并且比使用Crontab轮询高效很多。          

二、部署与实现       

rsync inotify 当只做rsync不实时同步时,一般是从rsync服务端向rsync客户端同步数据。当需要添加inotify实现实时同步数据时,我们就需要从rsync客户端向各rsync服务端同步数据,这样rsync客户端就变成了master,而rsync服务端就变成了slave

原理:当centos 3的本地目录,也就是需要同步的目录发生变化时,比如有文件改名、更新、删除、权限变化,此时就使用inotify命令查找这些变化,进行相应的轮询工作

服务器地址分配:

centos172.25.0.31rsync 服务节点)

centos2172.25.0.32rsync 服务节点)

centos 3172.25.0.29  rsync 内容发布节点、inotify

一、配置 rsync 服务器端(centos

1.安装rsync软件,本地安装

[[email protected] ~]# yum install -y  rsync


2.手动创建rsync配置文件

# vim /etc/rsyncd.conf

uid = root                             #全局配置开始,运行rsync的用户

gid = root                             #运行rsync的用户组

usechroot = no                     #是否让进程离开工作目录

max connections = 20            #最大并发数

timeout = 600                       #连接超时时间

pid file = /var/run/rsyncd.pid            #指定rsyncpid存放路径

lock file = /var/run/rsync.lock           #指定rsync的锁文件存放路径

log file = /var/log/rsyncd.log             #指定rsync的日志存放路径

[web_log]                            #模块配置开始

path = /data/web_log/             #需要备份的文件路径

ignore errors                         #忽略一些无关的I/O错误

read only = false                    #false为关闭,true表示开启。表示只读,不允许上传文件

writeonly = false                    #不允许下载

list = false                            #客户请求可以使用模块列表时是否被列出

hosts allow = 192.168.1.0/24           #可以访问此模块的主机,*表示任何主机,此处是网段,某个主机直接写ip

hosts deny = 0.0.0.0/32                     #禁止访问此模块的主机地址

auth users = backuser                        #自定义连接该模块的用户名,多个用户用逗号分隔

secrets file = /etc/rsync.password #指定一个包含用户名:密码格式的文件

[[email protected] ~]#cat /etc/rsyncd.conf
uid = root                             
gid = root                             
usechroot = no                     
max connections = 20            
timeout = 600                       
pid file = /var/run/rsyncd.pid            
lock file = /var/run/rsync.lock           
log file = /var/log/rsyncd.log             
[web_log]                            
path = /data/web_log/             
ignore errors                         
read only = false                    
writeonly = false                    
list = false                            
hosts allow = 172.25.0.0/24        
hosts deny = 0.0.0.0/32                     
auth users = backuser                
secrets file = /etc/rsync.password

3.创建备份目录

[[email protected] ~]#mkdir -p /data/web_log/

4.建立 rsync 用户名和密码文件

[[email protected] ~]# echo"backuser:123456" >> /etc/rsync.passwor

5. /etc/rsync.password授权为 600(这个文件的权限必须是 600

[[email protected] ~]# chmod  600 /etc/rsync.password

6.启动rsync并添加开启自动启动

[[email protected] ~]# /usr/bin/rsync --daemon &
[1] 61835
[[email protected] ~]#  echo "/usr/bin/rsync --daemon" >> /etc/rc.local
[1]+  Done                    /usr/bin/rsync --daemon

二、配置 rsync 服务器端(centos2),和centos配置一样

[[email protected] ~]# yum install rsync
[[email protected] ~]# vim /etc/rsyncd.conf
uid = root
gid = root
usechroot = no
max connections = 20
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock  
log file = /var/log/rsyncd.log
[web_log]
path = /data/web_log/             
ignore errors
read only = false
writeonly = false
list = false
hosts allow = *
hosts deny = 0.0.0.0/32
auth users = backuser
secrets file = /etc/rsync.password
 
[[email protected] ~]# mkdir -p /data/web_log/
 
[[email protected] ~]# echo "backuser:123456" >> /etc/rsync.password
 
[[email protected] ~]# chmod  600 /etc/rsync.password
 
[[email protected] ~]# /usr/bin/rsync --daemon  &
[1] 9168
[[email protected] ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local
[1]+  Done                    /usr/bin/rsync --daemon

到此,rsync服务器端配置完成

 

三、客户端配置(centos3):

 

1.设置 rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名

[[email protected] ~]# yum install -y rsync 
[[email protected] ~]# echo "123456" > /etc/rsync.password

2.将密码文件的权限设置成 600

[[email protected] ~] # chmod 600 /etc/rsync.password

配置 Inotify(在 centos3上配置)

1. 安装 inotify 软件包

[[email protected] ~]# cd /usr/local/src/
[[email protected] src] #wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[r[email protected] src] #yum  –y install gcc       #如果没安装gcc的请安装,已安装请跳过此步。
[[email protected] src]# tar zxvf inotify-tools-3.14.tar.gz  -C /usr/local/ 
[[email protected] src]# cd  ../inotify-tools-3.14/ 
[[email protected] inotify-tools-3.14]#./configure && make && make install
2.

[[email protected] inotify-tools-3.14]#rsync -vzrtopg --progress /mnt/ [email protected]::web_log  --password-file=/etc/rsync.password    #上传文件
[[email protected] inotify-tools-3.14]#rsync -vzrtopg --progress  [email protected]::web_log /opt/  --password-file=/etc/rsync.password     #下载文件,opt要新建

 

3. 写一个脚本来实现,当/ inotify /中文件有变化时,让各rsync服务节点同步数据:

[[email protected] inotify-tools-3.14]# mkdir /inotify
[[email protected] inotify-tools-3.14]# vim inotify.sh
#!/bin/bash
src=/inotify/              #此文件是rsync客户端本地文件,需要上传到各个rsync服务节点
des1=web_log          # centos 上需要同步的目录
des2=web_log          # centos 2上需要同步的目录
host1=172.25.0.31      #rsync服务节点1
host2=172.25.0.32      #rsync服务节点2
user1=backuser                 #连接rsync使用的用户名centos上
user2=backuser                 #连接rsync使用的用户名centos2上
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -emodify,delete,create,attrib $src | while read file
do
/usr/bin/rsync -vzrtopg --delete --progress $src [email protected]$host1::$des1 --password-file=/etc/rsync.password
/usr/bin/rsync -vzrtopg --delete --progress $src [email protected]$host2::$des2 --password-file=/etc/rsync.password
echo "${files} was rsynced" >> /var/log/rsync.log 2>&1
done


5. 给予执行权限

 

[[email protected] inotify-tools-3.14]# chmod +x inotify.sh 
[[email protected] inotify-tools-3.14# /root/inotify.sh &        #在后台执行


6.最后,将此脚本加入系统自启动文件 # echo "/root/inotify.sh" >> /etc/rc.local

[[email protected] inotify-tools-3.14]# echo "/usr/local/inotify-tools-3.14/inotify.sh  &" >> /etc/rc.local


7./inotify/下添加内容,去centos上查看是否同步

[[email protected] inotify]# touch 123
[[email protected] inotify]# sending incremental file list
./
deleting hgfs/
1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
123
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=0/3)
 
sent 127 bytes  received 49 bytes  352.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list
./
1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
123
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=0/3)
 
sent 127 bytes  received 49 bytes  352.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list
 
sent 52 bytes  received 8 bytes  120.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list
 
sent 52 bytes  received 8 bytes  120.00 bytes/sec
total size is 0  speedup is 0.00


去到centos看看是否有这个文件

[[email protected] web_log]# ls
123

8.编写监听inotify进程脚本,防止inotify由于某种原因中断无法实时同步(如果不需要监听,此步可以跳过)

[[email protected] inotify-tools-3.14]# vim jianting.sh
#!/bin/bash
ps -lef |pgrep inotify &> /dev/null    #如果有inotify进程在运行,那么echo $? 返回值是0,条件为真。否则返回值为非0  
if [ $? –eq 0 ] ;then            
 echo "inotify  is runing...."
else
/usr/local/inotify-tools-3.14/inotify.sh  &
echo "inotify aready runing....."
fi
简化:
[[email protected] inotify-tools-3.14]# vim jianting.sh
#!/bin/bash
ps -lef |pgrep inotify &> /dev/null     
if [ $?  -eq 0 ] ;then                
echo "inotify is runing ...."
else
/usr/local/inotify-tools-3.14/inotify.sh  &
echo "inotify aready runing ....."
fi
 
 
[[email protected] inotify-tools-3.14]# chmod a+x  jianting.sh

9.添加定时任务计划

# crontab -e
* * * * *    /usr/local/inotify-tools-3.14/jianting.sh  & > /dev/null

这样就可以实现rsync+inotify实时同步了



以上是关于rsync+inotify实时同步的主要内容,如果未能解决你的问题,请参考以下文章

Rsync下行同步+inotify实时同步介绍和部署

inotify+rsync实现实时同步

rsync+inotify实时同步

rsync下行同步rsync+inotify实时同步(同步如饮水一样简单)

rsync+inotify实时同步

实时同步rsync+inotify