我试图理解什么shard和replica在Elasticsearch中,但我没有设法理解它。如果我下载Elasticsearch并运行脚本,那么根据我所知道的,我已经启动了一个具有单个节点的集群。现在这个节点(我的PC)有5个碎片(?)和一些副本(?)。
它们是什么,我有5个重复的索引吗?如果是,为什么?我需要一些解释。
我试图理解什么shard和replica在Elasticsearch中,但我没有设法理解它。如果我下载Elasticsearch并运行脚本,那么根据我所知道的,我已经启动了一个具有单个节点的集群。现在这个节点(我的PC)有5个碎片(?)和一些副本(?)。
它们是什么,我有5个重复的索引吗?如果是,为什么?我需要一些解释。
当前回答
我将试着用一个真实的例子来解释,因为你得到的答案和回复似乎对你没有帮助。
当您下载并启动elasticsearch时,您将创建一个elasticsearch节点,该节点将尝试加入现有集群(如果可用)或创建一个新集群。假设您用一个节点创建了自己的新集群,就是您刚刚启动的那个节点。我们没有数据,因此需要创建一个索引。
当您创建索引时(当您索引第一个文档时也会自动创建索引),您可以定义它将由多少个碎片组成。如果您没有指定一个数字,它将有默认的碎片数量:5个主。这是什么意思?
这意味着elasticsearch将创建5个包含你的数据的主分片:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
每次索引一个文档时,elasticsearch将决定哪个主分片应该保存该文档,并在那里索引它。主碎片不是数据的副本,它们就是数据本身!拥有多个分片确实有助于在一台机器上利用并行处理的优势,但关键是,如果我们在同一个集群上启动另一个elasticsearch实例,那么分片将以均匀的方式分布在集群上。
例如,节点1将只保存三个分片:
____ ____ ____
| 1 | | 2 | | 3 |
|____| |____| |____|
由于剩下的两个分片已经移动到新启动的节点:
____ ____
| 4 | | 5 |
|____| |____|
为什么会发生这种情况?因为elasticsearch是一个分布式搜索引擎,通过这种方式,您可以使用多个节点/机器来管理大量数据。
每个elasticsearch索引至少由一个主分片组成,因为数据存储在主分片中。但是,每个碎片都是有代价的,因此,如果你只有一个节点,而且没有可预见的增长,那就坚持使用一个主碎片。
另一种类型的碎片是副本。默认值为1,这意味着每个主分片将被复制到另一个包含相同数据的分片。副本用于提高搜索性能和故障转移。复制分片永远不会被分配到与相关主数据所在的同一节点上(这很像将备份数据放在与原始数据相同的磁盘上)。
回到我们的例子,对于1个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配2个副本碎片,并且它们将包含与第二个节点上的主碎片完全相同的数据:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4R | | 5R |
|____| |____| |____| |____| |____|
第二个节点也一样,它将包含第一个节点上主碎片的副本:
____ ____ ____ ____ ____
| 1R | | 2R | | 3R | | 4 | | 5 |
|____| |____| |____| |____| |____|
使用这样的设置,如果一个节点宕机,您仍然拥有整个索引。复制分片将自动成为主分片,即使节点故障,集群也能正常工作,具体如下:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
由于您有"number_of_replicas":1,因此不能再分配副本,因为它们永远不会被分配到主节点所在的同一节点上。这就是为什么你会有5个未分配的碎片,副本,集群状态将是黄色而不是绿色。没有数据丢失,但它可以更好,因为一些碎片无法分配。
一旦备份了离开的节点,它将再次加入集群,并再次分配副本。第二个节点上的现有分片可以加载,但它们需要与其他分片同步,因为写操作很可能发生在节点关闭时。操作结束时,集群状态将变为“GREEN”。
希望这能为你澄清一些事情。
其他回答
用最简单的术语来说,碎片只是存储在磁盘上一个分离文件夹中的索引的一部分:
这个截图显示了整个Elasticsearch目录。
如您所见,所有数据都进入data目录。
通过检查索引C-mAfLltQzuas72iMiIXNw,我们看到它有五个碎片(文件夹0到4)。
另一方面,JH_A8PgCRj-GK0GeQ0limw索引只有一个碎片(0文件夹)。
pri表示碎片的总数。
索引被分解成碎片,以便分布它们和扩展它们。
副本是碎片的副本。
节点是弹性搜索的一个运行实例,属于一个集群。
集群由一个或多个具有相同集群名称的节点组成。每个集群都有一个由集群自动选择的主节点,如果当前的主节点发生故障,可以将其替换。
我将试着用一个真实的例子来解释,因为你得到的答案和回复似乎对你没有帮助。
当您下载并启动elasticsearch时,您将创建一个elasticsearch节点,该节点将尝试加入现有集群(如果可用)或创建一个新集群。假设您用一个节点创建了自己的新集群,就是您刚刚启动的那个节点。我们没有数据,因此需要创建一个索引。
当您创建索引时(当您索引第一个文档时也会自动创建索引),您可以定义它将由多少个碎片组成。如果您没有指定一个数字,它将有默认的碎片数量:5个主。这是什么意思?
这意味着elasticsearch将创建5个包含你的数据的主分片:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
每次索引一个文档时,elasticsearch将决定哪个主分片应该保存该文档,并在那里索引它。主碎片不是数据的副本,它们就是数据本身!拥有多个分片确实有助于在一台机器上利用并行处理的优势,但关键是,如果我们在同一个集群上启动另一个elasticsearch实例,那么分片将以均匀的方式分布在集群上。
例如,节点1将只保存三个分片:
____ ____ ____
| 1 | | 2 | | 3 |
|____| |____| |____|
由于剩下的两个分片已经移动到新启动的节点:
____ ____
| 4 | | 5 |
|____| |____|
为什么会发生这种情况?因为elasticsearch是一个分布式搜索引擎,通过这种方式,您可以使用多个节点/机器来管理大量数据。
每个elasticsearch索引至少由一个主分片组成,因为数据存储在主分片中。但是,每个碎片都是有代价的,因此,如果你只有一个节点,而且没有可预见的增长,那就坚持使用一个主碎片。
另一种类型的碎片是副本。默认值为1,这意味着每个主分片将被复制到另一个包含相同数据的分片。副本用于提高搜索性能和故障转移。复制分片永远不会被分配到与相关主数据所在的同一节点上(这很像将备份数据放在与原始数据相同的磁盘上)。
回到我们的例子,对于1个副本,我们将在每个节点上拥有整个索引,因为将在第一个节点上分配2个副本碎片,并且它们将包含与第二个节点上的主碎片完全相同的数据:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4R | | 5R |
|____| |____| |____| |____| |____|
第二个节点也一样,它将包含第一个节点上主碎片的副本:
____ ____ ____ ____ ____
| 1R | | 2R | | 3R | | 4 | | 5 |
|____| |____| |____| |____| |____|
使用这样的设置,如果一个节点宕机,您仍然拥有整个索引。复制分片将自动成为主分片,即使节点故障,集群也能正常工作,具体如下:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
由于您有"number_of_replicas":1,因此不能再分配副本,因为它们永远不会被分配到主节点所在的同一节点上。这就是为什么你会有5个未分配的碎片,副本,集群状态将是黄色而不是绿色。没有数据丢失,但它可以更好,因为一些碎片无法分配。
一旦备份了离开的节点,它将再次加入集群,并再次分配副本。第二个节点上的现有分片可以加载,但它们需要与其他分片同步,因为写操作很可能发生在节点关闭时。操作结束时,集群状态将变为“GREEN”。
希望这能为你澄清一些事情。
索引被分解成碎片,以便分布它们和扩展它们。
副本是分片的副本,在节点丢失时提供可靠性。这个数字经常会引起混淆,因为副本计数== 1意味着集群必须有可用的分片的主副本和复制副本才能处于绿色状态。
为了创建副本,您的集群中必须至少有2个节点。
你可能会发现这里的定义更容易理解: http://www.elasticsearch.org/guide/reference/glossary/
如果你真的不喜欢看到它变黄。您可以将副本的数量设置为0:
curl -XPUT 'localhost:9200/_settings' -d '
{
"index" : {
"number_of_replicas" : 0
}
}
'
请注意,您应该只在本地开发框上执行此操作。