Elasticsearch Shrink Index 缩小索引

1.缩小索引是指将原索引分片数缩小到一定数量。但缩小的数量必须为原数量的因子(即原分片数量是新分片倍数),例如8个分片可以缩小到4、2、1个分片。如果原分片数量为素数则只能缩小到一个分片。在缩小开始时,每个分片的复制都必须在同一节点(node)存在。

2.过程如下:

  • 首先,以相同配置创建目标索引,但是主分片数量减少。
  • 然后硬链接( hard-linking ) 各部分自原索引到目标索引。(如果系统不支持硬链接,那么索引的所有部分都将复制迁移到新索引,将会花费大量时间)
  • 最终,将会恢复目标索引,因为目标索引刚被重新打开就会被关闭

3.为了缩小索引,索引必须被标记为只读,所有分片都会复制到一个相同的节点并且节点健康为绿色。

这两个条件可以通过下列请求实现:

PUT /my_source_index/_settings
{
  "settings": {
    "index.routing.allocation.require._name": "shrink_node_name", 
    "index.blocks.write": true 
  }
}

4.从原索引迁移将会花费一定时间。进度信息可以在所有分片都迁移完成前通过 _cat recoveryAPI  或者  cluster health API 使用 wait_for_no_relocating_shards 参数获得。

5.缩小索引 my_source_index 到 新的索引 my_target_index ,可以用下列请求:

POST my_source_index/_shrink/my_target_index

6.索引缩小的必要条件

  • 目标索引存在
  • 原索引主分片数量比目标索引多
  • 原索引主分片数量是目标索引倍数
  • 索引中的所有文档在目标索引将会被缩小到一个分片的数量不会超过 2,147,483,519 ,因为这是一个分片的承受的最大文档数量。
  • 执行缩小进程的节点必须要有足够的空闲磁盘空间满足原索引的分片能够全部复制迁徙到该节点。

7.缩小索引API和创建索引 (create index) API 相似,并且对于目标索引接受 settings 和 aliases 参数

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": {}
  }
}

8.监控

缩小进度可以被 _cat recovery API 或者 cluster health API 所监控。通过设置 wait_for_status 为 yellow ,可以等到所有的主分片都已经分配。

缩小API会在目标索引被创建时马上返回,这发生在所有分片被分配之前。这点说明这时所有分片都处于 unassigned 状态,如果出于任何原因目标索引分片无法分配到执行缩小的节点上,那么主分片状态会一直停留在 unassigned ,直到分片被分配。

一旦主节点分配成功,会转化状态会 initializing ,缩小进程就开始执行。当缩小操作结束的时候,这些分片会被激活。在这之后,Elasticsearch将试图分配副本,甚至可能决定主分片迁至另一个节点。

例如,当没有碎片从一个节点传输到另一个节点时,集群的恢复状态可能是这样的:

GET _cat/recovery?v
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
twitter 0     13ms store done  n/a         n/a         127.0.0.1   node-0      n/a        n/a      0     0               100%          13          0     0               100%          9928        0            0                      100.0%

通过增加索引的副本数量并让另一个节点在线承载副本,我们可以看到实时碎片恢复是什么样子的。

GET _cat/recovery?v&h=i,s,t,ty,st,shost,thost,f,fp,b,bp

i       s t      ty   st    shost       thost       f     fp      b bp
twitter 0 1252ms peer done  192.168.1.1 192.168.1.2 0     100.0%  0 100.0%

最后,让我们看看快照恢复是什么样子的。假设我之前备份了索引,那么我可以使用快照和还原API恢复索引。

GET _cat/recovery?v&h=i,s,t,ty,st,rep,snap,f,fp,b,bp

i       s t      ty       st    rep     snap   f  fp   b     bp
twitter 0 1978ms snapshot done  twitter snap_1 79 8.0% 12086 9.0%

9.因为缩小操作会创建新的索引,所以 wait for active shards 设置依然有效。

 

参考资料:

https://www.elastic.co/guide/en/elasticsearch/reference/6.2/indices-shrink-index.html#indices-shrink-index

http://cwiki.apachecn.org/pages/viewpage.action?pageId=4882799

原文地址:https://www.cnblogs.com/libin2015/p/10654972.html