Elasticsearch拆分索引知多少

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch拆分索引知多少

原文链接:indices-split-index API

环境

  • Elasticsearch 7.13
  • Mac 10.14.6

概述

拆分索引API允许将现有索引拆分为新索引,其中每个原始的主分片被拆分为新索引中的两个或者多个主分片

索引可以拆分的次数(以及每个原始的主分片可以拆分成的分片数量)由index.number_of_routing_shards设置。路由分片的数量指定使用的hash空间,该空间内部使用一致性hash在分片之间分发文档。例如,一个5个分片的索引,其中number_of_routing_shards设置为30(5 x 2 x 3),可以按照2或者3的因子来拆分,换句话说可以按照如下方式:

  • 5->10->30(split by 2, then by 3)
  • 5->15->30(split by 3, then by 2)
  • 5->30(split by 6)

index.number_of_routing_shards 是静态索引设置时的选项,并且只能在创建索引时,或者索引关闭时设置

拆分操作流程

  1. 首先创建一个与源索引定义相同的目标索引,但是这个新索引有更多的主分片数量
  2. 将数据段从源索引硬链接到目标索引(如果文件系统不支持硬链接,那就将所有的数据段复制到新索引,但是这个操作会消耗更多的时间)
  3. 根据文档的版本删除历史版本中的数据后再次hash所有的文档,以便删除属于不同分片的文档
  4. 恢复目标索引

为什么Elasticsearch不支持增量重新分片

首先我们从n个分片到n+1个分片,增量重新分片确实是许多的键值存储支持的功能,添加一个新的分片并且仅将新的数据添加到新分片这不是一个可以参考的选项,为什么呢,首先这可能是一个索引的瓶颈,因为我们通过获取、删除和更新一个文档时都是需要_id,这样的话我们通过_id找到文档属于哪个分片就变的相当复杂了,也就是说我们需要一个不同的hash方案来重新平衡已经存在的数据

大多数的键值存储系统最有效的还是使用一致性hash算法,当分片数量从N增加到N+1时,一致性hash算法只需要重新hash 1/N的的数据,然后Elasticsearch的存储是面对Lucene索引的,这是一个面向搜索的数据的结构,是Lucene索引中重要的一部分,即使只有5%的文档,删除它们或者在另一个索引上索引它们的成本通常比键值存储高的多,当按照上面我们所说的通过乘法因子的方式来增加分片数量时,这个成本是可以接受的,这允许Elasticsearch执行本地的索引拆分,反过来也就是可以执行索引级别的拆分,而不是重新索引需要移动的文档以及使用硬连接的方式来进行有效的文件复制

对于一致性hash算法不了解的小伙伴可以看下这篇文章,非常清楚的描述了什么是一致性hash,以及为什么选用一致性hash而不是普通hash算法

一文理解一致性哈希算法

如果仅仅是追加数据的话,可以通过创建一个新索引来向其新索引写入数据,同时创建一个别名,这个别名同时包含旧索引和新索引,假设新索引和旧索引分别具有M和N个分片,这与一个具有M+N个分片的搜索相比这是没有差别的

监控拆分的过程

  • /_cat/recovery/
  • /_cat/recovery
  • /_cluster/health/

前提条件

  • 如果elasticseach的安全功能已经启用,则必须具有索引的管理索引权限
  • 在索引拆分前:
  • 这个要拆分的索引必须时只读的
  • 所在集群的状态必须时green
    设置为只读可以使用下面语句
curl -X PUT "localhost:9200/my_source_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "index.blocks.write": true 
  }
}
'
  • 当前写入索引的数据流不能被拆分,如果要拆分当前写入索引,这个数据流必须先进行反转以便创建一个新的写入索引,然后以前的写入索引就可以被拆分

测试步骤

  • 创建索引
