此处只是做个记录,方便以后查找。实验过程中如有不正确的地方可以跟我联系,会及时改正。
使用rsync同步数据时需要扫描所有文件进行对比,然后进行差量传输。如果文件比较多扫描会比较耗时,效率会比较低。并且rsync不能时时监测同步数据。使用inotify可以对文件的删除、修改、移动、添加等事件监控,可以使用inotify-tools软件进行监控处理。
一、部署环境:
服务器名称 | IP地址 | 系统版本 |
website1 | 192.168.10.4 | centos 6.5 |
website2 | 192.168.10.5 | centos 6.5 |
二、安装rsync并测试:
在website1和website2上已经部署了lamp环境,所以此处就不再新建系统账户了。同步的目录权限没调,直接使用属于root用户。
首先检查是否安装rsync:
如果没安装可以使用yum -y install rsync或者下载源码包安装即可。
同步目录为:/var/www/html
1、配置rsync的配置文件:
[root@website1 ~]# cat /etc/rsyncd.conf uid = root #html目录的属主和属组 gid = root use chroot = no max connections = 400 #允许多少客户端同时传文件 pid file = /var/run/rsyncd.pid #进程号文件 lock file = /var/run/rsync.lock #日志文件 log file = /var/log/rsyncd.log #日志文件 [html] #对应同步目录,此名字可以随意起 path = /var/www/html #需要同步目录 ignore errors #忽略出现的错误 read only = no #表示网络权限可写(本地控制真正可写) list = false #这里设置IP或让不让同步 hosts allow = 192.168.10.5 #允许同步的IP auth users = rsync #同步用到的虚拟帐户,跟系统账户无关,可以不用创建账户 secrets file = /etc/rsync.pas #虚拟帐号的密码文件
2、配置虚拟账户的密码文件:
[root@website1 ~]# cat /etc/rsync.pas rsync:123456 [root@website1 ~]# chmod 600 /etc/rsync.pas [root@website1 ~]# ll /etc/rsync.pas -rw-------. 1 root root 13 Jan 2 11:55 /etc/rsync.pas
3、启动rsync服务:
[root@website1 ~]# rsync --daemon [root@website1 ~]# ps -ef | grep rsync root 1871 1 0 15:48 ? 00:00:00 rsync --daemon root 1874 1813 0 15:48 pts/0 00:00:00 grep rsync [root@website2 ~]# netstat -tunlp |grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1862/rsync tcp 0 0 :::873 :::* LISTEN [root@website1 html]# cat /var/www/html/ceshi.txt ceshi9811862/rsync
4、从website2上测试rsync同步:
在website2上设置密码文件:
[root@website2 ~]# cat /root/rsync.pwd 123456 #此处只写密码即可 [root@website2 ~]# chmod 600 /root/rsync.pwd
同步一个文件测试:
[root@website2 html]# echo "ceshi981" > ceshi.txt [root@website2 html]# cat ceshi.txt ceshi981 [root@website2 html]# rsync -avz ceshi.txt rsync@192.168.10.4::html --password-file=/root/rsync.pwd sending incremental file list ceshi.txt sent 79 bytes received 27 bytes 212.00 bytes/sec total size is 9 speedup is 0.08
在website1上查看:
[root@website1 html]# cat /var/www/html/ceshi.txt ceshi981
三、安装inotify并测试
1、查看是否支持inotify
[root@website1 html]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Jan 5 16:01 max_queued_events #表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。 -rw-r--r-- 1 root root 0 Jan 5 16:01 max_user_instances #表示每一个real user ID可创建的inotify instatnces的数量上限。 -rw-r--r-- 1 root root 0 Jan 5 16:01 max_user_watches #表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。
显示这三项表明支持inotify
2、下载inotify-tools源码包安装:
[root@website2 inotify-tools-3.14]# ./configure --prefix=/usr/ [root@website2 inotify-tools-3.14]# make && make install
[root@website2 inotify-tools-3.14]# inotifywait --help -r|--recursive Watch directories recursively. #递归查询目录 -q|--quiet Print less (only print events). #打印监控事件的信息 -m|--monitor Keep listening for events forever. Without this option, inotifywait will exit after one event is received. #始终保持事件监听状态 --excludei <pattern> Like --exclude but case insensitive. #排除文件或目录时,不区分大小写。 --timefmt <fmt> strftime-compatible format string for use with %T in --format string. #指定时间输出的格式 --format <fmt> Print using a specified printf-like format string; read the man page for more details. #打印使用指定的输出类似格式字符串 -e|--event <event1> [ -e|--event <event2> ... ] Listen for specific event(s). If omitted, all events are listened for. #通过此参数可以指定需要监控的事件,如下所示: Events: access file or directory contents were read #文件或目录被读取。 modify file or directory contents were written #文件或目录内容被修改。 attrib file or directory attributes changed #文件或目录属性被改变。 close file or directory closed, regardless of read/write mode #文件或目录封闭,无论读/写模式。 open file or directory opened #文件或目录被打开。 moved_to file or directory moved to watched directory #文件或目录被移动至另外一个目录。 move file or directory moved to or from watched directory #文件或目录被移动另一个目录或从另一个目录移动至当前目录。 create file or directory created within watched directory #文件或目录被创建在当前目录 delete file or directory deleted within watched directory #文件或目录被删除 unmount file system containing file or directory unmounted #文件系统被卸载
3、通过脚本监控并加载到后台运行:
[root@website2 ~]# cat inotify.sh #!/bin/bash #para host01=192.168.10.4 #inotify-slave的ip地址 src=/var/www/html/ #本地监控的目录 dst=html #inotify-slave的rsync服务的模块名 user=rsync #inotify-slave的rsync服务的虚拟用户 rsync_passfile=/root/rsync.pwd #本地调用rsync服务的密码文件 inotify_home=/usr #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 -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src $user@$host01::$dst >/dev/null 2>&1 cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1 done exit 0 [root@website2 ~]# sh inotify.sh & #脚本加入后台执行 [1] 1945
4、测试:
在website2上创建50个文件,然后看下同步效果:
[root@website2 html]# for a in `seq 50`;do touch $a;done [root@website2 html]# ls 1 12 15 18 20 23 26 29 31 34 37 4 42 45 48 50 8 10 13 16 19 21 24 27 3 32 35 38 40 43 46 49 6 9 11 14 17 2 22 25 28 30 33 36 39 41 44 47 5 7
在website1上查看同步结果:
[root@website1 html]# ls 1 12 15 18 20 23 26 29 31 34 37 4 42 45 48 50 8 10 13 16 19 21 24 27 3 32 35 38 40 43 46 49 6 9 11 14 17 2 22 25 28 30 33 36 39 41 44 47 5 7
删除时website1上也同样会对应删除这些文件。
上边内容有些是参考此链接处理http://chocolee.blog.51cto.com/8158455/1400596