摘要
当创建一个索引的时候,我们经常会面对一个问题:要为索引分配多少个shard?多少个replica?对于这个问题,仍然没有明确的统一答案。
Index 需要多少个Shard?
总体上说,当我们节点数和Shard数相等时,ES集群的性能可以达到最优。即,对于一个3节点集群,我们为每个集群节点分配一个Shard,总共3个Shard。但是由于ES的不可变性的限制,系统无法对Shard进行重新拆分分配,除非重新索引这个文件集合。所以,当我们需要增加更多节点的时候,又希望Shardd能利用到增加节点带来的系统性能提升时,我们就不得不进行重新索引,由于重新索引开销巨大,这是我们不希望看到的。
如果需要重新建立索引,将会是一个巨大的开销,为了支持未来可能的水平扩展,我们会为集群分配比node数更多的shard数,也就是说每个节点会有多个Shard。
如果单个node分配多个shard,就会引入另外一些列的性能问题,我们知道对于任意一次完整的搜索,ES会分别对每个Shard进行查询,最后进行汇总。当节点数和shard数是一对一的时候,所有的查询可以并行运行。但是,对于具有多个shard的节点,如果磁盘是15000RPM或SSD,可能会相对较快,但是也会存在等待响应的问题,所以通常不推荐一个节点超过2个shard。
3节点6 shard,即每个节点2 shard,这可以使我们在未来轻松的横向扩展到6 个节点,应对许多极端的场景。
replicas
Replica也是Shard,与shard不同的是,replica只会参与读操作,同时也能提高集群的可用性。对于Replica来说,它的主要作用就是提高集群错误恢复的能力,所以replica的数目与shard数目以及node的数目相关,与shard不同的是,replica的数目可以在集群建立之后变更,代价小,所以相比shard的数目而言,没有那么重要。
网友评论