Elasticsearch 悬挂索引解析与管理指南

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch 悬挂索引解析与管理指南

在 Elasticsearch 的实战中,悬挂索引是一个既常见又容易引起困扰的概念。

今天,我将分享一次处理集群状态为RED,原因为DANGLING_INDEX_IMPORTED 的实战经验,深入探讨悬挂索引的定义、产生原因、管理方法,以及如何有效处理它们,确保读者能够明白并解决自己面临的问题。

值得一提的是,类似问题恰巧是某企业的面试题。

1、悬挂索引的定义

当 Elasticsearch 集群的某个节点因故障(如宕机)暂时离开集群,而该节点上存有的某些索引分片在集群的其他节点上没有副本时,这些索引分片在节点重新加入集群后会被标记为“悬挂”状态。

简而言之,悬挂索引(dangling index)是存在于节点上、但未被集群元数据所识别的索引分片,这意味着它们不会参与到集群的正常索引操作中。

让我们不仅联想到十多年前学过的一个C语言的知识点:野指针

野指针(Dangling Pointer)是指向“不可预知”内存区域的指针。具体来说,当指针变量在释放了其所指向的内存后未被设为 NULL,或者是指向了一个已经被回收利用的内存块时,这个指针就变成了野指针。

使用野指针访问或操作内存是危险的,因为它可能会导致不可预知的行为或程序崩溃,类似于悬挂索引在集群中的状态,指向了集群中不存在的元数据。

2、遇到的问题及解决步骤

之前遇到过 Elasticsearch 集群状态为RED,原因是出现了大量UNASSIGNED的分片,具体来说是DANGLING_INDEX_IMPORTED的情况。

2.1 识别问题

首先,我使用如下命令确认集群节点状态,发现确实有一个数据节点丢失。通过重启故障节点,虚拟机恢复,但分片仍然未分配。

GET /_cat/nodes

2.2 深入分析

进一步使用如下命令查看未分配的分片,发现都标记为了 DANGLING_INDEX_IMPORTED。

GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason

返回结果:

index1            0 p UNASSIGNED   DANGLING_INDEX_IMPORTED
index2            0 p UNASSIGNED   DANGLING_INDEX_IMPORTED
index3            0 p UNASSIGNED   DANGLING_INDEX_IMPORTED

上面提到的 DANGLING_INDEX_IMPORTED 就是前文提及的悬垂索引导入标记。

DANGLING_INDEX_IMPORTED 标记表示集群已经尝试恢复这些原本丢失的索引分片,将它们重新集成回集群中。这是一种Elasticsearch集群自我恢复的机制,用于尽可能保留和恢复数据。

然而,这种自动导入悬挂索引的操作可能会带来数据完整性和一致性的风险,因为无法保证这些索引的数据是最新的或完整的。

因此,在Elasticsearch的较新版本(7.9之后版本,不含7.9)中,建议使用专门的悬挂索引API来手动管理和恢复这些索引,以确保数据的安全性和一致性。

2.3 诊断原因

通过如下命令诊断未分配分片的具体原因,发现是因为之前的主分片副本已经在集群中的其他节点上找不到了。

GET /_cluster/allocation/explain?pretty

返回信息类似如下:

