【问题标题】:Running Logstash on multiple nodes with JDBC input plugin使用 JDBC 输入插件在多个节点上运行 Logstash
【发布时间】:2019-07-30 00:57:54
【问题描述】:

我有一个 Logstash 的基本 HA 设置 - 两个独立的 AWS 可用区中的两个相同的节点。每个节点都运行一个管道,该管道从数据库集群中提取数据集,然后将其输出到下游的 ELasticSearch 集群以进行索引。这适用于一个 Logstash 节点,但是由于每个节点分别跟踪 :sql_last_value,并行运行的两个节点将相同的数据两次发送到 ES 以进行索引。由于我在两个节点上使用与文档 ID 相同的 ID,因此所有重复的数据都会简单地更新,而不是插入两次。换句话说,每个数据集有 1 次插入和 1 次更新。显然,这不是很有效,并且会给 ELK 资源带来不必要的负担。随着额外 Logstash 节点的添加,情况变得更糟。

有没有人知道应该如何设置并行 Logstash 节点的更好方法,这样如果之前的另一个节点已经提取了相同的数据集,每个节点就不会提取相同的数据集?一个穷人的解决方案可能是在 Logstash 节点之间创建一个共享的 NFS 文件夹,并让每个节点在那里写入 :sql_last_value,但我不确定这种设置可能会遇到什么样的副作用,尤其是在较高负载下。谢谢!

【问题讨论】:

  • 看起来您在 2015 年的功能请求中找到了答案。github.com/elastic/logstash/issues/2632
  • 不,我不知道我找到了答案。仍然从每个 logstash 节点向 ES 发送重复数据。
  • 我相信答案是有一个 4 年前的功能请求尚未得到解决。
  • 我看不出这有什么资格作为答案。
  • 这不是一个答案 - 这是一个评论。但是,它确实可以作为指向显示答案当前状态的信息的指针,并且可能有一天——如果你是一个真正的乐观主义者——显示解决方案。如果其他人在这里找到您的问题,他们将获得比没有链接时更多的信息。

标签: elasticsearch logstash elastic-stack logstash-jdbc


【解决方案1】:

我们有相同的场景:3 个 logstash 实例以确保服务器数据库作为数据源的高可用性。

在每个 logstash 实例上安装并启用相同的 jdbc 管道,遵循以下逻辑:

  • 在结果集中为每个文档(主键等)查找唯一标识符,或使用结果中的字段(MD5、SHA,而不是 UUID)生成fingerprint。这个标识符需要稳定!当返回相同的实体时,它在其他 logstash 节点上必须相同。
  • 在elasticsearch-output 中使用id 或指纹作为文档_id。

这里有一个简单案例的简化示例(id 是结果集的一部分):

input{
  jdbc{
     ...
     statement => "select log_id, * from ..."
     ...
  }
}
filter{...}
output{
  elasticsearch{
    ...
    index => "logs-%{+YYYY.MM.dd}"
    document_id => "%{[log_id]}"
    ...
  }
}

当您的数据缺少唯一标识符并且您需要生成指纹时,这里出现了变体

input{
  jdbc{
     ...
     statement => "select * from ..."
     ...
  }
}
filter{
  fingerprint {
    method => "MD5"
    concatenate_all_fields => true
  }
}
output{
  elasticsearch{
    ...
    index => "logs-%{+YYYY.MM.dd}"
    document_id => "%{[fingerprint]}"
    ...
  }
}

在这两种方式中,文档将在它们是一个 logstash 实例的结果集的一部分时创建。所有其他 logstash 实例将在稍后获得相同的文档。使用 id/fingerprint 作为 _id 将更新之前创建的文档,而不是复制您的数据。

很适合我们,试试吧!

【讨论】:

  • 感谢您的意见。这与我们现在使用的解决方法相同。
  • 我不认为这是一种解决方法,而是一个完全解决 HA 要求的有效解决方案 :) 您是否介意接受这个答案,因为它也是您正在使用的有效解决方案。这将帮助其他人解决同样的问题。谢谢和干杯
  • 你明白了!感谢您的参与。请随意对问题进行投票。
  • 只是一个后续问题,是不是说Logstash没有官方的HA解决方案?
  • 至少没有内置,就像 apache httpd 等许多其他服务器一样。您需要通过应用常见的架构模式使其成为 HA。
【解决方案2】:

我更喜欢在不同 Logstash 实例的调度参数中使用具有一定偏移量的通用 last_run_metadata_path(在 NFS 或其他共享文件系统上)。

请检查输入 jdbc 插件以获取有关 last_run_metadata_path 的更多详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2020-05-06
    相关资源
    最近更新 更多