rsync:

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

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


inotify:

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

    

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

 wKiom1cx9dGyg6HUAAFRwOEdvnw318.png

 

准备实验环境:

       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 vrsync@172.18.250.78::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 

[root@localhost ~]# 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 $user@$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、测试静态页面是否能正常读取

 wKioL1cyjZXzZpzYAAAtL35N7IE097.png

  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、测试能否读取动态页面

wKioL1cyjvvTi2AxAABEK3y4JKo275.png

 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授权一个能登录的账号

 wKioL1cymN2zCPV0AABZqlq0C70623.png

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

wKiom1cysjHAMyZqAABlvTOfUJM153.png

动态页面显示不出来,是因为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上,推送完后再次刷新。。。

wKiom1cys2nh7H8fAABw0DpvpG0976.png

能正常显示了。。。。。

在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运行于后台