开发环境下遇到了这个问题:
一个shard的主/副总数量大于node数量导致部分shard未分配,进而节点报黄
最终通过减少replicas数量解决了问题
PUT index_name/_settings
{
"number_of_replicas":x
}
通过这次排查也理清了es的一些基础概念,下面以数据库作对比,会更容易理解
-
node
节点,等同于mysql实例,不同的是,es天然支持分布式,多个node组成一个集群对外提供服务 -
index
索引,等同于table 有固定的字段,每个字段都有对应的类型 -
shard
分片,等同于分表, 一个shard存储一部分数据 -
replicas
分片副本,等同于复制表
假设我们有四个节点 NodeA,NodeB,NodeC,NodeD,其中NodeA为master
现有有一个index my_index,有如下设置
{
"number_of_shards": "2",
"number_of_replicas": "3"
}
my_index分片数为2,它们的编号为0,1,每个分片又有3个副本.以分片0为例,它共有4份
(1个主分片,3个复制分片),那么一个合理的分配如下图所示
以笔者遇到的问题为例,如果这里设置了"number_of_replicas": "4"
,那么一个分片共有5
份,但是只有4
个节点,es主节点不会将主分片分配给与其副本相同的节点,也不会将同一分片的两个副本分配给同一个节点
,那么肯定会有一个副本分片就不会分配给任何节点也就导致了Unassigned Replicas.
未分配分片问题: https://fashengba.com/post/how-to-resolve-unassigned-shards-in-elasticsearch.html
基础概念介绍: https://mp.weixin.qq.com/s/GMnQjIVPj98ygvl3eQFWFA
es的更新同步的实现: https://www.elastic.co/guide/cn/elasticsearch/guide/current/optimistic-concurrency-control.html