起因
偶然间发现有人提了这样一个问题:ES的每个节点是否有每个索引的完整数据?乍一眼看,这个问题还蛮简单的,但是又有点诡异,说不上是什么地方诡异。ok话不多说,我们一起来看一下。
过程
我们先看下面这个图:
从这个图我发现两个Node节点 ,5个shard分片,1个replica备份,没毛病啊,每个节点就是有完整的信息。。。。停!作为一个吊炸天(low到爆)的程序员,我怎么可以轻易下结论,我再次画了一个图:
ok,这里是3个node,3个shard,1份replica,发现了吗,这边的话每个节点并没有完整的数据,但是任意两个节点有完整的数据
即使一台机器宕机,剩下两个节点依然可以提供完整的数据,依然满足高可用。
结论
发现规律了吗?其实很简单 如果每个机器上要有完整的数据 ,需要满足 分片数*节点数的总分片数量,当然,这里的总分片数量包含了 主分片和副本分片。因此,我们得出一个公式:副本数replica =(shardNum*nodeNum-shardNum)/shardNum。当replica大于此值时,满足要求。