繁体   English   中英

数据管道设计注意事项(Filebeat,Kafka,Logstash,Elasticsearch)

[英]Data pipeline design considerations (Filebeat, Kafka, Logstash, Elasticsearch)

我正在尝试清除以下数据管道中的一些问题,并希望对此设计中的任何漏洞(利用Filebeat,Kafka,Logstash和Elasticsearch)获得一些意见。

目标

查找给定用户的最新位置,最长延迟时间为45秒。

理念

我们有一个Python应用程序,可以连续注销用户的最新位置。

# log.json
{"user_id": 1, "location": "San Francisco, CA"}
{"user_id": 1, "location": "New York City, NY"}
{"user_id": 2, "location": "Chicago, IL"}
{"user_id": 1, "location": "Portland, OR"}

这个想法是将这些数据写入Elasticsearch(我们公司内部对它有很好的支持的数据存储),并使用“ user_id”作为文档ID,这样,如果我执行这2次插入,便会背靠背:

{"user_id": 1, "location": "San Francisco, CA"}
{"user_id": 1, "location": "New York City, NY"}

然后在Elasticsearch中查询“ user_id” == 1将返回最新位置。

当前管道

Filebeat -> Kafka -> Consumer (business logic)-> Kafka -> Logstash -> Elasticsearch

已知限制:

  • 消息顺序必须在整个管道中保留(这意味着filebeat必须使用单个收集器运行)
  • 在管道的多个部分敏感滞后

问题:

  • 我没有考虑过上述设计的其他限制吗?
  • 由于我们显式地使用document_id(设置为每个记录的“ user_id”),因此应将写入发送到相同的Elasticsearch分片。 但是,即使这些记录按以下顺序发送到相同的ES分片,并且具有明确的文档版本和特定的external_gte (注意:logstash使用批量API):

{"user_id": 1, "document_version": 1, "location": "San Francisco, CA"}
{"user_id": 1, "document_version": 2, "location": "New York City, NY"}

写入发生乱序是否会发生任何情况?

假设您控制着日志代码-您可以看看让应用程序直接登录到Kafka,然后使用KSQL或Kafka Streams,可以在45秒的时间内找到数据,将数据写回到另一个Kafka主题,最后使用Kafka Connect的Elasticsearch输出连接器(或Logstash)以写入Elasticsearch。 我不知道Filebeat Kafka输出的灵活性如何,但是我认为您需要一个“原始”主题,然后订阅该主题,将其“重新分区”为另一个主题,然后进行后续的输出处理。

您可以通过识别密钥使Kafka分区的事件井然有序。 例如,按用户ID键,然后任何给定用户的所有事件最终在Kafka中排序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM