MST
星途 面试题库

面试题:ElasticSearch删除索引后恢复与重建 - 专家难度

当ElasticSearch索引删除后,进行重建时,要保证重建后的索引在性能、数据一致性等方面与原索引一致,且重建过程不能对现有其他业务索引产生影响。现有复杂业务场景,原索引包含复杂的映射关系、多字段分词设置、自定义评分函数,同时有多个别名指向该索引。请给出详细的重建方案,并阐述在重建过程中如何处理数据迁移、别名维护以及对原索引性能参数的复现。
50.4万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

1. 重建索引方案

  1. 创建新索引
    • 根据原索引的映射关系,重新创建新索引。使用 GET {原索引名}/_mapping 获取原索引映射,然后使用 PUT {新索引名} 并在请求体中定义与原索引相同的映射关系,包括复杂的字段映射、多字段分词设置等。例如:
// 获取原索引映射
GET old_index_name/_mapping
// 创建新索引并设置相同映射
PUT new_index_name
{
  "mappings": {
    // 此处填入从原索引获取的映射内容
  }
}
  1. 复现性能参数
    • 副本和分片设置:通过 GET {原索引名}/_settings 获取原索引的副本数和分片数设置,然后在创建新索引时设置相同的值。例如,如果原索引设置为5个主分片和1个副本,创建新索引时:
PUT new_index_name
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    // 映射内容
  }
}
- **其他性能相关设置**:如 `refresh_interval`(刷新间隔)、`index.translog.durability`(事务日志持久性)等参数,同样从原索引设置中获取并在新索引创建时应用。

3. 数据迁移: - 使用 Elasticsearch Reindex API:这是 Elasticsearch 提供的官方工具,可在不同索引间迁移数据。例如:

POST _reindex
{
  "source": {
    "index": "old_index_name"
  },
  "dest": {
    "index": "new_index_name"
  }
}
- **监控迁移进度**:可以通过 `GET _tasks?detailed=true&actions=*reindex` 查看 reindex 任务的进度。

4. 别名维护: - 临时别名:在数据迁移开始前,创建一个临时别名指向新索引,例如 new_index_alias_tmp。使用 POST _aliases

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "new_index_name",
        "alias": "new_index_alias_tmp"
      }
    }
  ]
}
- **切换别名**:数据迁移完成且验证新索引数据一致性和性能后,原子性地将原索引的别名切换到新索引。例如,假设原索引有别名 `old_index_alias`,使用 `POST _aliases`:
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "old_index_name",
        "alias": "old_index_alias"
      }
    },
    {
      "add": {
        "index": "new_index_name",
        "alias": "old_index_alias"
      }
    }
  ]
}
- **删除临时别名**:切换别名后,删除临时别名 `new_index_alias_tmp`:
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "new_index_name",
        "alias": "new_index_alias_tmp"
      }
    }
  ]
}
  1. 删除原索引:在别名切换完成且确认新索引一切正常后,安全删除原索引:
DELETE old_index_name

2. 处理细节阐述

  1. 数据迁移
    • 一致性保证:在数据迁移过程中,由于 Elasticsearch 是近实时的,可能会有少量数据在迁移过程中发生变化。为了最大程度保证数据一致性,可以在迁移前对原索引进行只读设置 PUT old_index_name/_settings?preserve_existing=true{"settings": {"index.blocks.write": true}},迁移完成后再取消只读设置。
    • 处理失败情况:如果 reindex 过程中出现失败,可以根据错误信息进行排查。常见问题如字段映射不匹配等,解决问题后可以继续未完成的 reindex 任务,通过指定 slice 参数进行分段重新索引。
  2. 别名维护
    • 原子性切换:通过 POST _aliases 进行别名的添加和删除操作,确保别名切换是原子性的,这样在切换过程中其他业务使用别名访问索引时不会出现索引不可用的情况。
    • 别名验证:在切换别名后,通过别名查询新索引数据,确保业务能够正常通过别名访问到新索引数据。
  3. 性能参数复现
    • 参数核对:在创建新索引前,仔细核对从原索引获取的所有性能相关参数,确保没有遗漏。特别是一些不常用但可能影响性能的参数,如 index.merge.policy(合并策略)等。
    • 性能测试:在新索引创建并迁移数据后,进行性能测试。可以使用类似 elasticsearch - benchmarking 工具模拟原索引的查询负载,对比新索引和原索引的性能指标,如查询响应时间、吞吐量等,确保性能一致。