【问题标题】:Understanding Elastic Search了解弹性搜索
【发布时间】:2023-04-10 18:02:01
【问题描述】:

很抱歉这么说,但 ES 的文档 (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index.html) 让我感到困惑。

感谢词汇表,我了解数据库、表和行的术语,但我已阅读文档的大部分内容,但找不到以下问题的答案:

作为参考,我首先阅读了这些链接:

如果文档中存在该信息,那么如果您能指出我将不胜感激。

编辑:

我也不确定自动发现如何在分布式网络上工作。如果 ping 每个公共网络围绕它如何连接到可能位于世界另一端的正确网络,那么简短吗?

【问题讨论】:

标签: elasticsearch


【解决方案1】:

请参阅下面的答案。

您不是“必须”,但您可能应该特别希望在生产中使用。默认是五个分片和一个复制。

定义的复制次数就是整个索引在弹性搜索集群中的所有节点中复制的次数。将其视为 RDBMS 数据库的多个读取副本(但在本例中,我们读取和写入所有副本)。

分片是我拆分或分片索引的次数。所以,我可以有一个带有单个分片的索引,或者我可以有一个带有多个分片的索引。这在概念上类似于按主键对 RDBMS 数据库进行分片,但并不完全相同。

因此,索引中的分片总数是 number_of_shards 和 number_of_replicas 的乘积。

当您进行搜索时,elasticsearch 会将您的搜索分发到索引中包含分片的所有可能节点,并为您汇总结果。您可以将其视为 map/reduce,其中 map 将搜索发送到每个分片,reduce 正在收集结果。

此外,您可以随时更改复制 number_of_replicas,但永远不能更改 number_of_shards。这必须在创建索引时设置。

  • 如何拥有 3 个分片和 2 个副本?如果词汇表是可以参考的,那不应该是不可能的,考虑到一个 shard 是“是单个 Lucene 实例”吗?

我认为以上内容主要回答了这个问题,但重要的是要记住,elasticsearch 主要是一种分布式计算解决方案来搜索。我们将工作拆分到多个分片和可能的机器上。

  • 如果我稍后添加更多节点,如何更改这些值以跨越新节点?

一旦集群知道集群中的另一个节点,您就无需执行其他操作。这些设置自行在整个集群中传播。在您上面的三个分片和两个副本的示例中,如果您最初有两个节点并添加了第三个节点,则每个节点平均每个节点将有两个分片,此分片移动无需您干预即可发生(同样,前提是集群知道新节点)

  • 分片在 ES 中如何工作?

见上

  • 副本集在 ES 中是如何工作的?

见上

您不必主动“管理”它。如前所述,分片和您在创建索引时定义的所有其他内容都会传播到集群中的新节点。

您可以这样定义副本和分片:

{
    "settings": {
        "index": {
            "number_of_shards": 20,
            "number_of_replicas": 1
        }
    },
    "mappings": {
        "some_type": {
            "properties": {
                "some_field": {
                    "type": "long"
                }
            }
        }
    }
}
  • 如何管理副本集? IE。如何添加副本、提升初选等?

您可以通过更新索引 API 执行此操作,此特定案例的文档可在此处的网站上找到:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html

我刚刚注意到您的修改,请参见下文:

  • 我也不确定自动发现在分布式网络上的工作原理。

在 YML 配置文件中,您可以像这样设置单播:

discovery.zen.ping.multicast.enabled: false
#discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.unicast.hosts: ["ip.add.r.ess", "ip.add.r.ess"]

中间设置是一个重要的设置,但我在这里注释掉了。该数字应始终是(主节点/ 2)+1的数量。这是为了避免出现脑裂的情况。一般来说,我将所有节点设置为 master 合格。

这些设置是针对单播的,我认为你的问题就是这样,而不是多播。

【讨论】:

  • 因此,如果我理解正确,分片不是副本,它是数据,是 id 的范围,(在这方面类似于 SQL 和 MongoDB),但主分片不能再次拆分这意味着如果我想进一步分发我的阅读,我必须重新创建。您将获得所有设置细节的答案投票,谢谢:)
【解决方案2】:

简而言之,索引被分成碎片。分片可以复制,这意味着同一个分片的多个副本可以存在于同一个集群中。因此,如果一个索引有 3 个分片和 2 个副本,这意味着您总共有 9 个分片,其中 6 个是三个主分片的副本。

ES,将尝试在集群中平衡分片及其副本,以便如果一个节点出现故障,它可以从该节点上的主分片故障转移到副本。这可能会让一些人感到困惑:弹性搜索中的大师指的是分片,而不是实际的节点。因此,单个节点可以混合使用副本分片和主分片。

如果你来自 lucene 世界,那么 lucene 索引和弹性搜索索引不是一回事。弹性搜索索引是具有类型、映射和文档的索引文档的逻辑组。或多或少与数据库模式相同。另一方面,lucene 索引是一组包含索引数据的几个文件。当 Elasticsearch 创建索引时,它所做的是创建多个 lucene 索引(每个字段和分片一个),当它复制时,它基本上是复制这些 lucene 索引的文件。

您无法更改索引的分片数,但可以更改副本数。通常,当您需要更多分片时,您所做的就是创建一个新索引并重新索引数据。

在分片管理方面,除了决定分片的数量之外,默认情况下不需要管理太多,ES 本身就可以很好地协调事情,一旦你获得了更好的理解,你可以摆弄很多选项它是如何工作的。对于大多数人来说,默认值是相当不错的。在集群管理方面,您可以通过 API 做很多事情,包括以受控方式关闭节点、使用索引别名、更改副本数量等。

对于自动发现,ES 默认使用本地网络多播。您可以切换到单播,并且您可能想要更改默认集群名称以防止发生意外(在咖啡店中意外形成集群时有一些乐趣)。您可能不想全局集群。我不认为结局很好。

【讨论】:

  • 是的,你的第二段有点让我感到困惑,我想到了像 MongoDB 这样的物理机器,有点令人沮丧,如果我遇到严重的峰值并需要分配我的读取,我必须改革索引更远。呵呵是的,集群名称和广播的问题也是我的想法。 +1
  • 您可以使用别名来缓解固定数量的分片/索引问题。这允许您在查询时将一组索引作为一个索引进行查询。例如,logstash 每天/每周/每月使用它来创建新的索引(和分片)。这为您提供了水平可扩展性,并且有些人在 PB 级使用它,拥有数百个节点。集群不是什么大问题,而是更多的选择。默认值仅在专用网络中提供方便的行为,但如果您不喜欢它可以进行不同的配置。
【解决方案3】:

Shay Banon(ElastiSearch 的创建者)提供的视频演示回答了您大约 80% 的问题,这是一件非常偶然的事情。尽管此演示文稿的内容比您在其他任何地方都可以找到的要多得多。希望这可以帮助。

  http://www.infoq.com/presentations/ElasticSearch  

这个视频分辨率有点低,所以如果你想在演示文稿中显示代码,请按照这个

  https://github.com/kimchy/talks/tree/master/2011/wsnparis 

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2021-11-23
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多