【问题标题】:Elasticsearch data integrity issue with MariaDBMariaDB 的 Elasticsearch 数据完整性问题
【发布时间】:2020-01-28 08:04:23
【问题描述】:

我已经设置了 2 个相同的 ELK 服务器来在我的测试环境中同步 MariaDB(从转储 sql 恢复,因此它是非活动表,没有活动插入活动)表。

这个 MariaDB 表由 15,359,086 行组成。

但是,当使用 Logstash 将数据同步到 Elasticsearch 时,我注意到计数不匹配。

从第一个 ELK 服务器,我使用 count API 获得了这个数量

{
    "count": 15936359,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    }
}

以及来自第二个 ELK 服务器

{
    "count": 14934148,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    }
}

同步时出现这种差异的原因是什么?没有一个 ELK 从源返回正确的值,即使设置相同,两个堆栈也会给出不同的计数

我正在使用 Postman 的这个计数 API

GET http://localhost:9200/index/_count
{
    "query" : {
        "term" : { "type" : "column in DB" }
    }
}

【问题讨论】:

  • 能否请您添加您执行的计数 API 调用?
  • 使用 count API 更新问题

标签: mysql elasticsearch mariadb logstash elastic-stack


【解决方案1】:

评论太长了:

在计算 InnoDB 表中的列数时,这些值通常是估计值或快照,而不是准确的行数。

例如,如果这些值是从 SHOW TABLE STATUS LIKE 'table_name' 获得的,您可能会得到不正确的行数。

为了确保通过转储文件填充数据成功,一个可能的解决方案是对通过执行转储文件创建和填充的每个表使用说明:

EXPLAIN SELECT COUNT(indexed_colum) FROM your_table.

如果您更喜欢SELECT COUNT(*) from your_table,并且该表没有使用任何索引,请考虑在等待结果之前先出去喝杯咖啡。

检查结果并比较它是否与其他服务器实例上的数字匹配。

【讨论】:

  • 感谢您解释 +1。你知道为什么两个 ES 实例有不同的数字,正如 OP 在他的帖子中显示的那样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多