分片(shard)

ES中的概念,类似于结构化数据库中分库分表的概念。每个分片保存索引的一部分数据,分配到集群的各个节点上,每个节点可以拥有 多个分片。

分片是段(segment)提交点的集合。

分片分为主分片(primary shard)和副本分片(replica shard)。

主分片(primary shard)

用于写入数据的分片,每个索引的主分片数默认为1,通过index.number_of_shards修改。

当写入数据时,通过路由来确定具体写入哪个主分片: shard = hash(routing) % number_of_primary_shards routing默认为文档的_id

由于此路由规则,索引的主分片数在创建后就不能修改。

副本分片(replica shard)

主分片的副本,可以用于处理读请求。

每个主分片有一个或多个复制分片。复制分片越多(复制分片所处的节点越多),就能调用更多的资源,处理的搜索吞吐量就越大。

当写操作在主分片上完成时,ES并发将数据并发复制到主分片的所有分片上,采用[乐观锁]进行锁控制,当所有副本分片报告成功后,主分片向客户端返回成功响应。