Rsync+inotify的优点:
使用rsync工具和inotify机制相结合,可以实现触发式部署(实时同步),只要原始(主)位置的文档发生变幻,则立即启用增量推送操作,否则处于静态等待状态,这样以来,就避免了分布式集群部署过程复杂的问题。
iontify缺点:
1.并发如果大于200个文件(10-100K),同步会有延迟
2.监控到事件后,调用rsync同步是单线程的(加&并发),sersync多进程同步
Rsync缺点:
sersync有重传机制(内置的定时任务),但是只重传一次,如果重传失败就会清空重传队列,即清空/tmp/rsync_fail_log.sh文件。这样就会造成sersync服务恢复正常后(即可以同步文件),数据同步的两个服务器数据不一致的现象因为,/tmp/rsync_fail_log.sh文件为空,而sersync只对发生变化的文件做实时同步。
架构图
需要两台linux服务器:
Rsync-10 192.168.157.30 (数据接收方)
Rsync-20 192.168.157.40 (数据发送方)
注意先关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
查看服务器的内核版本是否达到2.6
uname -r
检查是否有三个文件(如下):
ls /proc/sys/fs/inotify/
max_queued_events max_user_instances max_user_watches
配置数据接收方:
首先安装rsync:
yum install rsync
修改rsync的配置文件(配置如下):
Vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
hosts allow = 192.168.157.0/24
[backup]
path = /backup/
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass
创建一个共享的用户并且设置密码(注意我这边设置的密码为123):
useradd rsyncuser
passwd rsyncuser
生成验证文件,也就是把用户和密码加入到文件里面:
echo "rsyncuser:123" > /etc/rsync.pass
注意一定要给权限我这边给的是600:
chmod 600 /etc/rsync.pass
创建共享的目录(名字可以自定义,但是配置文件里path这块也需要改):
mkdir /backup
启动rsync服务:
rsync --daemon #可加入/etc/rc.d/rc.local实现开机启动
systemctl start rsyncd
配置数据发送方:
将数据接收方创建用户的密码给写到文件里可以做到同步时不用再使用密码(注意也要给权限我这里给的600):
echo "123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
创建一个共享的目录:
mkdir /data/
测试是否可以同步到数据接收方:
先在阿里云里下载epel源:
网址:epel镜像_epel下载地址_epel安装教程-阿里巴巴开源镜像站 (aliyun.com)
先安装软件包:
yum -y install rsync inotify-tools
rsync -avz --password-file=/etc/rsync.pass /data/ rsyncuser@192.168.157.30::backup #将本机的/data目录共享到192.168.157.30的backup的目录。
写脚本inotify_rsync.sh
vim inotify_rsync.sh
#!/bin/bash
SRC='/data/'
DEST='rsyncuser@192.168.157.30::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
inotifywait常见的命令选项及其说明:
--timefmt <fmt>
时间格式