Rsync:
rsync是类unix系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
Inotify:
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。
rsync+inotify:
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!
实验环境:Centos7
源服务器-IP:10.0.0.132 (rsync+inotify)
目标服务器-IP:10.0.0.133 (rsync)
实验拓扑:
配置前提:(两台都执行)
1.关闭selinux
[root@localhost ~]# vim /etc/selinux/config SELINUX=disabled
2.关闭防火墙
[root@localhost ~]# systemctl stop firewalld
3.时间同步
[root@localhost ~]# ntpdate cn.pool.ntp.org
操着过程:
配置目标服务器:
1.安装rsync
[root@dest ~]# yum install -y rsync
2.修改配置文件,添加以下
[root@dest ~]# vim /etc/rsyncd.conf #工作中指定用户(需要指定用户) uid = root gid = root ####相当于黑洞.出错定位 use chroot = no #####有多少个客户端同时传文件 max connections = 200 #####超时时间 timeout = 300 #####进程号文件 pid file = /var/run/rsyncd.pid #####日志文件 lock file = /var/run/rsync.lock #####日志文件 log file = /var/log/rsyncd.log #####模块开始 [backup] ####需要同步的目录 path = /test/ ####表示出现错误忽略错误 ignore errors #####表示网络权限可写(本地控制真正可写) read only = false #####这里设置IP或让不让同步 list = false #####指定允许的网段 hosts allow = 10.0.0.0/24 #####拒绝链接的地址,以下表示没有拒绝的链接。 hosts deny = 0.0.0.0/32 #####不要动的东西(默认情况) #####虚拟用户 auth users = rsync_backup #####虚拟用户的密码文件 secrets file = /etc/rsync.password
3.创建密码文件,并赋予权限
[root@dest ~]# cat /etc/rsync.password rsync_backup:123456 (用户为配置文件里的虚拟用户,密码自定义) [root@dest ~]# chmod 600 /etc/rsync.password
4.创建同步的目录
[root@dest ~]# mkdir /test
5.启动rsync
[root@dest ~]# rsync --daemon [root@dest ~]# ps -ef |grep rsync root 2832 1 0 20:06 ? 00:00:00 rsync --daemon root 2834 2774 0 20:07 pts/1 00:00:00 grep --color=auto rsync
配置源服务器:
1.安装rsync
[root@source ~]# yum install -y rsync
2.创建同步出去的目录和密码文件,并赋予密码文件权限
[root@source ~]# cat /etc/rsync.password 123456 [root@source ~]# chmod 600 /etc/rsync.password
3.测试推送
[root@source ~]# cd /test/ [root@source test]# touch {1..3}.txt [root@source test]# ls 1.txt 2.txt 3.txt [root@source test]# rsync -vzrtopg --progress /test/ rsync_backup@10.0.0.133::backup --password-file=/etc/rsync.password sending incremental file list ./ 1.txt 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=2/4) 2.txt 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=1/4) 3.txt 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=0/4) sent 167 bytes received 68 bytes 470.00 bytes/sec total size is 0 speedup is 0.00
4.查看目标服务器是否有文件
[root@dest ~]# cd /test/ [root@dest test]# ls 1.txt 2.txt 3.txt
5.安装inotify
[root@source src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@source src]# tar -zxvf inotify-tools-3.14.tar.gz [root@source inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify [root@source inotify-tools-3.14]# make && make install
6.编写监控脚本,并给脚本权限
[root@source src]# cat inotify.sh #!/bin/bash host01=10.0.0.133 #inotify-slave的ip地址 src=/test #本地监控的目录 dst=backup #inotify-slave的rsync服务的模块名 user=rsync_backup #inotify-slave的rsync服务的虚拟用户 rsync_passfile=/etc/rsync.password #本地调用rsync服务的密码文件 inotify_home=/usr/local/inotify #inotify的安装目录 #judge if [ ! -e "$src" ] || [ ! -e "${rsync_passfile}" ] || [ ! -e "${inotify_home}/bin/inotifywait" ] || [ ! -e "/usr/bin/rsync" ]; then echo "Check File and Folder" exit 9 fi ${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src | while read file do #rsync -vzrtopg --progress --delete /jhonse/back/ rsync_backup@192.168.236.146::backup --password-file=/etc/rsync.password # rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1 cd $src && rsync -vzrtopg --progress --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1 done exit 0
[root@source src]# chmod +x inotify.sh
7.创建计划任务,实时同步
[root@source test]# crontab -l * * * * * /usr/local/src/inotify.sh [root@source test]# systemctl restart crond
8.测试,看能否实时同步
源服务器
[root@source test]# rm -rf * [root@source test]# touch {4..6}.txt [root@source test]# ls 4.txt 5.txt 6.txt
目标服务器
[root@dest test]# ls 4.txt 5.txt 6.txt
实验成功。。。
原文地址:http://blog.51cto.com/1767340368/2045430