拆分索引
- 拆分索引的API可将现有索引拆分为新索引,每个原始的主分片在新索引中被拆分成2个或更多的主分片
- _split API 要求在创建源索引必须指定number_of_routing_shards,【7.0中删除该要求】
- 索引可被拆分的倍数(及每个原始分片可拆的分片数)由index.number_of_routing_shards决定。路由分片的数量指定内部使用的散列空间,便于使用一致散列在分片中分发文档。
- 拆分索引的工作流程
-
- 创建一个新的目标索引,定义与源索引相同,分片数比其主分片数大
-
- 将源索引连接到目标索引。
-
- 创建low level的文件后,所有的文档再次进行hash处理,以删除属于不同分片的文档。
-
- 恢复目标索引,就好像将关闭的索引重新打开
- 拆分索引的准备工作
-
- 使用路由分片因子 创建源索引
-
- 索引必须标记为只读,并且健康为绿色
index.number_of_shards 当前索引的分片数
index.number_of_routing_shards 拆分时可拆分的分片数
设为true,禁止对索引的写操作 ,但索引的元数据可正常写
- 拆分索引
-
将上面的my_source_indx索引拆分为新索引
-
一旦将目标索引添加到集群状态,上述请求将立即返回,不等拆分开始
-
索引的拆分条件
-
- 目标索引不存在
-
- 源索引的主分片数少于目标索引
-
- 源索引的主分片数必须是目标索引分片数的一个因子
-
- 处理拆分进程的节点必须具有足够的可用磁盘空间,以容纳现有索引的第二个副本
-
_split API 类似于 create index API,且接受settings和aliases参数
-
PS: copy_settings = true 将源索引中的设置复制到目标索引(不能设为false,8.0.0将删除该参数)
- 监控拆分进程
- 拆分进程可用 _cat recovery API监控,或设置cluster health API的wait_for_status 参数为yellow,等待所有主分片被分配
- 分配任何分片前,只要目标索引已加入集群状态,_split API就会返回。若无法在拆分节点上分配目标索引,则其主分片保持未分配,知道可在该节点分配
- 若主分片分配,进入状态初始化,并开始拆分过程,拆分完成后,分片变为活动状态。此时,es将尝试分配所有副本,并可能决定将主分片重定位到另外一个节点
- Wait For Active Shards
- 拆分过程会创建一个新的索引来缩小分片,因此,在创建索引时,活跃分片等待的设置也可适用于拆分索引的操作
- 示例
创建索引,当前索引的分片数为1,拆分后的分片数为8
导入数据,