Elasticsearch由一些Elasticsearch进程(Node)组成集群,用来存放索引(Index)。
为了存放数据量很大的索引,Elasticsearch将Index切分成多个分片(Shard),在这些Shard里存放一个个的文档(document),通过这一批shard组成一个完整的index。
每个Shard可以设置一定数量的副本(Replica),写入的文档同步给副本Shard,副本Shard可以提供查询功能,分摊系统的读负载。
在主Shard所在Node(ES进程)挂掉后,可以提升一个副本Shard为主Shard,文档继续写在新的主Shard上,来提升系统的容灾能力。
Shard Allocation 意思是分片分配, 是一个将分片分配到节点的过程。
可能发生该操作的过程包括:
初始恢复(initial recovery)
副本分配(replica allocation)
重新平衡(rebalance)
节点的新增和删除
分片的分配操作, 是由 master 角色的节点来决定什么时候移动分片, 以及移动到哪个节点上, 以达到集群的均衡。
Allocation 触发条件:
新增或删除 index 索引
node 节点的新增或删除
执行 reroute 命令
修改 replica 副本数量
集群重启
Shard Allocation延迟机制
当某个节点由于突发原因,比如网络中断、人为操作重启等需要暂时离开集群时,集群会立刻新建副本分片以替换丢失的副本, 然后在剩余的所有节点之间进行rebalancing,这样导致在短时间内该突发节点又恢复过来后, 原先的副本就无法再使用, 集群会将刚才新建的副本分片再拷贝回到该节点上,这样就会造成不必要的资源浪费, 以及节点分片rebalancing带来的波动。
可以使用 index.unassigned.node_left.delayed_timeout 动态设置来延迟由于节点离开而导致未分配的副本分片的分配问题,该配置默认值 1m(60s)。
PUT _all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
}
## 针对单个索引
curl -XPUT 'http://xx.xx.xx.xx:9200/<INDEX_NAME>/_settings' -d '
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "2m"
}
}'
## 针对所有索引
curl -XPUT 'http://xx.xx.xx.xx:9200/_all/_settings' -d '
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "2m"
}
}'
修改成以上配置后, 如果在 5m 内,该节点可以恢复重新加入集群,则集群会自动恢复该节点的副本分片分配,恢复速度很快。
注意:
此设置不影响将副本分片升级为主分片;
此设置不影响之前未分配的副本分片;
在整个集群重新启动后, 该延迟分配不会生效;
参考
Delaying allocation when a node leaves
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/delayed-allocation.html
Elasticsearch 模块 - Shard Allocation 机制
https://www.cnblogs.com/memento/p/14494010.html
彻底解决 ES 的 unassigned shards 症状
https://www.cnblogs.com/lvzhenjiang/p/14196973.html