在分布式系统中,如何保证数据的一致性,一直是一个难题!业界也出现了很多不同的方案来实现数据的一致性。如使用数据库,使用一致性算法如raft等等,这些方案对数据比较小的内容有较好的效果,对应比较多内容的,则可能会遭遇问题。今天也介绍一种保证数据一致性的方法,即使用文件同步的方式:Rsync+Inotify。
rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输量。rsync中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。rsync可以拷贝/显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。
inotify是Linux核心子系统之一,作为文件系统的附加功能,它可监控文件系统并将
从上图可以看出,rsync有客户端和服务器端,inotify负责监控客户端的文件变化,然后通过rsync客户端将变化发送到目标服务器端。
以linux中centos7为例,其它系统可以做参考:
客户端安装rsync
yum -y install rsync
客户端安装inotify
//从内核和目录里面查看是否支持inotify
ls -l /proc/sys/fs/inotify/
//检查是否有安装inotify 如果没有就安装
rpm -qa inotify-tools
yum install inotify-tools -y
//检查是否安装完成
inotifywait --help
inotifywatch --help
客户端准备配置和监控脚本
在/etc目录下创建rsync.password文件,并赋予600权限
chmod 600 rsync.password
准备监控脚本inotify.sh,监控文件变化
#!/bin/bash
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib /opt/source/ | while read file
do
rsync -vzrtopg --progress /opt/source/ backuser@168.192.1.1::dest --password-file=/etc/rsync.password
rsync -vzrtopg --progress /opt/source/ backuser@168.192.1.2::dest --password-file=/etc/rsync.password
echo "${files} was rsynced" >> /var/log/rsync.log 2>&1
done
安装完成后会生成两个命令
/usr/bin/inotifywait
/usr/bin/inotifywatch
inotifywait命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次inotifywait命令参数:-m是要持续监视变化。-r使用递归形式监视目录。-q减少冗余信息,只打印出需要的信息。-e指定要监视的事件列表。--timefmt是指定时间的输出格式。
FMT: # --timefmt '%y-%m-%d %H:%M'--format指定文件变化的详细信息。
FMT: # --format '%T %f %e'--outfile将事件输出到指定文件,而不输出到屏幕-d|--daemon以守护进程方式后台运行(除了在后台运行外,与-m选项一样)
注意dest不是目录,而是rsync服务端定义的别名,在服务端的rsync.conf文件中配置的。
启动脚本编写start.sh:
#!/bin/bash
ps -elf | grep inotify &> /dev/null
if [ -z $? ]
then
echo "inotify service is running"
else
sh /home/inotify.sh &
echo "inotify service is activing"
fi
文件授权,并执行
chmod u+x *.sh
sh start.sh
服务器端安装rsync
yum -y install rsync
服务器配置文件
rsync.password
和上面客户端相同。
rsyncd.conf
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.password
motd file = /etc/rsyncd.motd
[web_log]
path = /usr/local/dest/
comment = dest
uid = root
gid = root
port=873
use chroot = false
read only = false
list = false
max connections = 200
timeout = 600
auth users = backuser
hosts allow = 168.192.1.1,168.192.1.2
启动rsync
rsync --daemon
在目标文件,新建文件,在目标文件即可以看到。
常见错误
password file must not be other-accessible
continuing without password file
Password:
rsync客户端路径是否写错,权限设置不对,需要再次输入密码,客户端和服务端的密码文件都应该是600的权限才可以。