{
  "index" : "XXXX",
  "shard" : 0,
  "primary" : true,
  "current_state" : "unassigned",
  "unassigned_info" : {
    "reason" : "DANGLING_INDEX_IMPORTED",
    "at" : "2021-05-03T11:58:14.859Z",
    "last_allocation_status" : "no_valid_shard_copy"
  },
  "can_allocate" : "no_valid_shard_copy",
  "allocate_explanation" : "cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster",

这段信息表明:

XXXX索引的第0个主分片因为被识别为悬挂索引并尝试导入而未被分配。尽管有导入尝试,但因为在集群的任何节点上都找不到这个分片的有效副本,导致这个分片无法被正确分配到任何节点上。

这可能指向了数据丢失或数据一致性问题,需要进一步的手动干预和数据恢复操作。

问题参见:https://t.zsxq.com/18SWm6kxF

3、悬挂索引重要的操作和注意事项

3.1. 识别悬挂索引

使用如下命令,可以列出所有的悬挂索引。

GET /_dangling

此命令将返回索引名称、索引UUID、创建时间以及所在节点等信息,如下所示:

{
  "dangling_indices": [
   {
    "index_name": "my-index-000001",
    "index_uuid": "zmM4e0JtBkeUjiHD-MihPQ",
    "creation_date_millis": 1589414451372,
    "node_ids": [
      "pL47UN3dAb2d5RCWP6lQ3e"
    ]
   }
  ]
}

3.2 恢复悬挂索引

通过如下命令恢复指定的悬挂索引。

这一步骤要求明确接受可能的数据丢失,因为 Elasticsearch 无法确定悬挂索引的数据是否是最新的。

POST /_dangling/<index-uuid>?accept_data_loss=true

这里 index-uuid 就是 3.1 小节返回的 index_uuid。

3.3 删除悬挂索引

使用如下API可以通过指定其UUID来删除一个悬挂索引,而UUID可以通过使用列出悬挂索引的API找到。

DELETE /_dangling/<index-uuid>?accept_data_loss=true

这个操作需要在Elasticsearch安全特性启用的情况下拥有管理集群的权限。

简而言之,这个API提供了一种方法,允许管理员在确认数据丢失的风险后,清理集群中未被识别为当前部分的悬挂索引。

3.4  自动化脚本恢复

如果存在大量悬挂索引,可以编写脚本自动化处理恢复操作。

3.5 检查集群状态

完成恢复操作后,需检查集群状态以确保数据的完整性和集群的健康。

4、避免悬挂索引的预防措施

  • 确保所有节点正确配置并加入集群。
  • 在节点离开集群前,正确移除所有索引。
  • 避免手动修改 Elasticsearch 数据路径,以防产生悬挂索引。
  • 删除大量索引时需确保所有集群节点均在线,以避免产生悬挂索引。

5、结语

通过对Elasticsearch中悬挂索引问题的深入探讨与解决,我们不仅增强了对集群管理的理解,也学会了如何应对潜在的数据一致性风险。

本次实战经历强调了预防、诊断和恢复悬挂索引的重要策略,提醒我们在集群运维过程中必须保持警惕,采取适当措施以维护集群的健康状态。

正确的集群管理实践和对悬挂索引的有效处理,是确保Elasticsearch集群稳定运行、数据安全的关键。

希望本指南能帮助读者在未来遇到类似问题时,能够更加从容不迫地应对,保障数据的完整性和可用性。

6、参考

[1] https://tomasz-gintowt.medium.com/elasticsearch-dangling-index-imported-64b008949074

[2] https://opster.com/guides/elasticsearch/how-tos/how-to-recover-dangling-indices/

[3] https://bigdataboutique.com/blog/dangling-indexes-in-elasticsearch-how-to-prevent-fix-and-recover-37bcea

[4] https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html#dangling-indices

7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线


更短时间更快习得更多干货!

和全球 近2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

比同事抢先一步学习进阶干货!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9天前
|
NoSQL 定位技术 MongoDB
深入探索 MongoDB:高级索引解析与优化策略
深入探索 MongoDB:高级索引解析与优化策略
|
24天前
|
域名解析 网络协议 安全
【域名解析DNS专栏】进阶DNS管理:利用DNSSEC加强域名安全
【5月更文挑战第23天】DNSSEC使用公钥加密为DNS记录添加数字签名,防止DNS欺骗和中间人攻击。它涉及密钥对生成、记录签名、公钥发布和验证过程。部署DNSSEC需要选择支持的DNS提供商,管理密钥并配置签名区域。尽管面临复杂性、性能影响等挑战,DNSSEC的普及和与TLS、HTTPS结合将提升DNS安全性,构建更可信的互联网环境。通过实践DNSSEC,我们可以强化域名安全防线。
|
27天前
|
存储 Kubernetes API
使用Kubernetes管理容器化应用的深度解析
【5月更文挑战第20天】本文深度解析Kubernetes在管理容器化应用中的作用。Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器,提供API对象描述应用资源并维持其期望状态。核心组件包括负责集群控制的Master节点(含API Server、Scheduler、Controller Manager和Etcd)和运行Pod的工作节点Node(含Kubelet、Kube-Proxy和容器运行时环境)。
|
1月前
|
存储 资源调度 JavaScript
阿珊解析Vuex:实现状态管理的利器
阿珊解析Vuex:实现状态管理的利器
|
1月前
|
开发框架 前端开发 开发者
【Uniapp 专栏】Uniapp 的状态管理功能深度解析
【5月更文挑战第13天】Uniapp 的状态管理对于构建复杂跨平台应用至关重要,它包括全局变量、Vuex 风格管理。核心概念有 State、Actions 和 Mutations。通过状态定义、动作设计和突变管理,提高开发效率和代码可维护性。实际案例和与其他框架比较显示了 Uniapp 的优势。理解并有效利用状态管理,能提升应用质量和开发效率。
【Uniapp 专栏】Uniapp 的状态管理功能深度解析
|
23天前
|
域名解析 网络协议 应用服务中间件
2024最新彩虹聚合DNS管理系统源码v1.3 全开源
聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口,支持获取域名独立DNS控制面板登录链接,方便各种IDC系统对接。
87 0
|
1月前
|
JSON 搜索推荐 API
使用Elasticsearch进行全文搜索:技术深度解析
【5月更文挑战第16天】本文深入解析了使用Elasticsearch进行全文搜索的技术细节。Elasticsearch是一个基于Lucene的开源搜索引擎,支持全文、结构化搜索和数据分析,具备优秀的扩展性。文中介绍了其核心功能,包括全文搜索、结构化搜索、分析和可扩展性。详细步骤涉及安装配置、数据准备、创建索引、导入数据、构建查询及结果处理。Elasticsearch凭借其高效性能和灵活性,成为企业全文搜索的首选解决方案。
|
4天前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
13 0
|
4天前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
11 0
|
5天前
|
Java

热门文章

最新文章

推荐镜像

更多