原理介绍:
单一的Rsync工具仅可以对数据进行同步,单一的Inotify仅可以实现实时文件监控,而两者结合就能够实现数据中心实时数据同步
项目描述:
云维科技公司需要部署一套Web服务,随着用户访问量的增加,单台服务器已经不能满足大量的并发访问,因此该公司使用集群技术,整合多台服务器处理能力实现均衡负载,从而满足不断增加的并发访问量.
由于web服务器提供的网站数据需要时刻的保持一致,但是当服务器越来越多时,在这么多台主机之间同步随时可能发生改变的网站数据简直就是一场噩梦
解决方案:
(1)在后端建立数据发布服务器,该服务器作为rsync客户端,通过inotify机制实时监控网站数据,当数据发生变化后调用rsync命令上传数据至多个rsync服务器,这里的rsync服务器就是提供web服务的web服务器
(2)首先需要在web服务器上部署rsync服务,这些rsync服务要能够实现客户端上传的功能,从而实现在客户端上将数据推送至rsync服务器,实现数据的实时同步功能.简单说就是在客户端上修改数据,就可以实时的推送至web服务器了.
拓扑结构:
部署:
(1)在web服务器192.168.1.10上配置如下:
#yum -y install rsync
#mkdir -p /var/www/001
#chmod 660 /var/www/001
#chown nobody.nobody /var/www/001
#vim /etc/rsyncd.conf
transfer logging = yes #开启rsync数据传输日志功能
log file = /var/log/rsyncd.log #设置日志文件名称 (可通过log format参数设置日志格式)
pid file = /var/run/rsyncd.pid #设置rsync进程号保存文件名称
lock file = /var/run/rsync.lock #设置锁文件名称
uid = 0 #设置数据传输时使用的账户名称或ID号,默认使用nobody
gid = 0 #设置数据传输时使用的组名或GID号,默认使用nobody
use chroot = no #设置为yes后,rsync会首先进行chroot设置,将根映射到path路径下,对客户端而言,系统的根就是path参数所指定的路径,.但是这样做需要root权限,并且在同步符号连接资料时仅仅会同步名称,而内容将不会同步
ignore errors #忽略一些IO错误
read only = no #是否允许客户端上传数据功能
[web1] #模块,rsync通过模块定义数据同步的目录,模块已[name]的形式定义,与Samba定义的共享目录是一样的效果,可以定义多个模块哦
comment = web content #定义注释说明字串
path = /var/www/001 #同步目录的真实路径,通过path指定
auth users = tom #设置允许连接服务器的用户,这个用户可以在服务器中不存在,如果有多个用逗号隔开
secrets file = /etc/rsyncd.secrets #这只密码验证文件名称,文件权限为只读,600,必须写在auth users后,否则不生效
hosts allow=192.168.1.12 #允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网段用空格分隔
hosts deny=* #拒绝哪些主机访问(除hosts allow定义的主机外)
list = false #客户端请求显示模块列表时,本模块名称是否显示,默认为true
#echo "tom:pass" > /etc/rsyncd.secrets #创建密码文件,密码文件不可对所有人开放可读权限,为了安全,600
#chmod 600 /etc/rsyncd.secrets
#rsync --daemon #默认不是开机自启,需要放到/etc/rc.local下
#echo "rsync --daemon" >> /etc/rc.local
(2)在web服务器192.168.1.11上配置如下:
#yum -y install rsync
#mkdir -p /var/www/002
#chmod 660 /var/www/002
#chown nobody.nobody /var/www/002
#vim /etc/rsyncd.conf
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
uid = 0
gid = 0
use chroot = no
ignore errors
read only = no
[web1]
comment = web content
path = /var/www/001
auth users = tom
secrets file = /etc/rsyncd.secrets
hosts allow=192.168.1.12
hosts deny=*
list = false
#echo "tom:pass" > /etc/rsyncd.secrets
#chmod 600 /etc/rsyncd.secrets
#rsync --daemon
#echo "rsync --daemon" >> /etc/rc.local
(3)客户端192.168.1.12配置如下:
#tar -xf inotify-tools-3.13.tar.gz
#./configure
#make && make install
#echo "pass" > /root/rsync.pass
#vim notify_rsync.sh
#!/bin/bash
#AUTHOR:ZHD
#DATE:2019-06-16
#VERSION:1.0
#定义变量
export PATH=/bin:/usr/bin:/usr/local/bin
SRC=/web-data/ #本地源路径
DEST1=web1 #目标模块路径
DEST2=web2
Client1=192.168.1.10 #远程客户端地址
Client2=192.168.1.11
User=tom #配置用户
Passfile=/root/rsync.pass #用户密码文件,注意600
[ ! -e $Passfile ] && exit
#Program wait for change
inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f %e' \
--event modify,create,move,delete,attrib, $SRC | while read line #设置日志格式
do
echo "$line" >> /var/log/inotify_web 2>&1
rsync -avz --delete --progress --password-file=$Passfile $SRC \ #同步
${User}@$Client1::$DEST1 >> /var/log/sync_web1 2>&1
rsync -avz --delete --progress --password-file=$Passfile $SRC \
${User}@$Client2::$DEST2 >> /var/log/sync_web2 2>&1
done &
#chmod a+x notify_rsync.sh #设置所有用户执行权限
#/root/notify_rsync.sh
#echo "notify_rsync.sh" >> /etc/rc.local