分布式数据存储 shard(切片) 和 repali(副本) 的 节点数的关系。

1 , node 的 数量 应该大于等于 副本(指的是单个 shard 的 主副本+备份副本数)的 数量 ,如果 副本的数量大于 node 数量,那么 一个node 必定有2 个相同的 副本,这个多出来的副本毫无意义。(如果是为了提高效率,可以提高 切片的 个数 )

2 ,因为 副本 shard  和 主 shard  不会出现在同一个 节点上 ,那么 一 挂一个节点 最多挂掉一个 shard  的 一个副本。

3,所以要保证的 50% 的 节点挂了 数据不丢的  最低副本数数 = 节点数*50%+1

举例:如果有10 个节点 ,那么要求 副本的数量应该 小于等于 10 倍。也就是说最多9 倍的 副本。

  然后如果要求 挂点 50% 的 节点依旧正常工作,那么 副本数的最低要求就是 10*50%  +1 = 6 (去掉一个node 最多少一个副本 )

所以 副本数  是 6-10 

在考虑分片数: 分片 分片要保证 分割节点都有数据,所以 10 个 副本的时候最小分片是 1 (每个节点 都是 一份完整的数据 ,保证  50 -90 的 机子挂了 程序都还有可能是正常运行)、

        如果 是  6 个 副本,分给 10 个节点 ,保证每个节点有数据,副本数 * 分片数  应该大于 节点数 ,所以  分片数  应该 > 10/6  ,分片应该大于2 ,

         个人认为 分片数最好小于 节点数,如果分片 大于节点数,一个节点上 必然有2 个以上分片,如果2 个分片都在一个节点上,那还分片干嘛?

      所以分片的范围   2<=分片数<=10

备注: es 不允许在索引建立以后修改 切片的数量 ,因为 修改 切片的数量以后会引起 同一个 ID 的路由值的改变, 比如以前 分3 个片 ,路由值=30 , 30%3 = 0,放在 0 这个 切片上面,但是 切片变成4 的时候,30%4 = 2,这时候 查找 路由值 = 10 的 回去 2 这个 切片上找,明显找不到 呀(   默认的路由值是  hash( id ),也可以手动指定  ),所以切片数量一定要慎重

原文地址:https://www.cnblogs.com/cxygg/p/9392635.html