博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【重新分配分片】Elasticsearch通过reroute api重新分配分片
阅读量:7240 次
发布时间:2019-06-29

本文共 2750 字,大约阅读时间需要 9 分钟。

elasticsearch可以通过reroute api来手动进行索引分片的分配。

不过要想完全手动,必须先把cluster.routing.allocation.disable_allocation参数设置为true,禁止es进行自动索引分片分配,否则你从一节点把分片移到另外一个节点,那么另外一个节点的一个分片又会移到那个节点。数据量很少的时候,可能影响不大,但是如果数据量很大,这个参数必须要设置,因为如果不设置,即便你不手动迁移分片,在我们重启机群的时候,也会产生分片的迁移,导致大量资源被占用,重启变慢.
 
一共有三种操作,分别为:移动(move),取消(cancel)和分配(allocate)。下面分别介绍这三种情况:
移动(move)
把分片从一节点移动到另一个节点。可以指定索引名和分片号。
取消(cancel)
取消分配一个分片。可以指定索引名和分片号。node参数可以指定在那个节点取消正在分配的分片。allow_primary参数支持取消分配主分片。
分配(allocate)
分配一个未分配的分片到指定节点。可以指定索引名和分片号。node参数指定分配到那个节点。allow_primary参数可以强制分配主分片,不过这样可能导致数据丢失。我一般用来清空某个未分配分片的数据的时候才设置这个参数

 

集群索引中可能由多个分片构成,并且每个分片可以拥有多个副本,将一个单独的索引分为多个分片,可以处理不能在单一服务器上运行的

大型索引.
由于每个分片有多个副本,通过副本分配到多个服务器,可以提高查询的负载能力.
为了进行分片和副本操作,需要确定将这些分片和副本放到集群节点的哪个位置,需要确定把每个分片和副本分配到哪台服务器/节点上.

1.索引创建&指定节点参数:

$curl -XPOST ''
$curl -XPUT '' -d '{
"index.routing.allocation.include.zone":"ali-hk-ops-elk1"
}'
将索引指定存放在elk1的节点上

$curl -XPUT '' -d '{

"index.routing.allocation.include._ip":"ip_addr1,ip_addr2"
}'
根据ip地址指定索引的分配节点

2.排除索引分配的节点:

$curl -XPOST ''
$curl -XPUT '' -d '{
"index.routing.allocation.exclude.zone":"ali-hk-ops-elk2"
}'

$curl -XPUT '' -d '{

"index.routing.allocation.exclude._ip":"ip_addr1,ip_addr2"
}'
根据ip地址排除索引分配的节点

3.每个节点上分片和副本数量的控制:

对一个索引指定每个节点上的最大分片数量:
$curl -XPUT '' -d '{
"index.routing.allocation.total_shards_per_node":1
}'

如果配置不当,导致主分片无法分配的话,集群就会处于red状态.

4.手动移动分片和副本:

移动分片:
$curl -XPOST '' -d '{
"commands":[{
"move":{
"index":"filebeat-ali-hk-fd-tss1",
"shard":1,
"from_node":"ali-hk-ops-elk1",
"to_node":"ali-hk-ops-elk2"
}
}]
}'

取消分片:

$curl -XPOST '' -d '{
"commands":[{
"cancel":{
"index":"filebeat-ali-hk-fd-tss1",
"shard":1,
"node":"ali-hk-ops-elk1"
}
}]
}'

分配分片(用来分配未分配状态的分片,会导致数据丢失):

$curl -XPOST '' -d '{
"commands":[{
"allocate":{
"index":"filebeat-ali-hk-fd-tss1",
"shard":1,
"node":"ali-hk-ops-elk1",

allow_primary" : true   (允许该分片做主分片)

 

}

}]
}'

将某个未分配的索引手动分配到某个节点上.

$curl -XPOST '' -d '{

"commands":[
{
"move":{
"index":"filebeat-ali-hk-fd-tss1",
"shard":1,
"from_node":"ali-hk-ops-elk1",
"to_node":"ali-hk-ops-elk2"
}
},
{
"cancel":{
"index":"filebeat-ali-hk-fd-tss1",
"shard":1,
"node":"ali-hk-ops-elk1"
}
},
{
"allocate":{
"index":"filebeat-ali-hk-fd-tss1",
"shard":1,
"node":"ali-hk-ops-elk1"
}
}]
}'

5.关于unassigned shards的问题解决:

1)出现大量的unassigned shards

2)集群的状态为:red

集群状态:red-->存在不可用的主分片

A:fix unassigned shards:

查看所有分片的状态:
$curl -XGET ''
查询所有unassigned的分片:
$curl -XGET '' | grep UNASSIGNED

B:查询得到master节点的唯一标识:

$curl -XGET ''

C:执行route对unassigned的索引进行手动分片:

for index in $(curl -XGET '' | grep UNASSIGNED |awk '{print $1}'|sort |uniq):do
for shards in $(curl -XGET '' | grep UNASSIGNED | grep $index | awk '{print $2}'|sort|uniq):do
curl XPOST ' '{
"commands":[
{
"allocate":{
"index":$index,
"shards":$shards,
"node":"ali-k-ops-elk1",
"allow_primary":"true"
}
}
]
}'
done
done

转载地址:http://qrybm.baihongyu.com/

你可能感兴趣的文章
JDK源码阅读--HashMap
查看>>
Adroid 展开收起效果实现
查看>>
PHP:第五章——字符串转换与比较
查看>>
Thinkphp+Uploadify
查看>>
菜鸟学习WCF笔记-契约(Contract)
查看>>
注册登录系统的基本逻辑与结构——ASP.NET(C#)源代码
查看>>
AC日记——元素查找 codevs 1230
查看>>
import包和模块_2
查看>>
开始使用PHPUnit单元测试
查看>>
Go语言获取命令行参数
查看>>
C#操作Office实例
查看>>
线程,进程 ,队列 基本用法总结
查看>>
每周总结
查看>>
分布类的使用
查看>>
单词倒排
查看>>
洛谷 P2709 小B的询问
查看>>
Future模式
查看>>
hibernate 缓存问题
查看>>
5.2 Array类型介绍
查看>>
0阶 无符号指数哥伦布编码
查看>>