引子
我们在创建索引库的时候,要设计分片数量和副本数量,分片和副本是分布式搜索引擎的核心。
如何指定分片进行增删改查操作?
每个分片存储多少数据合适?
我们的文档存在哪个分片中?
为什么不可以修改主分片数量?
一次完整的ES查询流程怎么流的?
节点数量
节点数量很好说,你要是只有两三个服务器,还想啥自行车呢。
当然节点的数量还是有约束的。
一般情况下:
集群所有索引的副本最大值+1 <= 集群节点数量 <= 分片数量
这个公式举个例子,
你有十个节点,这十个节点中最大索引副本数量只能是9个,这九个副本在另外九个节点中,一个节点存一个,满足了master分配分片的原则。并且节点数量小于等于分片数量。
master分配分片原则参考链接:
一次完整的ES查询流程:
主分片数量
分片数量取决于你的集群规模以及你想达到的并发程度。
分片的大小一般在50GB以内。
两个问题:
为什么分片数量不可以实时修改?
我们的文档到底存放在哪个分片中?
解决:
文档存于分片不是随机存的,随机存的话,以后怎么查找啊,是有一定公式的。
索引数据的分片规则
shard_num = hash(_routing) % num_primary_shards
shard_num: 分片位置,哪个分片。
_routing: id字段或者parent字段。
num_primary_shards: 主分片数量。
可以看得出来,你的文档存在哪个分片跟主分片的数量有关系,如果你想改主分片数量就改主分片数量,那你的文档怎么说,你还能找到它吗。
副本分片数量
通俗的话来说:
一个副本可以容忍单点故障
两个副本可以容忍两点故障
看起来仿佛副本数量越多,容错率就越高,需要注意一个东西,你的服务器是有容量的,就好比数据库中的索引一样,都知道索引是个好东西,但是它非常吃内存。
一般情况下,副本数量取决于你想实现多高的数据可用性以及你有多少可用存储空间。
两个注意事项
1、相同分片的副本不会放在同一个节点。
比如这个分片有两个副本,这两个副本不可以在同一个节点。
2、ES禁止同一个分片的主分片和副本分片在同一个节点。
比如单节点ES,不允许有副本分片,有副本分片,则集群不健康。
总结一下
这三者之间是有关系的,三足鼎立,互相限制。
没有绝对的通用分配数量之说,根据自己业务进行压力测试,在不断的实践中找到合适的数量设计。