curl -XPUT "localhost:9200/test_split_index" -H 'Content-Type: application/json' -d '
{
  "settings": {
        "index.number_of_shards" : 1,
        "index.number_of_routing_shards" : 10,
        "index.number_of_replicas": 2
    }
}
'
  • 删除索引(根据自己需求使用)
curl -XDELETE "localhost:9200/test_split_index"
  • 插入数据
curl -XPOST "localhost:9200/test_split_index/_bulk?pretty" -H 'Content-Type: application/json' -d '
{ "index": {}}
{  "user":"user1",  "age":"18"}
{ "index": {}}
{  "user":"user2",  "age":"19"}
{ "index": {}}
{  "user":"user3",  "age":"20"}
{ "index": {}}
{  "user":"user4",  "age":"21"}
{ "index": {}}
{  "user":"user5",  "age":"22"}
'
  • 关闭索引
curl -XPOST "localhost:9200/test_split_index/_close"
  • 防止切分数据时有数据写入
curl -XPUT "localhost:9200/test_split_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.blocks.write": true
}
}
'
  • 打开索引
curl -XPOST "localhost:9200/test_split_index/_open"
  • 拆分索引
    test_split_index为要准备拆分的索引
    split_index_target为要拆分的新的索引名称
curl -XPOST "localhost:9200/test_split_index/_split/split_index_target?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "index.number_of_shards": 10
  }
}
'
  • 查看执行过程
curl http://localhost:9200/_cat/recovery?v
curl http://localhost:9200/_cluster/health/split_index_target

遇到的问题

  • 单机启动的集群环境,3个节点, 但是因为磁盘空间满了,造成副本分片无法分配,此时可以通过以下方式进行解决
  • 删除硬盘垃圾数据
  • 修改es的磁盘利用率设置,默认是85%,具体怎么修改查看官网,地址如下
https://www.elastic.co/guide/en/elasticsearch/reference/7.13/modules-cluster.html#disk-based-shard-allocation


相关实践学习
使用阿里云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天前
|
数据采集 存储 自然语言处理
elasticsearch 跨索引联合多条件查询
elasticsearch 跨索引联合多条件查询
|
2天前
|
API 索引
ElasticSearch索引模板
ElasticSearch索引模板
157 1
|
2天前
|
JSON 监控 数据管理
【Elasticsearch专栏 12】深入探索:Elasticsearch使用索引生命周期管理(ILM)自动化删除旧数据
Elasticsearch的ILM功能允许用户定义策略,自动管理索引从创建到删除的生命周期。用户可以设置策略,根据索引年龄或大小自动删除旧数据,节省存储空间。通过应用ILM策略于索引模板,新索引将遵循预定义的生命周期。用户还可以监控ILM状态,确保策略按预期执行。使用ILM,用户可以高效地管理数据,确保旧数据及时删除,同时保持数据完整性和安全性。
|
2天前
|
索引
elasticsearch 创建索引模版template
elasticsearch 创建索引模版template
|
2天前
|
存储 自然语言处理 搜索推荐
【Elasticsearch专栏 01】深入探索:Elasticsearch的正向索引和倒排索引是什么?
正向索引根据文档ID直接查找文档内容,适用于精确匹配场景;而倒排索引则基于文档内容构建,通过关键词快速定位相关文档,适用于全文搜索,显著提高查询效率,是搜索引擎的核心技术。
|
2天前
|
运维 安全 API
Elasticsearch 悬挂索引解析与管理指南
Elasticsearch 悬挂索引解析与管理指南
23 7
|
2天前
|
安全 API 数据安全/隐私保护
Elasticsearch 通过索引阻塞实现数据保护深入解析
Elasticsearch 通过索引阻塞实现数据保护深入解析
22 4
|
2天前
|
存储 数据处理 索引
Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程
Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程
33 6
|
2天前
|
存储 数据库 索引
Elasticsearch ILM 索引生命周期管理常见坑及避坑指南
Elasticsearch ILM 索引生命周期管理常见坑及避坑指南
12 0

热门文章

最新文章