【问题标题】:How to make Logstash replace old data?如何让 Logstash 替换旧数据?
【发布时间】:2018-11-29 04:32:54
【问题描述】:

我有一个 Oracle 数据库。 Logstash 从 Oracle 检索数据并将其放入 ElasticSearch。


但是当 Logstash 每 5 分钟进行一次计划导出时,ElasticSearch 充满了副本,导致旧数据仍然存在。这是一个明显的情况。在这 5 分钟内,Oracle 的状态几乎没有改变。假设 - 添加了 2-3 行,删除了 4-5 行。

我们如何在没有副本的情况下用新数据替换旧数据?


例如:

  1. 删除整个旧索引;
  2. 创建新的同名索引并进行相同的配置(nGram 配置和映射);
  3. 添加所有新数据;
  4. 等待 5 分钟,然后重复。

【问题讨论】:

  • 您需要使用一个唯一的 ID,例如来自您的 Oracle 数据的 userid,并在摄取到 Elasticsearch 时将其用作文档 ID。这样,如果数据库中的同一行被更新,则 Elasticsearch 中的相应文档将被新数据覆盖。无论如何,新行都会作为新文档添加。但是,当从 Oracle 中删除行时,这不起作用,因为 logstash 无法读取被删除的数据。
  • 请注意,篡改文档 _id 会导致性能下降,因为平衡分布(给定索引中跨分片的文档)将无法很好地工作。
  • @ibexit 是否记录在某处,或者您是根据个人经验发言?因为文档说document_id 属性对于覆盖 ES 中的现有条目很有用。见elastic.co/guide/en/logstash/current/…
  • @ben5556:是的,这个选项在 ES-Output 插件中可用,在某些情况下非常方便。但是,这对您的 ES-Index 性能不利。请看一下:elastic.co/guide/en/elasticsearch/reference/6.5/…github.com/elastic/elasticsearch/issues/5941github.com/ppearcy/elasticflakestackoverflow.com/questions/53214628/…
  • @ibexit 很高兴知道感谢分享

标签: elasticsearch logstash n-gram


【解决方案1】:

这很简单:为每次导入创建一个新索引并应用映射,然后将别名切换到最新索引。如果需要,删除旧索引。在索引最新数据时,您的当前数据将始终可搜索。

以下是您可能需要阅读的资源:

  1. 在 elasticsearch 中搜索时使用别名 (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html) 指向最新数据(顺便说一句,使用别名总是一个好主意)。

  2. 使用翻转 api (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-rollover-index.html) 为每次导入运行创建一个新索引 - 请注意此处的别名处理。

  3. 使用索引模板 (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html) 自动为新创建的索引应用映射/设置。

  4. 收缩、关闭和/或删除旧索引,以保持集群处理您真正需要的数据。看看 curator (https://github.com/elastic/curator) 作为独立工具。

【讨论】:

  • 是的,也许我不能没有策展人。不过很奇怪,ES作者创建了Logstash,做了自动数据填充,却没想到删除旧数据。
【解决方案2】:

您只需要使用每个文档的指纹/散列或每个文档中的 uniq 字段的散列作为文档 id,这样您就可以随时用更新的文档覆盖相同的文档,同时添加新的文件也是如此。

但是这种方法不适用于从 oracle 中删除数据。

【讨论】:

  • 请看我上面的评论。这也适用于此。您需要一个非常好的指纹/哈希函数,以免破坏基于文档 ID 的文档分布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2013-04-24
相关资源
最近更新 更多