不用敲代码写BUG,只靠现成的开源工具,通过简单的配置,是否能同时做到:

  1. 在不同服务器之间同步文件
  2. 监视到变化后立即开始传输
  3. 不受文件数量的限制
  4. 不需要高性能的机器

rsync 能满足 1,inotify 能满足 2,fanotify 也许能满足 3 和 4,
但今天的主角是 fluent-bitnats

日志采集器 (fluent-bit)

负责监视。

预先定义一套格式,将文件变化的事件,格式化在某个日志文件中。
使用 tail 解析这个日志文件,实现对文件变化(增/删/改)的监视,
还可以用 lua 对监视到的文件,进行二次处理(检查/过滤/分类),
对于二次处理后的事件,还能借由 rewrite_tag,实现二次路由。
最后,借由 output 将不同路由的事件,推送到不同的消息队列。

[OUTPUT]
  name nats
  match mfs/folder/abc
  host 1.2.3.4
  port 4222

[OUTPUT]
  name nats
  match mfs/folder/def
  host 5.6.7.8
  port 4222

消息队列 (nats)

负责文件同步。

fluent-bit 的路由名称(tag),默认成为 nats 消息队列的 subject。
根据自身场景,启动一个或多个命令行客户端(nats),负责消费。

./nats subscribe -s 127.0.0.1:4222 --translate "do_rsync.sh" ">"

利用 --translate 参数,实现核心的工作负载:拉取文件、完成同步。

#!/bin/bash -e

rsync -a --info=NAME -h -H --partial -R --log-file=rsync.log \
    --files-from <( cat $* | jq -r '.[][] | try .path' ) \
    rsync://9.5.2.7/mfs/ target/