缩减索引 API
编辑缩减索引 API编辑
将现有索引缩减为具有较少主分片的新索引。
response = client.indices.shrink( index: 'my-index-000001', target: 'shrunk-my-index-000001' ) puts response
POST /my-index-000001/_shrink/shrunk-my-index-000001
先决条件编辑
为了使分片分配更容易,我们建议您还删除索引的副本分片。您可以在缩减操作中重新添加副本分片。
您可以使用以下 更新索引设置 API 请求删除索引的副本分片,并将索引的剩余分片重新分配到同一节点。
PUT /my_source_index/_settings { "settings": { "index.number_of_replicas": 0, "index.routing.allocation.require._name": "shrink_node_name" } }
删除索引的副本分片。 |
|
将索引的分片重新分配到 |
重新分配源索引可能需要一段时间。可以使用 _cat recovery
API 跟踪进度,或者可以使用 cluster health
API 等待所有分片重新分配,方法是使用 wait_for_no_relocating_shards
参数。
然后,您可以使用以下请求使用 添加索引块 API 使索引变为只读
PUT /my_source_index/_block/write
描述编辑
缩减索引 API 允许您将现有索引缩减为具有较少主分片的新索引。目标索引中请求的主分片数必须是源索引中分片数的因数。例如,具有 8
个主分片的索引可以缩减为 4
、2
或 1
个主分片,或者具有 15
个主分片的索引可以缩减为 5
、3
或 1
个主分片。如果索引中的分片数是素数,则它只能缩减为单个主分片。在缩减之前,索引中每个分片(主分片或副本分片)的副本必须存在于同一节点上。
数据流上的当前写入索引无法缩减。为了缩减当前写入索引,必须首先将数据流 回滚,以便创建一个新的写入索引,然后可以缩减先前的写入索引。
缩减的工作原理编辑
缩减操作
- 创建一个新的目标索引,其定义与源索引相同,但具有更少的主分片。
- 将源索引中的段硬链接到目标索引。(如果文件系统不支持硬链接,则所有段都将复制到新索引中,这将是一个耗时得多的过程。此外,如果使用多个数据路径,则如果不同数据路径上的分片不在同一磁盘上,则需要完全复制段文件,因为硬链接无法跨磁盘工作)
- 恢复目标索引,就好像它是一个刚刚重新打开的关闭索引一样。将分片恢复到 索引设置
.routing.allocation.initial_recovery._id
。
缩减索引编辑
要将 my_source_index
缩减为名为 my_target_index
的新索引,请发出以下请求
response = client.indices.shrink( index: 'my_source_index', target: 'my_target_index', body: { settings: { 'index.routing.allocation.require._name' => nil, 'index.blocks.write' => nil } } ) puts response
POST /my_source_index/_shrink/my_target_index { "settings": { "index.routing.allocation.require._name": null, "index.blocks.write": null } }
上述请求在目标索引已添加到集群状态后立即返回,它不会等待缩减操作开始。
索引只能在满足以下要求的情况下缩减
- 目标索引必须不存在。
- 源索引必须具有比目标索引更多的主分片。
- 目标索引中的主分片数必须是源索引中主分片数的因数。源索引必须具有比目标索引更多的主分片。
- 索引中包含的文档总数(跨所有分片)不能超过
2,147,483,519
个,这些分片将缩减为目标索引上的单个分片,因为这是单个分片可以容纳的最大文档数。 - 处理缩减过程的节点必须有足够的可用磁盘空间来容纳现有索引的第二个副本。
_shrink
API 类似于 create index
API,并接受 settings
和 aliases
参数以用于目标索引
response = client.indices.shrink( index: 'my_source_index', target: 'my_target_index', body: { settings: { 'index.number_of_replicas' => 1, 'index.number_of_shards' => 1, 'index.codec' => 'best_compression' }, aliases: { my_search_indices: {} } } ) puts response
POST /my_source_index/_shrink/my_target_index { "settings": { "index.number_of_replicas": 1, "index.number_of_shards": 1, "index.codec": "best_compression" }, "aliases": { "my_search_indices": {} } }
目标索引中的分片数。这必须是源索引中分片数的因数。 |
|
最佳压缩只有在对索引进行新的写入时才会生效,例如,当 强制合并 分片到单个段时。 |
映射不能在 _shrink
请求中指定。
监控缩减过程编辑
可以使用 _cat recovery
API 监控缩减过程,或者可以使用 cluster health
API 等待所有主分片分配,方法是将 wait_for_status
参数设置为 yellow
。
_shrink
API 在目标索引已添加到集群状态后立即返回,此时尚未分配任何分片。此时,所有分片都处于 unassigned
状态。如果由于任何原因,目标索引无法在缩减节点上分配,则其主分片将保持 unassigned
状态,直到它可以在该节点上分配。
主分片分配后,它将变为 initializing
状态,缩减过程开始。缩减操作完成后,分片将变为 active
状态。此时,Elasticsearch 将尝试分配任何副本,并可能决定将主分片重新分配到另一个节点。
路径参数编辑
-
<index>
- (必需,字符串) 要缩减的源索引的名称。
-
<target-index>
-
(必需,字符串) 要创建的目标索引的名称。
索引名称必须满足以下条件
- 仅限小写
- 不能包含
\
、/
、*
、?
、"
、<
、>
、|
、` `(空格字符)、,
、#
- 7.0 之前的索引可能包含冒号 (
:
),但这已弃用,在 7.0+ 中将不再支持 - 不能以
-
、_
、+
开头 - 不能是
.
或..
- 不能超过 255 个字节(注意是字节,因此多字节字符将更快地达到 255 个字节的限制)
- 以
.
开头的名称已弃用,但 隐藏索引 和插件管理的内部索引除外
查询参数编辑
请求体编辑
-
别名
-
(可选,对象的对象) 结果索引的别名。
aliases
对象的属性-
<别名>
-
(必需,对象) 键是别名名称。索引别名名称支持 日期数学。
对象主体包含别名的选项。支持空对象。
<别名>
的属性-
过滤器
- (可选,查询 DSL 对象) 用于限制别名可以访问的文档的查询。
-
索引路由
- (可选,字符串) 用于将索引操作路由到特定分片的 value。如果指定,这将覆盖索引操作的
routing
value。 -
is_hidden
- (可选,布尔值) 如果为
true
,则别名是 隐藏的。默认为false
。别名的所有索引都必须具有相同的is_hidden
value。 -
is_write_index
- (可选,布尔值) 如果为
true
,则索引是别名的 写入索引。默认为false
。 -
路由
- (可选,字符串) 用于将索引和搜索操作路由到特定分片的 value。
-
搜索路由
- (可选,字符串) 用于将搜索操作路由到特定分片的 value。如果指定,这将覆盖搜索操作的
routing
value。
-
-
-
设置
- (可选,索引设置对象) 目标索引的配置选项。请参阅 索引设置。
-
max_primary_shard_size
- (可选,字节大小单位) 目标索引的最大主分片大小。用于查找目标索引的最佳分片数量。当设置此参数时,目标索引中每个分片的存储空间不会大于参数。目标索引的分片数量仍然是源索引分片数量的倍数,但如果参数小于源索引中的单个分片大小,则目标索引的分片数量将等于源索引的分片数量。例如,当此参数设置为 50gb 时,如果源索引有 60 个主分片,总计 100gb,则目标索引将有 2 个主分片,每个分片大小为 50gb;如果源索引有 60 个主分片,总计 1000gb,则目标索引将有 20 个主分片;如果源索引有 60 个主分片,总计 4000gb,则目标索引仍然有 60 个主分片。此参数与
settings
中的number_of_shards
冲突,只能设置其中一个。