rsync+inotify实现对web服务器上的文件自动同步

rsync:

rsync是一个远程同步工具,非常强大的一款工具,在同步时可以保持文件的权限,属性,硬链接等,通过“rsync算法”来实现本地和远程主机的数据同步,并且是扫描两个主机之间不同的文件来进行传输,而不是整份的传输,因此速度相当快。但是随着系统规模的越来越大,rsync暴露出很多不足。

首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

inotify:

inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。

rsync和inotify结合实现的逻辑图:

准备实验环境:

1、服务器   172.18.250.78   inotify-slave        安装nginx

2、服务器   172.18.250.77   inotify-master     安装php、mariadb

php服务器提供动态页面,nginx提供静态页面,当客户端对php服务器进行写操作后,需要和nginx上的页面进行一次同步。

一、inotify-slave的部署

1、在250.78上面配置rsync,rsync daemon工作模式,接收250.77的文件同步

]# useradd -M -s /sbin/nologin rsync     //创建rsync用户
]# mkdir -p /var/www/html                //创建rsync同步的目录,也是nginx的root目录
编译配置文件:
]# vim /etc/rsyncd.conf
# configuration example:

 uid = rsync
 gid = rsync
 use chroot = no                      
 max connections = 50
 pid file = /var/run/rsyncd.pid
 timeout = 200
 read only = no                  //是否只对文件只读,不加同步的时候可能会报错
 [rsync]                         //同步的路径别名
        path = /var/www/html/    //同步的路径
        auth users = vrsync      //虚拟用户
        ignore errors            //忽略报错
        secrets file = /etc/rsync.password  //同步时用到的密码文件

2、运行rsync服务:

]# rsync --daemon --config=/etc/rsyncd.conf
]# ps -ef |grep rsync
root      8962     1  0 21:17 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf
root      9040  8929  0 22:12 pts/1    00:00:00 grep --color=auto rsync
l]# ss -tan
State       Recv-Q Send-Q            Local Address:Port          Peer Address:Port 
LISTEN      0      5                       *:873                      *:* 
LISTEN      0      5                       :::873                     :::*

3、创建同步时需要验证的账号密码文件:

]# vim /etc/rsync.password
vrsync:123456
]# chmod 600 /etc/rsync.password           //为了文件的安全性
]# ll -d /etc/rsync.password 
-rw------- 1 root root 14 May 11 21:06 /etc/rsync.password

4、在inotify-master 250.77上也创建相同的密码文件:

]# vim /etc/rsync.password
 123456                                     //注意,这只需要写上密码就行
]# chmod 600 /etc/rsync.password           //为了文件的安全性,也给予600权限
]# ll -d /etc/rsync.password 
-rw------- 1 root root 14 May 11 21:06 /etc/rsync.password

5、在250.77上测试能否推送成功

]# rsync -avz -P /etc/fstab [email protected]::rsync --password-file=/etc/rsync.password
sending incremental file list              //推送成功
fstab

二、在250.77上部署inotify工具

1、源码安装inotify工具

]# tar -xf inotify-tools-3.13.tar.gz 
]# cd inotify-tools-3.13
]# ./configure --prefix=/usr/local/inotify
]# make && make install

2、查看当前系统是否支持inotify

[[email protected] ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 May 11 22:24 max_queued_events
-rw-r--r-- 1 root root 0 May 11 22:24 max_user_instances
-rw-r--r-- 1 root root 0 May 11 22:24 max_user_watches
//有这三个文件就表示支持

3、inotify支持的常用选项:

]# ./bin/inotifywait --help
-r|--recursive       //递归查询目录
-q|--quiet           //打印出监控的事件
-m|--monitor         //一直保持事件监听状态
--excludei           //排除文件或目录时,不区分大小写
--timefmt            //指定输出时间格式
--format             //使用指定的输出类似格式字符串
-e|--event           //指定事件
Events:
	access		  //文件或目录被读取
	modify		  //文件或目录内容被修改
	attrib		  //文件或目录属性被改变
	close		  //文件或目录封闭,无论读/写模式
	open		  //文件或目录被打开
	moved_to	  //文件或目录被移动至另外一个目录
	moved_from	  //文件或目录移动至当前目录
	move		  //文件或目录被移动另一个目录或从另一个目录移动至当前目录
	create		  //文件或目录被创建在当前目录
	delete		  //文件或目录被删除	

