elasticsearch单分片,单副本且有21亿个文档的索引的的救赎之路

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 当单分片的索引当拥有21亿四千万个文档时将不再具有写入能力,如何在3天内拯救它呢

背景

近日得知一个使用到es 的功能,该功能写入了21亿条文档,可能导致接下来写入失败导致影响业务。紧急学习es 相关知识,进行处理。


救赎

简单的知识背景

es 的一些基础设定,可以跟mysql 进行一定的映像,如索引=库,type = 表,doc = 每一行数据。大概可以这么理解,但并不完美。为了快速理解问题稍微铺垫一下。

业务中有多方会像es 集群中的一个索引写入数据,之后通过kibana 提供搜索功能。但由于开始设计索引时,没有设计分片,只用了单分片单副本,导致es 资源使用的不合理,写入数据有了上限,也就是2,147,483,519个。如今我们的业务还有3千万的写入空间。


简单解法

既然是空间不够了,那我就清理空间呗,想到了通过post  /index_name/

_query_delete 语法,因为并不需要太久远的数据,想着直接清除掉之前的数据就能得救,就喜出望外。事实并不是如此,尝试过后,发现无法删除数据。

因为数据量过大,而且基于es 的特性,长处是搜索的便捷,而删除索引内部的数据就成了短板。


进阶法

基于这样的考虑,在不动现有业务逻辑的情况下,有了一个新的解决方法就是,将现有索引设置为只读:

#开启索引只读
PUT index_name/_settings
{"index.blocks.read_only_allow_delete":true}
#开启索引块只读
PUT index_name/_settings
{"index.blocks.read_only":true}

重新构建新索引,将索引进行分片,按现有数据300个G计算,每个分片承载30-60个G的数据,需要设置9个分片。

然后通过reindexAPI进行数据迁移

POST _reindex?slices=auto&wait_for_completion=false
{"source":{"index":"source_index","dest":{"index":"dest_index"}}


现有300个G 的数据在reindex的过程中至少需要6个小时的数据迁移,无法记录新生成的数据,由于对新数据的依赖性,这种个做法是对业务有伤害性的,评估下来暂不可取。


适合法

结合上述进阶法,新建一个索引,设置6个分片,与旧索引相同的mapping。

put /new_index_name
{"setting":{   
  "number_of_shards" : 6, 
  "number_of_replicas" : 1}}

然后给新索引设置别名:

POST /_aliases
{"actions":[{"add":{"index":"new_index","alias":"new_index_alias"}}]}

给新索引创建好别名后,以后一旦索引数量上去之后可以直接再次新建索引,并给新索引取之前的别名,即可滚动持续的将业务维持下去。唯一美中不足的是需要业务方进行修改,好在绝大多数数据的写入是自己部门进行维护,少了被人掣肘的点,还是可喜可贺的。

现在只是将新索引及使用别名写入查询跑通了,为了保证思绪的完整,静待明日解救这个即将瘫痪的业务吧。


总结

在选择好技术后,一定要对其有一个预期的走势判断,否则前期没有做好基础性的建设,很快业务到达瓶颈,后人不清楚当时的业务逻辑,很难有快速应对的办法。良好的前瞻性设计,多考虑系统的可扩展性,才能体现一个工程师的价值!

大家加油!!!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3天前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
21 5
|
3天前
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
30 3
|
2月前
|
存储 API 数据库
检索服务elasticsearch索引(Index)
【8月更文挑战第23天】
49 6
|
3天前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
15 4
|
1月前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
1月前
|
JSON 自然语言处理 数据库
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
概念、ik分词器、倒排索引、索引和文档的增删改查、RestClient对索引和文档的增删改查
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
|
2月前
|
存储 监控 负载均衡
Elasticsearch 集群副本
【8月更文挑战第24天】
51 13
|
2月前
|
存储 负载均衡 监控
Elasticsearch 集群分片
【8月更文挑战第24天】
70 12
|
1月前
|
存储 搜索推荐 数据建模
Elasticsearch 的数据建模与索引设计
【9月更文第3天】Elasticsearch 是一个基于 Lucene 的搜索引擎,广泛应用于全文检索、数据分析等领域。为了确保 Elasticsearch 的高效运行,合理的数据建模和索引设计至关重要。本文将探讨如何为不同的应用场景设计高效的索引结构,并分享一些数据建模的最佳实践。
73 2
|
2月前
|
存储 搜索推荐 API
探究:Elasticsearch 文档的 _id 是 Lucene 的 docid 吗?
【8月更文挑战第31天】在深入探索Elasticsearch(简称ES)这一强大的搜索引擎时,了解其底层存储机制——特别是与Lucene的关系,对于优化查询性能、设计高效的数据模型至关重要。其中,一个常见且容易引发误解的问题便是:Elasticsearch中文档的_id字段是否直接等同于Lucene的docid?本文将通过图文并茂的方式,详细剖析这一问题,帮助读者理解两者之间的微妙关系。
59 0