Elasticsearch - что делать с неназначенными осколками

мой кластер с желтым статусом, потому что некоторые осколки не назначены. что с этим делать?

Я попытался установить cluster.routing.allocation.disable_allocation = false для всех индексов, но я думаю, что это не работает, потому что я использую версию 1.1.1.

Я также попытался перезапустить все машины, но это произойдет.

Любая идея?

EDIT:

  • Статистика кластера:

    { 
      cluster_name: "elasticsearch",
      status: "red",
      timed_out: false,
      number_of_nodes: 5,
      number_of_data_nodes: 4,
      active_primary_shards: 4689,
      active_shards: 4689,
      relocating_shards: 0,
      initializing_shards: 10,
      unassigned_shards: 758
    }
    

Ответ 1

Эти неназначенные осколки - это фактически неназначенные реплики ваших реальных осколков от мастера node.

Чтобы назначить эти осколки, вам нужно запустить новый экземпляр elasticsearch для создания вторичного node для переноса реплик данных.

РЕДАКТИРОВАТЬ: Иногда неназначенные осколки относятся к индексам, которые были удалены, что делает их чересчурными черепами, которые никогда не будут назначаться независимо от добавления узлов или нет. Но это не тот случай!

Ответ 2

Существует много возможных причин, по которым распределение не произойдет:

  • Вы используете разные версии Elasticsearch на разных узлах.
  • У вас есть только один node в вашем кластере, но у вас есть количество реплик, установленных на что-то отличное от нуля.
  • Недостаточно места на диске.
  • У вас выделено выделение осколков.
  • У вас включен брандмауэр или SELinux. Если SELinux включен, но не настроен должным образом, вы увидите, что навсегда застряли черепа в INITIALIZING или RELOCATING.

Как правило, вы можете устранить такие проблемы:

  • Посмотрите на узлы в вашем кластере: curl -s 'localhost:9200/_cat/nodes?v'. Если у вас есть только один node, вам нужно установить number_of_replicas в 0. (См. Документацию по ES или другие ответы).
  • Посмотрите на дисковое пространство, доступное в вашем кластере: curl -s 'localhost:9200/_cat/allocation?v'
  • Проверьте настройки кластера: curl 'http://localhost:9200/_cluster/settings?pretty' и найдите настройки cluster.routing
  • Посмотрите, какие осколки UNASSIGNED curl -s localhost:9200/_cat/shards?v | grep UNASS
  • Попробуйте принудительно назначить осколок

    curl -XPOST -d '{ "commands" : [ {
      "allocate" : {
           "index" : ".marvel-2014.05.21", 
           "shard" : 0, 
           "node" : "SOME_NODE_HERE",
           "allow_primary":true 
         } 
      } ] }' http://localhost:9200/_cluster/reroute?pretty
    
  • Посмотрите на ответ и посмотрите, что он говорит. Там будет куча ДА, которые в порядке, а затем НЕТ. Если нет NO, это, вероятно, проблема с брандмауэром /SELinux.

Ответ 3

Это обычная проблема, связанная с настройкой индекса по умолчанию, в частности, при попытке репликации на одном node. Чтобы исправить это с помощью настройки временного кластера, сделайте следующее:

curl -XPUT http://localhost:9200/_settings -d '{ "number_of_replicas" :0 }'

Затем включите кластер для перераспределения осколков (вы всегда можете включить это после того, как все сказано и сделано):

curl -XPUT http://localhost:9200/_cluster/settings -d '
{
    "transient" : {
        "cluster.routing.allocation.enable": true
    }
}'

Теперь откиньтесь назад и наблюдайте, как кластер очищает неназначенные осколки реплик. Если вы хотите, чтобы это вступило в силу с будущими индексами, не забудьте изменить файл elasticsearch.yml со следующей настройкой и отказом кластера:

index.number_of_replicas: 0

Ответ 4

Единственное, что сработало для меня, - это изменить номер_объектива (у меня было 2 реплики, поэтому я изменил его на 1, а затем снова изменил на 2).

Во-первых:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 1
     }
}

Тогда:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 2
     }
}

Ответ 5

Первые два пункта ответа от Alcanzar сделали это для меня, но мне пришлось добавить
"allow_primary" : true

так

curl -XPOST http://localhost:9200/_cluster/reroute?pretty -d '{
  "commands": [
    {
      "allocate": {
        "index": ".marvel-2014.05.21",
        "shard": 0,
        "node": "SOME_NODE_HERE",
        "allow_primary": true
      }
    }
  ]
}'

Ответ 6

Убедитесь, что версии ElasticSearch для каждого node совпадают. Если это не так, то ES не будет выделять копии копий индекса на "более старые" узлы.

Используя @Alcanzar ответ, вы можете получить некоторые сообщения об ошибках диагностики:

curl -XPOST 'http://localhost:9200/_cluster/reroute?pretty' -d '{
  "commands": [
    {
      "allocate": {
        "index": "logstash-2016.01.31",
        "shard": 1,
        "node": "arc-elk-es3",
        "allow_primary": true
      }
    }
  ]
}'

результат:

{
  "error" : "ElasticsearchIllegalArgumentException[[allocate] allocation of
            [logstash-2016.01.31][1] on node [arc-elk-es3]
            [Xn8HF16OTxmnQxzRzMzrlA][arc-elk-es3][inet[/172.16.102.48:9300]]{master=false} is not allowed, reason:
            [YES(shard is not allocated to same node or host)]
            [YES(node passes include/exclude/require filters)]
            [YES(primary is already active)]
            [YES(below shard recovery limit of [2])]
            [YES(allocation disabling is ignored)]
            [YES(allocation disabling is ignored)]
            [YES(no allocation awareness enabled)]
            [YES(total shard limit disabled: [-1] <= 0)]
            *** [NO(target node version [1.7.4] is older than source node version [1.7.5]) ***
            [YES(enough disk for shard on node, free: [185.3gb])]
            [YES(shard not primary or relocation disabled)]]",
  "status" : 400
}

Как определить номер версии ElasticSearch:

[email protected]:/var/log/kibana$ curl -XGET 'localhost:9200'
{
  "status" : 200,
  "name" : "arc-elk-web",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.5",
    "build_hash" : "00f95f4ffca6de89d68b7ccaf80d148f1f70e4d4",
    "build_timestamp" : "2016-02-02T09:55:30Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

В моем случае я неправильно установил репозиторий apt-get, и они перестали синхронизироваться на разных серверах. Я исправил его на всех серверах:

echo "deb http://packages.elastic.co/elasticsearch/1.7/debian stable main" | sudo tee -a /etc/apt/sources.list

а затем обычный:

sudo apt-get update
sudo apt-get upgrade

и окончательная перезагрузка сервера.