Luc*_*uke 270 full-text-search elasticsearch
我试图了解Elasticsearch中的碎片和副本是什么,但我无法理解它.如果我下载Elasticsearch并运行脚本,那么据我所知,我已经启动了一个具有单个节点的集群.现在这个节点(我的PC)有5个分片(?)和一些副本(?).
他们是什么,我有5个重复的索引?如果是这样的话?我需要一些解释.
jav*_*nna 878
我会尝试用一个真实的例子来解释,因为答案和回复你似乎没有帮助你.
下载elasticsearch并启动它时,您将创建一个elasticsearch节点,该节点尝试加入现有集群(如果可用)或创建新集群.假设您创建了自己的新集群,其中包含一个您刚启动的节点.我们没有数据,因此我们需要创建一个索引.
创建索引时(索引第一个文档时会自动创建索引),您可以定义它将由多少个分片组成.如果您没有指定数字,它将具有默认的分片数:5个原色.这是什么意思?
这意味着elasticsearch将创建包含数据的5个主分片:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
Run Code Online (Sandbox Code Playgroud)
每次索引文档时,elasticsearch都会决定哪个主分片应该保存该文档并将其编入索引.主分片不是数据的副本,它们是数据!拥有多个分片确实有助于在单个机器上利用并行处理,但重点是如果我们在同一个集群上启动另一个弹性搜索实例,则分片将以均匀的方式分布在集群上.
然后,节点1将仅保存三个分片:
____ ____ ____
| 1 | | 2 | | 3 |
|____| |____| |____|
Run Code Online (Sandbox Code Playgroud)
由于剩余的两个分片已移至新启动的节点:
____ ____
| 4 | | 5 |
|____| |____|
Run Code Online (Sandbox Code Playgroud)
为什么会这样?因为elasticsearch是一个分布式搜索引擎,所以您可以利用多个节点/机器来管理大量数据.
每个elasticsearch索引都由至少一个主分片组成,因为那是存储数据的地方.但是,每个碎片都需要付出代价,因此,如果您有一个节点并且没有可预见的增长,那么只需坚持使用一个主要分片.
另一种类型的碎片是复制品.默认值为1,表示每个主分片都将复制到另一个包含相同数据的分片.副本用于提高搜索性能和故障转移.永远不会在相关主节点所在的同一节点上分配副本分片(这几乎就像将备份放在与原始数据相同的磁盘上).
回到我们的示例,使用1个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配3个副本分片,它们将包含与第二个节点上的原色完全相同的数据:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4R | | 5R |
|____| |____| |____| |____| |____|
Run Code Online (Sandbox Code Playgroud)
对于第二个节点也是如此,它将包含第一个节点上主分片的副本:
____ ____ ____ ____ ____
| 1R | | 2R | | 3R | | 4 | | 5 |
|____| |____| |____| |____| |____|
Run Code Online (Sandbox Code Playgroud)
使用这样的设置,如果节点出现故障,您仍然拥有整个索引.副本分片将自动成为主要分片,尽管节点发生故障,群集仍能正常工作,如下所示:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
Run Code Online (Sandbox Code Playgroud)
由于您具有"number_of_replicas":1,因此无法再分配副本,因为它们从未在主节点所在的同一节点上分配.这就是为什么你将有5个未分配的分片,副本和集群状态YELLOW而不是GREEN.没有数据丢失,但可能更好,因为无法分配一些分片.
一旦剩下的节点备份,它将再次加入集群,并将再次分配副本.可以加载第二个节点上的现有分片,但它们需要与其他分片同步,因为写操作很可能在节点关闭时发生.在此操作结束时,群集状态将变为GREEN.
希望这能为您澄清一些事情.
Vin*_*ino 27
碎片:
ElasticSearch使用称为Shard跨所有节点分发索引文档的概念
。index可以潜在地存储大量数据的可以超过一个的硬件限制single nodeElasticsearch提供了将您的索引细分为多个名为shards.shards
。Documents存储在 中shards,并且分片被分配到nodes您的clustercluster增长或缩小,Elasticsearch将自动在分片之间迁移,nodes以便cluster保持平衡。primary shard或 a replica shard。single primary shard,因此您拥有的主分片数量决定了索引可以容纳的最大数据量replica shard只是主分片的副本。复制品:
Replica shard是 , 的副本primary Shard,以防止在硬件故障时丢失数据。Elasticsearch允许您将索引分片的一个或多个副本制作成所谓的副本分片,或replicas简称为副本分片。index也可以复制零次(意味着没有副本)或多次。number of shards和副本可以每指数在创建索引所需的时间来定义。cannot change the number of shards
事后进行。Elasticsearch分配 5 个主分片,1 replica这意味着如果您的集群中至少有两个节点,您的索引将有 5 个主分片和另外 5 个副本分片(1 个完整副本),每个分片总共 10 个分片指数。ppe*_*rcy 20
索引被分解为碎片以便分发它们并进行缩放.
副本是分片的副本,并在节点丢失时提供可靠性.此数字通常存在混淆,因为副本计数== 1表示群集必须具有可用于处于绿色状态的主分片和分片的复制副本.
要创建副本,您的群集中必须至少有2个节点.
您可能会发现这里的定义更容易理解:http: //www.elasticsearch.org/guide/reference/glossary/
最诚挚的问候,保罗
jyu*_*jyu 19
如果你真的不喜欢看到黄色.您可以将副本数设置为零:
curl -XPUT 'localhost:9200/_settings' -d '
{
"index" : {
"number_of_replicas" : 0
}
}
'
Run Code Online (Sandbox Code Playgroud)
请注意,您应该只在本地开发框中执行此操作.
我将使用真实的场景来解释这一点。想象一下,您正在运营一个电子商务网站。随着您变得越来越受欢迎,更多的卖家和产品会添加到您的网站。您将意识到您可能需要索引的产品数量已经增加,并且它太大而无法放入一个节点的一个硬盘中。即使它适合硬盘,在一台机器上对所有文档进行线性搜索也是非常慢的。一个节点上的一个索引不会利用 elasticsearch 工作的分布式集群配置。
因此elasticsearch 将索引中的文档拆分到集群中的多个节点上。文档的每个拆分都称为分片。每个携带文档分片的节点将只有文档的一个子集。假设您有 100 个产品和 5 个分片,每个分片将有 20 个产品。这种数据分片使 Elasticsearch 中的低延迟搜索成为可能。搜索在多个节点上并行进行。结果被聚合并返回。然而,分片不提供容错能力。这意味着如果包含分片的任何节点关闭,集群运行状况将变为黄色。这意味着某些数据不可用。
为了增加容错性,副本出现了。默认弹性搜索为每个分片创建一个副本。这些副本总是在主分片未驻留的其他节点上创建。因此,为了使系统具有容错能力,您可能需要增加集群中的节点数量,这也取决于索引的分片数量。根据副本和分片计算所需节点数的一般公式是“节点数=分片数*(副本数+1)”。标准做法是至少有一个副本以进行容错。
设置分片数量是一个静态操作,这意味着您必须在创建索引时指定它。在此之后的任何更改都需要完全重新索引数据,并且需要时间。但是,设置副本数量是一个动态操作,也可以在创建索引后随时进行。
您可以使用以下命令为索引设置分片和副本的数量。
curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
"settings":{
"number_of_shards":2,
"number_of_replicas":1
}
}'
Run Code Online (Sandbox Code Playgroud)
用最简单的术语来说,shard它只不过是存储在磁盘上单独文件夹中的索引的一部分:
此屏幕截图显示了整个 Elasticsearch 目录。
如您所见,所有数据都进入data目录。
通过检查索引,C-mAfLltQzuas72iMiIXNw我们看到它有五个分片(文件夹0到4)。
另一方面,JH_A8PgCRj-GK0GeQ0limw索引只有一个分片(0文件夹)。
的pri节目碎片总数。
不是答案,而是对 ElasticSearch核心概念的另一个参考,我认为它们很明显是对@javanna 答案的补充。
索引可能会存储大量数据,这些数据可能会超出单个节点的硬件限制。例如,占用 1TB 磁盘空间的 10 亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独处理来自单个节点的搜索请求。
为了解决这个问题,Elasticsearch 提供了将索引细分为多个称为分片的功能。创建索引时,您可以简单地定义所需的分片数量。每个分片本身就是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。
分片很重要,主要有两个原因:
- 它允许您水平拆分/缩放您的内容量。
- 它允许您跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量。
在随时可能出现故障的网络/云环境中,如果分片/节点不知何故脱机或因任何原因消失,则具有故障转移机制非常有用并强烈建议使用。为此,Elasticsearch 允许您将索引分片的一个或多个副本制作成所谓的副本分片,或简称为副本。
复制之所以重要,主要有两个原因:
- 它在分片/节点发生故障时提供高可用性。出于这个原因,重要的是要注意副本分片永远不会与复制它的原始/主分片在同一节点上分配。
- 它允许您扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
索引被分解成碎片以进行分配和扩展。
副本是分片的副本。
节点是属于集群的弹性搜索的运行实例。
一个群集由一个或多个共享相同群集名称的节点组成。每个集群都有一个主节点,集群会自动选择该主节点,如果当前主节点发生故障,则可以替换该主节点。
| 归档时间: |
|
| 查看次数: |
67703 次 |
| 最近记录: |