代码之家  ›  专栏  ›  技术社区  ›  Lone Learner

为什么Elasticsearch允许我在无法满足仲裁要求的单节点集群中索引文档?

  •  1
  • Lone Learner  · 技术社区  · 6 年前

    从…起 https://www.elastic.co/guide/en/elasticsearch/guide/2.x/distrib-write.html :

    请注意,number\u of\u replicas是在索引设置中指定的副本数,而不是当前活动的副本数。如果指定索引应包含三个副本,则仲裁如下:

    int((主副本+3个副本)/2)+1=3

    但如果只启动两个节点,则活动碎片副本将不足,无法满足仲裁要求,并且无法索引或删除任何文档。

    我在单节点集群上运行了以下命令,并且我能够成功地为文档编制索引,尽管上面的数学表示我不应该能够为文档编制索引。

    curl -X DELETE http://localhost:9200/a/?pretty
    curl -X PUT -siH 'Content-Type: application/json' \
         http://localhost:9200/a?pretty -d '{
    
        "settings": {
            "number_of_replicas": 3
        }
    }'
    curl -sH 'Content-Type: application/json' -X PUT http://localhost:9200/a/a/1?pretty -d '{"a": "a"}'
    curl -si http://localhost:9200/_cluster/health?pretty
    curl -si http://localhost:9200/a/a/1?pretty
    

    以下是输出:

    $ curl -X PUT -siH 'Content-Type: application/json' \
         http://localhost:9200/a?pretty -d '{
    
        "settings": {
            "number_of_replicas": 3
        }
    }'
    HTTP/1.1 200 OK
    content-type: application/json; charset=UTF-8
    content-length: 77
    
    {
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "index" : "a"
    }
    
    $ curl -sH 'Content-Type: application/json' -X PUT http://localhost:9200/a/a/1?pretty -d '{"a": "a"}'
    {
      "_index" : "a",
      "_type" : "a",
      "_id" : "1",
      "_version" : 1,
      "result" : "created",
      "_shards" : {
        "total" : 4,
        "successful" : 1,
        "failed" : 0
      },
      "_seq_no" : 0,
      "_primary_term" : 1
    }
    
    $ curl -si http://localhost:9200/_cluster/health?pretty
    HTTP/1.1 200 OK
    content-type: application/json; charset=UTF-8
    content-length: 468
    
    {
      "cluster_name" : "docker-cluster",
      "status" : "yellow",
      "timed_out" : false,
      "number_of_nodes" : 1,
      "number_of_data_nodes" : 1,
      "active_primary_shards" : 5,
      "active_shards" : 5,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 15,
      "delayed_unassigned_shards" : 0,
      "number_of_pending_tasks" : 0,
      "number_of_in_flight_fetch" : 0,
      "task_max_waiting_in_queue_millis" : 0,
      "active_shards_percent_as_number" : 25.0
    }
    
    $ curl -si http://localhost:9200/a/a/1?pretty
    HTTP/1.1 200 OK
    content-type: application/json; charset=UTF-8
    content-length: 124
    
    {
      "_index" : "a",
      "_type" : "a",
      "_id" : "1",
      "_version" : 1,
      "found" : true,
      "_source" : {
        "a" : "a"
      }
    }
    

    即使我已经将索引配置为具有3个副本碎片,并且数学上说我必须至少具有3个节点,但我如何能够仅使用1个节点为文档编制索引?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Val    6 年前

    这是ES 2中的旧法定人数规则。x、 截至ES 5。x写入一致性检查已稍微更改,黄色群集(即,群集将分配所有主碎片)将通过写入操作的一致性检查,并允许您索引和删除文档。

    现在决定是否可以进行写入的方法是使用 wait_for_active_shards 索引操作中的参数。默认情况下,如果所有主碎片都已打开,则将允许索引操作。您可以通过指定您希望在授权索引操作之前处于活动状态的碎片数来覆盖该设置,例如:。 wait_for_active_shards=all 这相当于 wait_for_active_shards=4 (4=1个主副本+3个副本)。如果您想要与之前相同的法定人数规则,请指定 wait_for_active_shards=3 .

    有关更多信息,请访问 official documentation here

    推荐文章