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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 自然语言处理 关系型数据库
ElasticSearch索引 和MySQL索引那个更高效实用那个更合适
ElasticSearch索引 和MySQL索引那个更高效实用那个更合适
48 0
|
2月前
|
JSON 监控 数据管理
【Elasticsearch专栏 12】深入探索:Elasticsearch使用索引生命周期管理(ILM)自动化删除旧数据
Elasticsearch的ILM功能允许用户定义策略,自动管理索引从创建到删除的生命周期。用户可以设置策略,根据索引年龄或大小自动删除旧数据,节省存储空间。通过应用ILM策略于索引模板,新索引将遵循预定义的生命周期。用户还可以监控ILM状态,确保策略按预期执行。使用ILM,用户可以高效地管理数据,确保旧数据及时删除,同时保持数据完整性和安全性。
|
4天前
|
运维 安全 API
Elasticsearch 悬挂索引解析与管理指南
Elasticsearch 悬挂索引解析与管理指南
21 7
|
4天前
|
安全 API 数据安全/隐私保护
Elasticsearch 通过索引阻塞实现数据保护深入解析
Elasticsearch 通过索引阻塞实现数据保护深入解析
19 4
|
4天前
|
存储 数据处理 索引
Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程
Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程
29 6
|
4天前
|
存储 安全 数据处理
Elasticsearch 为什么会产生文档版本冲突?如何避免?
Elasticsearch 为什么会产生文档版本冲突?如何避免?
12 0
|
4天前
|
安全 Python
Elasticsearch 删除重复文档实现方式,你知道几个?
Elasticsearch 删除重复文档实现方式,你知道几个?
9 0
|
4天前
|
存储 数据库 索引
Elasticsearch ILM 索引生命周期管理常见坑及避坑指南
Elasticsearch ILM 索引生命周期管理常见坑及避坑指南
11 0
|
16天前
|
安全 API 数据安全/隐私保护
Elasticsearch 通过索引阻塞实现数据保护深入解析
Elasticsearch 通过索引阻塞实现数据保护深入解析
17 0
|
16天前
|
安全 Java API
SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)
SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)
19 1

热门文章

最新文章