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 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、测试静态页面是否能正常读取
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
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运行于后台