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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
10天前
|
存储 运维 搜索推荐
运维开发.索引引擎ElasticSearch.倒序索引的概念
运维开发.索引引擎ElasticSearch.倒序索引的概念
28 1
|
1月前
|
索引
Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
【7月更文挑战第2天】Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
|
5天前
|
消息中间件 监控 数据挖掘
Elasticsearch 使用误区之二——频繁更新文档
【8月更文挑战第15天】在大数据与搜索技术日益成熟的今天,Elasticsearch 作为一款分布式、RESTful 风格的搜索与数据分析引擎,凭借其强大的全文搜索能力和可扩展性,成为了众多企业和开发者的首选。然而,在使用 Elasticsearch 的过程中,一些常见的误区可能会导致性能下降或数据不一致等问题,其中“频繁更新文档”便是一个不容忽视的误区。本文将深入探讨这一误区的根源、影响及解决方案,帮助读者更好地利用 Elasticsearch。2
16 0
|
5天前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
7 0
|
5天前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
15 0
|
10天前
|
运维 安全 网络协议
运维.索引引擎ElasticSearch.记录一个小异常:received plaintext http traffic on an https channel
运维.索引引擎ElasticSearch.记录一个小异常:received plaintext http traffic on an https channel
28 0
|
1月前
|
存储 搜索推荐 数据可视化
【Elasticsearch】Elasticsearch索引创建与管理详解
【Elasticsearch】Elasticsearch索引创建与管理详解
135 10
|
22天前
|
存储 SQL 自然语言处理
Elasticsearch 索引与文档的常用操作总结二:复杂条件查询
Elasticsearch 索引与文档的常用操作总结二:复杂条件查询
38 0
|
22天前
|
JSON API 数据格式
Elasticsearch 索引与文档的常用操作总结一
Elasticsearch 索引与文档的常用操作总结一
27 0
|
1月前
|
自然语言处理 API 开发工具
Elasticsearch 重建索引 数据迁移
【7月更文挑战第1天】Elasticsearch 更改索引结构、重建索引、数据迁移操作等