ElasticSearch分布式搜索,如何理解Shards和Replicas
发布于 作者:苏南大叔 来源:程序如此灵动~
贯穿于ElasticSearch
分布式搜索的过程中,有两个基本概念Shards
和Replicas
。本文试图通过苏南大叔自己的理解,来对这两个概念进行一下通俗化的理解。和官方的说法肯定有出入,仅仅是自己的理解而已。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10
,elasticsearch@8.17.1
,kibana@8.17.1
。Shards
和Replicas
是ElasticSearch
中的两个重要概念,它们在ElasticSearch
的分布式搜索和数据管理中起着关键作用。
前文回顾
出于测试目的,测试机上面仅仅会安装一个ElasticSearch
实例。
Shards
意思是分片,至少有一个分片。Replicas
意思是副本,如果不需要副本备份的话,必然可以设置为零个副本了。
在前面的文章里面,为了测试ElasticSearch
的分布式集群特性,苏南大叔又开启了一个ElasticSearch
的从节点。从而,为本文的Shards
和Replicas
概念解释,留下了可能性。参考文章:
查看已有设置
ElasticSearch
里面的索引的概念,可以理解为普通数据库中的表。所以,ElasticSearch
装在索引里面的文档,也就是表里面的数据了。
shards
和replicas
,是建立在索引的概念基础上的。如果没有索引,那么也就没有shards
和replicas
的概念。可以通过下面的方法,查看每个索引的shard
和replica
的数量。(范例中的索引名为my_index
)
GET /my_index/_settings?pretty
shards 分片
注意拼写,并不是shares
,所以并不是"分享"。官方解释shards
为【分片(s)】,单数shard
,百度翻译里面翻译为【碎片】。翻译成碎片的话,其实更好理解。它解决的问题,就是“工作分担”的问题。
每个索引里面文档,可以分布式存储在多个shards
节点里面。那么,这些待检索的文档,分步在多个节点上之后,在搜索的时候,就可以并行处理了,性能上就会有更好的性能提升。可以理解为“人多力量大”,节点多,每个节点负责的数据就少,处理的速度就更快了。
对于一个elastic search
的索引来说,它的shards
数量一旦设置好,就不应该变动。因为文档到底存放在哪个服务器上,是有公式的。其中的shards
数量就是重要变量因素。
Replicas 副本
Replicas
官方翻译是副本(s),单数replica
,百度翻译为“复制品/仿品”。所以,它解决的问题就是“数据冗余”的问题,注意不是要消除“冗余”,而是创造“冗余”。它要解决的问题,就是“数据的可用性”。
它为每个shard
分区,都创造N
个副本,然后,这些副本又分步在不同的节点上。那么,就最大限度的保证了数据的可用性。
- 某个节点发生故障时,该节点上的
shard
如果有Replica
存在于其他节点上,那么这些副本就可以保证数据不会丢失,并且服务还可以继续运行。 - 读取操作(如搜索请求)可以在所有副本之间进行负载均衡,这样可以提高查询的吞吐量和响应速度。
经验值建议
在创建索引时可以指定Shards
和Replicas
的数量。默认情况下,一个Index
有5个Shards
和1个Replica
。通常,Shards
的数量应该设置为节点数量的平方根,例如一个拥有10个节点的集群,建议将Shards
设置为5或7。Replicas
的数量可以根据数据的可用性和查询需求进行调整,通常设置为1到2个。
总结
所以,对于分区和副本来说,必须有分区,可以没有副本。但是,建议设置副本。从数据在节点上的分步来说,你中有我,我中有你。所有文档,按着分区,分布在不同的节点上。又在不同的节点上,存储了自己的多个副本。
更多elastic search
经验文章,请点击:


