elasticsearch - 使用 JDBC 输入插件在多个节点上运行 Logstash

标签 elasticsearch logstash elastic-stack logstash-jdbc

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

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

最佳答案

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

在每个 logstash 实例上,按照以下逻辑安装并启用相同的 jdbc-pipelines:

  • 在结果集中为每个文档(主键等)查找唯一标识符或生成 fingerprint使用结果中的字段(MD5、SHA,而不是 UUID)。这个标识符需要稳定!当返回相同的实体时,它在其他 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 将更新先前创建的文档,而不是复制您的数据。

    对我们来说效果很好,试试吧!

    关于elasticsearch - 使用 JDBC 输入插件在多个节点上运行 Logstash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55055660/

    相关文章:

    linux - Logstash 在 Ubuntu 中没有显示任何输出

    database - 如何在 Grafana 中查询 Elasticsearch

    regex - 使用正则表达式提取堆栈跟踪的最后 'Caused by'

    database - 日志存储 : jdbc_page_size doesn't dump all my data to elastic search

    在 ELK 堆栈中调试 Filebeat

    ssl - Filebeat 无法连接到 Logstash,因为证书不包含任何 IP SAN

    elasticsearch - 超过阈值后的电子邮件警报,logstash?

    elasticsearch - elasticsearch-多索引搜索返回意外结果

    java - 如何通过节点客户端(而不是通过传输)在 Elasticsearch 中设置路径(path.home)

    elasticsearch - SQL Server数据库> Logstash> Elasticsearch:将与同一实体相关的结果集记录映射到同一ES文档