4、编写脚本让inotify监控目录

#!/bin/bash
host=172.18.250.78    //需要推送的服务器
src=/var/www/html/    //监控的目录
dst=rsync             //推送到slave下的目录 
user=vrsync           //虚拟用户
inotify_home=/usr/local/inotify   //inotifyd的安装目录
passfile=/etc/rsync.password      //认证密码文件  

if [ ! -e "$src" ] || [ ! -e "${inotify_home}/bin/inotifywait" ] || [ ! -e "/usr/bin/rsync" ] || [ ! -e "/etc/rsync.password" ]; then
echo "Check File and Folder" 
exit 1
fi

${inotify_home}/bin/inotifywait -mrq -e close_write,delete,create,attrib $src | while read file 
do
cd $src && rsync -arvz -P ./ --timeout=100 [email protected]$host::$dst --password-file=$passfile &>/dev/null 
done
exit 0

5、测试下能否正常检测到新文件并推送

]# ./inotify.sh &       //让脚本运行于后台
]# touch a        
]# touch a.a
]# ls /var/www/html/    //在slave服务器上查看
a  a.a   fstab

三、搭建一个lnmp并安装Discuz论坛

1、在slave服务器上安装nginx

]# yum -y install nginx

2、配置nginx文件

]#  server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        root         /var/www/html;

        include /etc/nginx/default.d/*.conf;

        location / {
          index index.php index.html index.htm;
        }
        location ~ \.php$ {
            fastcgi_pass   172.18.250.77:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
            include        fastcgi_params;
        }
      }

3、测试静态页面是否能正常读取

4、在master服务器上安装php-fpm  php-mysql   mariadb-server服务

具体配置可以看我的博客LAMP的搭建,有详细说明

]# yum -y install php-fpm php-mysql mariadb-server
]# service php-fpm start  
]# vim /var/www/html/index.php
<?php
  phpinfo();
 ?>

5、测试能否读取动态页面

6、安装论坛Discuz

]# unzip Discuz_X3.2_SC_UTF8.zip    //250.78上
]# unzip Discuz_X3.2_SC_UTF8.zip    //250.77上
MariaDB [(none)]> grant all on *.* to ‘admin‘@‘localhost‘ identified by ‘admin‘;
     mysql授权一个能登录的账号

按步骤装完之后登陆论坛:

动态页面显示不出来,是因为250.77上的文件发生了改变,而250.78上面的文件还是以前的导致的,这时可以用到rsync和inotify

组合,只要250.77上的文件发生改变,就同步文件到250.78上

]# bash -x inotify.sh 
+ host=172.18.250.78
+ src=/var/www/html/upload/
+ dst=rsync
+ user=vrsync
+ inotify_home=/usr/local/inotify
+ passfile=/etc/rsync.password
。。。。。。

在250.77上启用inotify工具,只要upload目录下的文件发生改变,就推送文件到250.78上,推送完后再次刷新。。。

能正常显示了。。。。。

在upload目录下在新建一个文件,测试下能否正常推送:

upload]# touch a.txt   //250.77上
upload]# ll
total 88
-rw-r--r--  1 root root 2739 Jun  9  2015 admin.php
drwxr-xr-x 11 root root  152 Jun  9  2015 api
-rw-r--r--  1 root root  727 Jun  9  2015 api.php
drwxr-xr-x  2 root root   22 Jun  9  2015 archiver
-rw-r--r--  1 root root    0 May 12  2016 a.txt   //能正常接收
~]# sh inotify.sh &    //让inotify运行于后台
时间: 2024-10-24 04:56:10

rsync+inotify实现对web服务器上的文件自动同步的相关文章

keepalived结合nginx状态检测脚本实现对web服务器集群的高可用

实验环境 两台CentOS-7.5虚拟机web1:10.0.11.203web2:10.0.11.204VIP :10.0.11.210web类型:nginx客户端:自用笔记本(win10)nginx状态检测脚本:ck_nginx.sh 实验一.使用keepalived简单实现web集群的高可用功能 1.准备两台web服务器 1)web1网卡情况[[email protected] ~]# [[email protected] ~]# ip a 2)web2网卡情况[[email protect

web服务器上传文件过程

通过web服务器上传文件,需要提前准备好下面3步,然后才能通过第4步上传文件1.web服务器的配置 1.1 将代码src目录中的select.c文件的170行的REQUEST_TIMEOUT改为10*REQUEST_TIMEOUT 1.2 在buildroot中选中boa后保存编译,然后更新nfs_root中内容: 1.3 重启单板 1.4 配置/etc/boa/boa.conf文件 1.4.1 屏蔽掉Group nobody,增加Group 0 1.4.2 去掉Errorlog前的屏蔽 1.4

大开测试:性能-如何实现对Web应用程序服务器资源监控(连载25)

7.25  如何实现对Web应用程序服务器资源监控 1.问题提出 如何实现对Web应用程序服务器资源监控? 2.问题解答 可以使用LoadRunner的Web应用程序服务器资源监控器,在场景或会话步骤运行期间监控Web应用程序服务器,并隔离应用程序服务器性能瓶颈. Web应用程序服务器资源监控器提供了场景或会话步骤执行过程中,有关Ariba.ATG Dynamo.BroadVision.ColdFusion.Fujitsu INTERSTAGE.iPlanet (NAS).Microsoft A

用 Python 脚本实现对 Linux 服务器的监控

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va

利用Inotify和Rsync将web工程文件自动同步到多台应用服务器

背景:需要搭建一套跟线上一模一样的环境,用来预发布,这是其中的web分发的一个小模块的实现过程. 1 工具以及环境简介 1.1,Inotify工具 Inotify,它是一个内核用于通知用户空间程序文件系统变化的机制.众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如hotplug.udev 和 ino

使用ANT实现对web项目的自动更新 编译 打包

在服务器上无法使用eclipse来打包.需采用ant方式 附件中是ant所需要的svn插件 并在ant/lib下面删除:svnjavahl.jar,javasvn.jar http://panyongzheng.iteye.com/blog/1271184 <?xml version="1.0" encoding="UTF-8"?> <project name="cim" default="deploy" b

rsync + inotify 实现多台服务器数据同步

环境分析:目前环境4台web服务器采用共享存储技术,由于nas服务最近频繁掉线,影响网站访问,故计划采用对象存储方案.我们云环境补救措施可以用多台Linux服务器做存储,配合rsync(同步)+notify(触发)实现服务器数据同步. 方案实施: 1.方案分析:每台web服务器上分别挂载一个存储盘/newweb,将原先网站访问资源指向/otherweb的路径修改至这个/newweb,由于磁盘容量没有nas大,可以将web用到的数据源,如图片.网页等放在这个路径下,邮箱.日志等继续放在nas下,即

ASP.NET 4.0尚未在 Web 服务器上注册 解决方法

ASP.NET 4.0尚未在 Web 服务器上注册 解决方法 使用VS2010创建web应用程序时出现如下提示ASP.NET 4.0尚未在 Web 服务器上注册.为了使网站正确运行,可能需要手动将 Web 服务器配置为使用 ASP.NET 4.0,按 F1 可了解更多详细信息 解决方法: 首先设置IIS应用程序池 net framework版本为4.0 然后  开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行->%windir%\Microsoft.

HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面

在发布系统的过程中,曾经遇到过这样的问题,由于 Web 服务器上的"ISAPI 和 CGI 限制"列表设置,无法 提供您请求的页面. 错误详情如下: 解决方法: 找到IIS的根节点->右侧"ISAPI和CGI限制"->把禁止的ASP.Net版本项设置为允许. 如下图 总结:通过这个这个问题,我想到了一点:虽然解决了问题,但知其然却不知其所以然,很多情况下都是这样的, 虽然能够解决问题,但有的时候由于各方面条件的限制而不知道为什么,不知道这样下去有没有问题