不用敲代码写BUG,只靠现成的开源工具,通过简单的配置,是否能同时做到:
- 在不同服务器之间同步文件
- 监视到变化后立即开始传输
- 不受文件数量的限制
- 不需要高性能的机器
rsync 能满足 1,inotify 能满足 2,fanotify 也许能满足 3 和 4,
但今天的主角是 fluent-bit 和 nats。
日志采集器 (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/