【Elastic Engineering】Elasticsearch:Split index API - 把一个大的索引分拆成更多分片

简介: Elasticsearch:Split index API - 把一个大的索引分拆成更多分片

作者:刘晓国


在我们实际使用 Elasticsearch 时,随着时间的推移,我们会发现有扩容的必要。这个可能由于我们在刚开始创建项目认识不足。我们需要更多的 primary shards,这样可以提高 ingest 的速度。那么我们有什么办法来把之前的一个大的索引变成更多的小的索引呢?这个答案就是 split index API。它的基本用法如下:

POST /my-index-000001/_split/split-my-index-000001
{
  "settings": {
    "index.number_of_shards": 2
  }
}

它有两种形式的接口:

POST /<index>/_split/<target-index>
PUT /<index>/_split/<target-index>

在我们操作之前,我们有如下的前提条件:


索引必须是 read-only

cluster health 必须是绿色的


我们可以通过如下的方法来把一个索引变为 read-only:

PUT /my_source_index/_settings
{
  "settings": {
    "index.blocks.write": true 
  }
}

拆分索引 API 允许你将现有索引拆分为新索引,在该索引中,每个原始主 shard 在新索引中均拆分为两个或多个主 shard。


索引可拆分的次数(以及每个原始碎片可拆分为的碎片数量)由 index.number_of_routing_shards 设置确定。 路由分片的数量指定哈希空间,该空间在内部用于以一致的哈希在各个 shard 之间分发文档。 例如,将 number_of_routing_shards 设置为30(5 x 2 x 3)的5个 shard 索引可以拆分为 2 或 3。换句话说,可以如下拆分:


5→10→30(拆分依次为2和3)

5→15→30(拆分依次为3和2)

5→30(拆分6)


动手实践


准备数据


在今天的教程中,我们将使用 Kibana 自带的索引来进行展示。打开 Kibana 界面:

image.png

image.png

点击 Add data:

image.png

这样我们的样本数据就导入进 Elasticsearch 了。通过上面的操作,我们在 Elasticsearch 中将生成一个叫做 kibana_sample_data_flights 的索引。


使用 split index API 来拆分索引


按照要求,我们首先把索引变为只读:

PUT kibana_sample_data_logs/_settings
{
  "blocks.write": true
}

在 Kibana  中运行上面的指令。我们可以通过如下的指令来进行查询:

GET kibana_sample_data_logs/_settings

上面的指令显示:

{
  "kibana_sample_data_logs" : {
    "settings" : {
      "index" : {
        "number_of_shards" : "1",
        "auto_expand_replicas" : "0-1",
        "blocks" : {
          "write" : "true"
        },
        "provided_name" : "kibana_sample_data_logs",
        "creation_date" : "1602127165075",
        "number_of_replicas" : "0",
        "uuid" : "oyJwGhQATvCil2rWAC6nqg",
        "version" : {
          "created" : "7080099"
        }
      }
    }
  }
}

上面显示 blocks.write 为 true,也即我们不可以再向这个索引写入任何的数据了。从上面我们也可以看出来,我们的当前的索引只有一个 primary shard。这个可以从 number_of_shards 为 1 可以看出来。


我们在 Kibana 中打入如下的指令:

POST kibana_sample_data_logs/_split/kibana_sample_data_logs_split
{
  "settings": {
    "index.number_of_shards": 2
  }
}

在上面,我们把 kibana_sample_data_logs 拆分为 2 个㊗️ shards,并且我们的目标索引的名字为:kibana_sample_data_logs_split。上面的命令的返回值为:

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "kibana_sample_data_logs_split"
}

我们可以通过如下的命令来进行查看过程:

GET _cat/recovery/kibana_sample_data_logs_split

上面显示的结果为:

index                         shard time  type         stage source_host source_node target_host target_node repository snapshot files files_recovered files_percent files_total bytes bytes_recovered bytes_percent bytes_total translog_ops translog_ops_recovered translog_ops_percent
kibana_sample_data_logs_split 0     484ms local_shards done  n/a         n/a         127.0.0.1   node1       n/a        n/a      0     0               100.0%        15          0     0               100.0%        11573815    0            0                      100.0%
kibana_sample_data_logs_split 1     503ms local_shards done  n/a         n/a         127.0.0.1   node1       n/a        n/a      0     0               100.0%        15          0     0               100.0%        11573815    0            0                      100.0%

上面显示100%已经完成。


我们可以通过如下的方法来进行比较索引的数量:

GET kibana_sample_data_logs/_count

它显示:

{
  "count" : 14074,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  }
}

我们用如下的方法来查看 kibana_sample_data_logs_split 的设置:

GET kibana_sample_data_logs_split/_settings
{
  "kibana_sample_data_logs_split" : {
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "initial_recovery" : {
              "_id" : null
            }
          }
        },
        "number_of_shards" : "2",
        "routing_partition_size" : "1",
        "auto_expand_replicas" : "0-1",
        "blocks" : {
          "write" : "true"
        },
        "provided_name" : "kibana_sample_data_logs_split",
        "resize" : {
          "source" : {
            "name" : "kibana_sample_data_logs",
            "uuid" : "oyJwGhQATvCil2rWAC6nqg"
          }
        },
        "creation_date" : "1602127847864",
        "number_of_replicas" : "0",
        "uuid" : "rhs6k0P6QNudSVO1MauQZA",
        "version" : {
          "created" : "7080099",
          "upgraded" : "7080099"
        }
      }
    }
  }
}

上面显示 number_of_shards 为2,表示有2个主 shard。我们可以使用如下命令来进行查看文档的数量:

GET kibana_sample_data_logs_split/_count

上面的命令显示:

{
  "count" : 14074,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  }
}
GET _cat/shards/kibana_sample_data_logs_split?v

上面的命令显示:

index                         shard prirep state   docs store ip        node
kibana_sample_data_logs_split 1     p      STARTED 7076 4.8mb 127.0.0.1 node1
kibana_sample_data_logs_split 0     p      STARTED 6998 4.7mb 127.0.0.1 node1

我们可以看到有两个 primary shard。


如果我们想把上面的拆分的索引重新变成一个大的索引的话,那么请阅读我的另外一篇文章 “通过 shrink API 减少 shard 数量来缩小 Elasticsearch 索引”。


参考


【1】 https://github.com/dadoonet/demo-index-split-shrink-rollover


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
7月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
380 5
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
320 3
|
存储 人工智能 自然语言处理
Elasticsearch Inference API增加对阿里云AI的支持
本文将介绍如何在 Elasticsearch 中设置和使用阿里云的文本生成、重排序、稀疏向量和稠密向量服务,提升搜索相关性。
697 14
Elasticsearch Inference API增加对阿里云AI的支持
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
694 8
|
数据可视化 API 索引
ES常见Index API操作最佳实践!
【10月更文挑战第21天】
901 1
ES常见Index API操作最佳实践!
|
存储 缓存 监控
优化Elasticsearch 索引设计
优化Elasticsearch 索引设计
367 5
|
监控 API 索引
Elasticsearch集群使用 _cluster/health API
Elasticsearch集群使用 _cluster/health API
725 2
|
存储 JSON 关系型数据库
Elasticsearch 索引
【11月更文挑战第3天】
425 4
|
测试技术 API 开发工具
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
311 8

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版