一、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命令查找这些变化,进行相应的轮询工作
服务器地址分配:
centos:172.25.0.31(rsync 服务节点)
centos2:172.25.0.32(rsync 服务节点)
centos 3:172.25.0.29 (rsync 内容发布节点、inotify)
一、配置 rsync 服务器端(centos)
1.安装rsync软件,本地安装
[root@centos ~]# 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 #指定rsync的pid存放路径
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 #指定一个包含“用户名:密码”格式的文件
[root@centos ~]#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.创建备份目录
[root@centos ~]#mkdir -p /data/web_log/
4.建立 rsync 用户名和密码文件
[root@centos ~]# echo"backuser:123456" >> /etc/rsync.passwor
5.为 /etc/rsync.password授权为 600(这个文件的权限必须是 600)
[root@centos ~]# chmod 600 /etc/rsync.password
6.启动rsync并添加开启自动启动
[root@centos ~]# /usr/bin/rsync --daemon & [1] 61835 [root@centos ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local [1]+ Done /usr/bin/rsync --daemon
二、配置 rsync 服务器端(centos2),和centos配置一样
[root@centos2 ~]# yum install rsync [root@centos2 ~]# 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 [root@centos2 ~]# mkdir -p /data/web_log/ [root@centos2 ~]# echo "backuser:123456" >> /etc/rsync.password [root@centos2 ~]# chmod 600 /etc/rsync.password [root@centos2 ~]# /usr/bin/rsync --daemon & [1] 9168 [root@centos2 ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local [1]+ Done /usr/bin/rsync --daemon
到此,rsync服务器端配置完成
三、客户端配置(centos3):
1.设置 rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名
[root@centos3 ~]# yum install -y rsync [root@centos3 ~]# echo "123456" > /etc/rsync.password
2.将密码文件的权限设置成 600
[root@centos3 ~] # chmod 600 /etc/rsync.password
配置 Inotify(在 centos3上配置)
1. 安装 inotify 软件包
[root@centos3 ~]# cd /usr/local/src/ [root@centos3 src] #wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@centos3 src] #yum –y install gcc #如果没安装gcc的请安装,已安装请跳过此步。 [root@centos3 src]# tar zxvf inotify-tools-3.14.tar.gz -C /usr/local/ [root@centos3 src]# cd ../inotify-tools-3.14/ [root@centos3 inotify-tools-3.14]#./configure && make && make install 2.
[root@centos3 inotify-tools-3.14]#rsync -vzrtopg --progress /mnt/ backuser@172.25.0.31::web_log --password-file=/etc/rsync.password #上传文件 [root@centos3 inotify-tools-3.14]#rsync -vzrtopg --progress backuser@172.25.0.31::web_log /opt/ --password-file=/etc/rsync.password #下载文件,opt要新建
3. 写一个脚本来实现,当/ inotify /中文件有变化时,让各rsync服务节点同步数据:
[root@centos3 inotify-tools-3.14]# mkdir /inotify [root@centos3 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 $user1@$host1::$des1 --password-file=/etc/rsync.password /usr/bin/rsync -vzrtopg --delete --progress $src $user2@$host2::$des2 --password-file=/etc/rsync.password echo "${files} was rsynced" >> /var/log/rsync.log 2>&1 done
5. 给予执行权限
[root@centos3 inotify-tools-3.14]# chmod +x inotify.sh [root@centos3 inotify-tools-3.14# /root/inotify.sh & #在后台执行
6.最后,将此脚本加入系统自启动文件 # echo "/root/inotify.sh" >> /etc/rc.local
[root@centos3 inotify-tools-3.14]# echo "/usr/local/inotify-tools-3.14/inotify.sh &" >> /etc/rc.local
7.向/inotify/下添加内容,去centos上查看是否同步
[root@centos3 inotify]# touch 123 [root@centos3 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看看是否有这个文件
[root@centos web_log]# ls 123
8.编写监听inotify进程脚本,防止inotify由于某种原因中断无法实时同步(如果不需要监听,此步可以跳过)
[root@centos3 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 简化: [root@centos3 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 [root@centos3 inotify-tools-3.14]# chmod a+x jianting.sh
9.添加定时任务计划
# crontab -e * * * * * /usr/local/inotify-tools-3.14/jianting.sh & > /dev/null
这样就可以实现rsync+inotify实时同步了
原文地址:http://blog.51cto.com/xiaozhagn/2045970