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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9天前
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
|
2月前
|
存储 人工智能 自然语言处理
Elasticsearch Inference API增加对阿里云AI的支持
本文将介绍如何在 Elasticsearch 中设置和使用阿里云的文本生成、重排序、稀疏向量和稠密向量服务,提升搜索相关性。
93 14
Elasticsearch Inference API增加对阿里云AI的支持
|
1月前
|
数据可视化 API 索引
ES常见Index API操作最佳实践!
【10月更文挑战第21天】
98 1
ES常见Index API操作最佳实践!
|
1月前
|
监控 API 索引
Elasticsearch集群使用 _cluster/health API
Elasticsearch集群使用 _cluster/health API
55 2
|
1月前
|
Unix API 索引
Elasticsearch集群使用 _cat/health API
Elasticsearch集群使用 _cat/health API
33 1
|
4月前
|
Java API 数据中心
百炼平台Java 集成API上传文档到数据中心并添加索引
本文主要演示阿里云百炼产品,如何通过API实现数据中心文档的上传和索引的添加。
141 3
|
6月前
|
监控 Shell API
了解asyncio高级api索引
【6月更文挑战第27天】本文是`asyncio` 高级API概览:运行异步任务如`run()`, `create_task()`;等待机制如`gather()`, `wait_for()`, `shield()`;任务管理如`current_task()`, `all_tasks()`;队列和子进程功能;同步原语包括锁、事件和信号量。示例中涉及`sleep()`, `gather()`, `wait_for()`, 子进程创建及同步异常`TimeoutError`和`CancelledError`。查阅官方文档以获取详细信息和示例代码。
57 1
了解asyncio高级api索引
|
6月前
|
人工智能 自然语言处理 搜索推荐
Elasticsearch 开放 inference API 增加了对 Azure OpenAI 嵌入的支持
【6月更文挑战第8天】Elasticsearch 推出开放 inference API,支持 Azure OpenAI 嵌入,强化搜索和数据分析能力。此更新使用户能灵活集成 AI 技术,实现智能精准搜索。Azure OpenAI 的语言理解能力优化了用户查询处理,提升搜索相关性。示例代码显示了如何结合两者处理查询。该创新提升数据检索效率,适用于智能客服和推荐系统,但也带来数据安全和模型准确性等挑战。这标志着搜索和数据分析领域的智能化新阶段,期待更多创新应用。未来,我们需要持续探索和完善,以发挥技术的最大潜力。
50 3
|
6月前
|
存储 缓存 Java
掌握Elasticsearch集群参数查询API
掌握Elasticsearch集群参数查询API
|
7月前
|
运维 架构师 搜索推荐
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
98 4

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版