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