2.5 KiB
分片(shard)
Elasticsearch集群允许系统存储的数据量超过单机容量,实现这一目标引入分片策略shard。
在一个索引index中,数据(document)被分片处理(sharding)到多个分片上。Elasticsearch屏蔽了管理分片的复杂性,使得多个分片呈现出一个大索引的样子。
有点类似于数据库的分库分表,将一个索引里的数据分到不同的分片中。
在写入过程中,通过相应的路由手段(默认规则是分片编号=hash(_id)%总分片数)写入相应的分片。
在查询过程中,会分别查询所有分片并将结果汇总得到最终查询结果,这样就可以将非常大量的索引数据分散到不同的分片中,由于每个分片的查询都使用一个线程,这样可以有效地减小单次查询的时延。
副本(replica)
为了提升访问压力过大是单机无法处理所有请求的问题,Elasticsearch集群引入了副本策略replica。
副本策略对index中的每个分片创建冗余的副本,处理查询时可以把这些副本当做主分片来对待(primary shard),此外副本策略提供了高可用和数据安全的保障,当分片所在的机器宕机,Elasticsearch可以使用其副本进行恢复,从而避免数据丢失。
副本数量比较好选,根据你需要的可用性选择就好。另外,副本越多,写入消耗就越大(相当于写了不止一份的数据)。
副本的作用如下:
- 提高系统容错性
当分片所在的机器宕机时,Elasticsearch可以使用其副本进行恢复,从而避免数据丢失。
- 提高ES查询效率
处理查询时,ES会把副本分片和主分片公平对待,将查询请求负载均衡到副本分片和主分片。
副本分片是越多越好吗?
答案当然是 no ,原因有以下两点:
(1)多个 replica 可以提升搜索操作的吞吐量和性能,但是如果只是在相同节点数目的集群上增加更多的副本分片并不能提高性能,因为每个分片从节点上获得的资源会变少,这个时候你就需要增加更多的硬件资源来提升吞吐量。
(2)更多的副本分片数提高了数据冗余量,保证了数据的完整性,但是根据上边主副分片之间的交互原理可知,分片间的数据同步会占用一定的网络带宽,影响效率,所以索引的分片数和副本数也不是越多越好。