Humio 是一个日志分析系统, 专为在本地和托管产品上运行而构建。它专为 “本地优先” 设计, 因为在许多日志记录用例中, 您需要管理自己的日志记录解决方案的隐私和安全性。而且, 因为卷限制通常是托管方案中的一个问题。

从软件提供商的角度来看, 在本地解决方案中修复问题本质上是有问题的, 因此我们努力使解决方案简单。为了实现这个目标, Humio 安装只包含每个节点运行 Humio 本身的单个进程, 依赖于在附近运行的卡夫卡 (我们建议每个物理 CPU 部署一个 Humio 节点, 以便双插槽计算机通常运行两个 Humio 节点)。

我们使用卡夫卡的两件事: 缓冲摄取和作为事件的排序器在 Humio 集群的节点之间。

收录队列/提交日志

收录队列用于缓冲摄取、承受峰值负载或处理类似情况。但收录队列也扮演提交日志的角色。也就是说, 每当我们完成一个块并将其附加到 Humio 的段文件之一时, 我们还会将收到的最后一个消息批的偏移量写入到磁盘块中。这样我们就可以通过阅读在建中的 Humio 段的最后一个块来重新启动, 并从该块中列出的卡夫卡偏移量重新启动摄取。

活动采购

我们集群状态的主要协调机制也通过卡夫卡进行。使用简单的事件源模型维护 “共享群集状态”, 通过调用单个分区/多副本主题来推送更新 global-events 。所有节点定期将内部状态的快照转储到本地磁盘, 当节点启动时, 它将读取它自己的快照, 并从快照中写入的偏移量开始重新加载更新。这证明了处理分布式状态的一个非常简单的机制。

为了安全起见, 在这方面还有更多的细节, 比如卡夫卡-集群 id 作为卡夫卡抵消的时代。所以, 如果你擦你的卡夫卡或重定向到不同的卡夫卡群集需要手动干预。

Humio/卡夫卡配置

至于如何运行卡夫卡, Humio 支持三种不同的配置:

  1. 单节点: 我们提供一个 Docker 容器, 其中包含动物园管理员、卡夫卡和 Humio。这样可以很容易地尝试;就说 docker run humio/humio 走吧
  2. 运行专门的卡夫卡/动物园管理员服务您的 Humio 群集。我们为此方案提供专门的容器, 用于处理某些管理问题。
  3. 带上你自己的卡夫卡。我们试图远离管理它的方式。

第一个选项对于在单个服务器上运行的中型小型实例非常重要。同时, 选择2和3也会使事情变得有些复杂。

另一方面, 许多用户希望同时运行 Humio 和卡夫卡作为规模和弹性的集群。除非客户已经有专门的团队来管理卡夫卡, 否则他们通常会使用 Humio 和我们 humio/zookeeperhumio/kafka 容器。在这种情况下, 我们需要帮助用户平衡卡夫卡集群和配置复制等。Humio 使用了一些需要不同配置的主题, 如果客户不了解卡夫卡, 则可以很容易地配置错误 (副本太少, 所有副本最终出现在卡夫卡群集的单个节点上, 等等)。因此, 我们船舶整个卡夫卡管理客户端与 Humio, 并为用户执行这些重新配置。通过设置在 Humio 中配置此模式 KAFKA_MANAGED_BY_HUMIO=true

另一方面, 对于已经在管理卡夫卡解决方案的客户, 我们需要远离他们的方式。如果我们试图重新配置他们的卡夫卡, 一个知道自己正在做什么的客户会很恼火。为了确保我们的主题名称不会与现有的内容冲突, 您可以将 HUMIO_KAFKA_TOPIC_PREFIX 我们需要的主题配置为命名空间

  • 我们不使用卡夫卡的内置压缩, 但提供我们自己的。问题是, 在高性能方案中, 库存 LZ4 压缩使用 JNI, 可能会导致垃圾回收器锁定。随着许多消费者在同一 JVM 中运行, 我们可以很容易地进入一种情况, 那里总是有一个过程, 防止 GC 发生, 导致长时间做-没有停顿。我们确实遇到了与我们的 web 框架使用 gzip 相同的问题, 并将其替换为 com.jcraft.jzlib
  • 我们开始使用 deleteRecords 卡夫卡中的功能 (当摄入的数据安全地复制到存储节点时, 我们可以删除收录主题中的旧条目), 但后来后悔了。它采取了某些版本的卡夫卡, 使其正常工作, 并在一天结束时, 用户需要分配的保留空间, 以防 Humio 由于某种原因而出现问题。它确实节省了典型的磁盘空间使用率, 但不是最糟糕的磁盘空间需求。如果我们今天决定, 我们可能不会使用它, 但现在我们可能有客户取决于以这种方式发布的磁盘空间。
  • 我们使用用户中的 endOffsets / beginningOffsets 方法来确定入站队列的大小, 并确定在收录处理中 “我们是否在后台运行”。这些调用有时可能需要很长时间, 因此很难说我们是否落后, 因为队列很长, 或者因为它需要很长的时间来确定队列是否长。

不管怎样, 我们爱卡夫卡。它使得实现分布式系统的工作量大大低于我们必须从头完成分布式队列的努力。使用卡夫卡作为一个积木, 让我们把注意力集中在建立一个快速和愉快的搜索体验。

Comments are closed.