Shard
为了适应数据量的增长,我们逐渐从单机演变到了集群,而分片可以理解为集群下的一个概念,可以想象一下,如果此时有一个场景,需要让你存储很多的数据到集群当中,你会怎么去设计它来保证一个集群本身的HA,那我们就可以引入分片的概念,通过将数据进行分而治之的处理,然后根据一定的算法保存到各个节点之下,这样既保证了性能又确保了所有的分片不会保存在一个节点下,并且满足了高可用的特性。在ES中shard的作用其实就是分割巨大的索引,让数据根据分片分配规则下发到集群下的各个节点,满足提高效率,让读写可以并行。
Primary Shard
字面意思也就是我们的主分片,当ES想要查询数据的时候就会路由到主分片,然后由各个主节点的主分片进行查询,召回搜索结果。当我们写入的时候,也会优先写入primary shard,再去写入副本分片,至于是否马上回调成功,那就要看具体的ES配置了,可以选择副本写入后再回调写入成功,或者是在主分片写入之后马上回调成功。
Replica Shard
字面意思也就是我们的副分片,用古人的一句老话来引用就是鸡蛋不要放在一个篮子里,通过replica shard的效果来对集群下的主分片数据进行备份操作,在高并发的情况下,也能够参与查询,减少主分片召回失败的机率。
Relation
索引和分片的关系图
一个索引下根据ES的版本不同,默认的主副分片数也不同,我们也可以通过官方文档中查看默认分片数了解或者设置索引创建模板或者设置单个索引来改变初始化的分片数。但在本文中我们需要明确索引和分片的关系.我们都知道ES的底层是Lucene,但是很少有人知道其实每一个分片就是一个独立的lucene搜索引擎,而lucene又是由很多的segement组成的,而segement是在写入的时候合并出来的,ES在每次写入执行refresh的时候都会生成一个新的分段,而segement是由Term组合而成的,这个Term可以理解为最初的词经过分词器以及一系列加工处理后的产物。