ElasticSearch: non attribué Éclats, comment réparer?

j'ai un cluster ES avec 4 noeuds:

number_of_replicas: 1
search01 - master: false, data: false
search02 - master: true, data: true
search03 - master: false, data: true
search04 - master: false, data: true

j'ai dû redémarrer search03, et quand il est revenu, il a rejoint le cluster sans problème, mais a laissé 7 fragments non assignés allongés.

{
  "cluster_name" : "tweedle",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 15,
  "active_shards" : 23,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 7
}

maintenant mon amas est à l'état jaune. Quelle est la meilleure façon de résoudre ce problème?

  • supprimer (annuler) les fragments?
  • déplacer les éclats à un autre noeud?
  • attribuer les fragments au noeud?
  • mise à Jour "number_of_replicas' à 2?
  • autre chose?

fait intéressant, quand un nouvel index a été ajouté, ce noeud a commencé à travailler dessus et a joué gentil avec le reste du cluster, il a juste laissé les tessons non assignés allongés.

suivez la question: Est-ce que je fais quelque chose de mal pour que cela arrive en premier lieu? Je n'ai pas ont beaucoup de confiance dans un groupe qui se comporte de cette façon, lorsqu'un nœud est redémarré.

NOTE: si vous exécutez un cluster de noeud simple pour une raison quelconque, vous pourriez simplement avoir besoin de faire ce qui suit:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'
132
demandé sur Spanky 2013-11-14 04:49:34

19 réponses

par défaut, Elasticsearch réattribuera dynamiquement les fragments aux noeuds. Cependant, si vous avez désactivé l'allocation de l'éclat (peut-être avez-vous fait un redémarrage et oublié de la réactiver), vous pouvez réactiver l'allocation de l'éclat.

# v0.90.x and earlier
curl -XPUT 'localhost:9200/_settings' -d '{
    "index.routing.allocation.disable_allocation": false
}'

# v1.0+
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
    "transient" : {
        "cluster.routing.allocation.enable" : "all"
    }
}'

Elasticsearch va ensuite réattribuer shards as normal. Cela peut être lent, envisager d'augmenter indices.recovery.max_bytes_per_sec et cluster.routing.allocation.node_concurrent_recoveries pour l'accélérer.

si vous voyez encore des problèmes, quelque chose le reste est probablement faux, alors regardez dans votre Elasticsearch journaux d'erreurs. Si vous voyez EsRejectedExecutionException vos pools de fil peut être trop petit .

enfin, vous pouvez explicitement réattribuer un fragment à un noeud avec l ' "API 1519160920".

# Suppose shard 4 of index "my-index" is unassigned, so you want to
# assign it to node search03:
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands": [{
        "allocate": {
            "index": "my-index",
            "shard": 4,
            "node": "search03",
            "allow_primary": 1
        }
    }]
}'
99
répondu Wilfred Hughes 2016-01-06 12:00:51

OK, j'ai résolu ce problème avec L'aide du support ES. Lancez la commande suivante à L'API sur tous les noeuds (ou les noeuds que vous croyez être la cause du problème):

curl -XPUT 'localhost:9200/<index>/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

<index> est l'indice que vous croyez être le coupable. Si vous n'en avez aucune idée, Lancez ceci sur tous les noeuds:

curl -XPUT 'localhost:9200/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

j'ai aussi ajouté cette ligne à ma configuration yml et depuis lors, tous les redémarres du serveur/service ont été sans problème. Le les fragments sont réaffectés immédiatement.

FWIW, pour répondre à une question souvent recherchée, mettez MAX_HEAP_SIZE à 30G sauf si votre machine a moins de 60g de mémoire vive, auquel cas mettez-le à la moitié de la mémoire disponible.

46
répondu Spanky 2016-05-03 18:57:36

ce petit script de bash va forcer la réattribution, vous pouvez perdre des données.

NODE="YOUR NODE NAME"
IFS=$'\n'
for line in $(curl -s 'localhost:9200/_cat/shards' | fgrep UNASSIGNED); do
  INDEX=$(echo $line | (awk '{print }'))
  SHARD=$(echo $line | (awk '{print }'))

  curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
     "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
          }
        }
    ]
  }'
done
36
répondu W. Andrew Loe III 2014-11-04 22:24:04

la seule chose qui a fonctionné pour moi était de changer le nombre de répliques (j'ai eu 2 répliques, donc je l'ai changé en 1 et ensuite changé à 2).

d'Abord:

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

puis:

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

(Je L'ai déjà écrit dans cette question )

11
répondu Edi 2017-05-23 11:33:24

Elasticsearch attribue automatiquement shards si la configuration ci-dessous est définie à all. Cette configuration peut être définie à l'aide d'une api rest aussi cluster.routage.allocation.activer: tous les

si même après l'application de la configuration ci-dessous, es ne parvient pas à assigner les fragments automatiquement, alors vous devez forcer l'assignation vous-même. ES lien officiel pour ce

j'ai écrit un script pour assigner tous les fragments non assignés à travers le cluster.

le tableau ci-dessous contient la liste des noeuds parmi lesquels vous voulez équilibrer les fragments non assignés

#!/bin/bash
array=( node1 node2 node3 )
node_counter=0
length=${#array[@]}
IFS=$'\n'
for line in $(curl -s 'http://127.0.0.1:9200/_cat/shards'|  fgrep UNASSIGNED); do
    INDEX=$(echo $line | (awk '{print }'))
    SHARD=$(echo $line | (awk '{print }'))
    NODE=${array[$node_counter]}
    echo $NODE
    curl -XPOST 'http://127.0.0.1:9200/_cluster/reroute' -d '{
        "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
            }
        }
        ]
    }'
    node_counter=$(((node_counter)%length +1))
done
9
répondu Nischal Kumar 2016-12-14 11:40:07

j'ai collé aujourd'hui avec le même problème de répartition des fragments. Le script W. Andrew Loe III a proposé dans sa réponse n'a pas fonctionné pour moi, donc je l'ai un peu modifié et il a finalement fonctionné:

#!/usr/bin/env bash

# The script performs force relocation of all unassigned shards, 
# of all indices to a specified node (NODE variable)

ES_HOST="<elasticsearch host>"
NODE="<node name>"

curl ${ES_HOST}:9200/_cat/shards > shards
grep "UNASSIGNED" shards > unassigned_shards

while read LINE; do
  IFS=" " read -r -a ARRAY <<< "$LINE"
  INDEX=${ARRAY[0]}
  SHARD=${ARRAY[1]}

  echo "Relocating:"
  echo "Index: ${INDEX}"
  echo "Shard: ${SHARD}"
  echo "To node: ${NODE}"

  curl -s -XPOST "${ES_HOST}:9200/_cluster/reroute" -d "{
    \"commands\": [
       {
         \"allocate\": {
           \"index\": \"${INDEX}\",
           \"shard\": ${SHARD},
           \"node\": \"${NODE}\",
           \"allow_primary\": true
         }
       }
     ]
  }"; echo
  echo "------------------------------"
done <unassigned_shards

rm shards
rm unassigned_shards

exit 0

maintenant, je ne suis pas une sorte de gourou Bash, mais le script a vraiment fonctionné pour mon cas. Notez que vous devrez spécifier des valeurs appropriées pour les variables "ES_HOST" et "NODE".

6
répondu Splanger 2017-05-23 11:55:19

dans mon cas, la limite supérieure de l'espace disque dur a été atteinte.

regardez cet article: https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html

en gros, j'ai couru:

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.info.update.interval": "1m"
  }
}

de manière à ce qu'il se répartisse si <90% de l'espace disque utilisé, et déplace un fragment vers une autre machine dans le cluster si >95% de l'espace disque utilisé; et il vérifie toutes les 1 minute.

5
répondu manyways 2016-09-15 18:24:29

Peut-être que ça aide quelqu'un, mais j'ai eu le même problème et c'était dû à un manque d'espace de stockage causée par un journal d'arriver trop grand.

Espère que cela aide quelqu'un! :)

4
répondu Juanjo Lainez Reche 2015-04-09 10:23:22

j'ai eu le même problème mais la cause fondamentale était une différence dans les numéros de version (1.4.2 sur deux noeuds (avec des problèmes) et 1.4.4 sur deux noeuds (ok)). La première et la deuxième réponses (mise à l'index.routage.allocation.disable_allocation" sur "faux" et "" cluster.routage.allocation.activer" pour "tous") ne fonctionne pas.

Toutefois, la réponse par @Wilfred Hughes (paramètre "cluster.routage.allocation.activer" pour "tous" à l'aide transitoire) m'a donné une erreur suivantes déclaration:

[Non(version du nœud cible [1.4.2] est plus ancienne que la version du nœud source [1.4.4])]

après la mise à jour des anciens noeuds à 1.4.4 ces noeuds ont commencé à resnc avec les autres bons noeuds.

3
répondu Jörg Rech 2015-03-09 20:16:20

j'ai eu ce problème aussi, et j'ai trouvé un moyen facile de le résoudre.

  • l'index des indicatifs de fragments

    $ curl -XGET http://172.16.4.140:9200/_cat/shards
    
  • installez des outils de conservateur et utilisez-les pour supprimer l'index

    $ curator --host 172.16.4.140 delete indices --older-than 1 \
           --timestring '%Y.%m.%d' --time-unit days --prefix logstash
    

    NOTE: dans mon cas, l'indice est logstash du jour 2016-04-21

  • puis vérifier les éclats à nouveau, tous les les éclats non attribués s'en vont!
3
répondu user3391471 2016-05-09 13:19:32

dans mon cas, quand je crée un nouveau index alors la valeur par défaut number_of_replicas est définie comme 1. Et le nombre de noeuds dans mon cluster était seulement un donc il n'y avait pas de noeud supplémentaire pour créer la réplique, donc la santé tournait au jaune. Donc, quand j'ai créé l'index avec paramètres propriété et mis le numéro de_replicas comme 0. Puis il a bien fonctionné. Espérons que cette aide.

PUT /customer
{
    "settings": {
        "number_of_replicas": 0
    }
}
2
répondu Apoorv Nag 2016-05-09 15:00:32

j'ai aussi fait face à cette situation et je l'ai finalement corrigée.

tout d'abord, je vais décrire ma situation. J'ai deux noeuds dans le cluster ElasticSearch, ils peuvent se trouver l'un l'autre, mais quand j'ai créé un index avec les paramètres "number_of_replicas" : 2 , "number_of_shards" : 5, ES montrent le signal jaune et unassigned_shards est 5.

le problème se produit parce que la valeur de number_of_replicas , quand je fixe sa valeur avec 1 , tout va bien.

2
répondu Armstrongya 2016-05-09 15:04:41

dans mon cas un vieux noeud avec de vieilles parts rejoignait le cluster, donc nous avons dû arrêter le vieux noeud et supprimer les indices avec des fragments non attribués.

1
répondu alwe 2015-06-24 13:17:36

pour moi, ceci a été résolu en exécutant ceci à partir de la console dev: "POST /_cluster/reroute?rety_failed "

.....

j'ai commencé par regarder la liste des indices pour voir quels indices étaient rouges puis j'ai couru

"get /_cat/éclats?h=[INDEXNAME],tesson,prirep,de l'état,non affecté.la raison"

et vu qu'il avait des éclats collés dans ALLOCATION_FAILED state, donc en lançant le Rety ci-dessus les a fait ré-essayer le allocation.

1
répondu ScottFoster1000 2018-03-14 00:54:34

pourrait aider, mais j'ai eu ce problème en essayant d'exécuter ES en mode embarqué. Le correctif était de s'assurer que le noeud avait un jeu local(true).

0
répondu JamesC 2015-06-02 22:29:35

une autre raison possible pour les fragments non assignés est que votre cluster exécute plus d'une version du binaire Elasticsearch.

réplication de la version la plus récente à la précédente les versions ne fonctionneront pas

il peut s'agir d'une cause fondamentale des tessons non assignés.

Élastique Documentation De Roulement Du Processus De Mise À Niveau

0
répondu Marc Tamsky 2015-10-13 21:56:20

j'ai rencontré exactement le même problème. Cela peut être évité en réglant Temporairement l'allocation des fragments sur false avant de redémarrer elasticsearch, mais cela ne fixe pas les fragments non assignés s'ils sont déjà là.

Dans mon cas, il a été causé par le manque d'espace disque libre sur le nœud de données. Les fragments non assignés étaient toujours sur le noeud de données après le redémarrage, mais ils n'ont pas été reconnus par le maître.

juste le nettoyage d'un des noeuds du disque a commencé le processus de réplication pour moi. C'est un processus plutôt lent parce que toutes les données doivent être copiées à partir d'un noeud de données à l'autre.

0
répondu Brian van Rooijen 2015-10-28 15:31:00

j'ai essayé plusieurs des suggestions ci-dessus et malheureusement aucune n'a fonctionné. Nous avons un index "Log" dans notre environnement inférieur où les applications écrivent leurs erreurs. Il s'agit d'un nœud de cluster. Ce qui l'a résolu pour moi a été de vérifier le fichier de configuration YML pour le noeud et de voir qu'il avait encore le paramètre par défaut "gateway.expected_nodes: 2". Cela dépassait tous les autres paramètres que nous avions. Chaque fois que nous créerions un index sur ce noeud, il essaierait d'étaler 3 sur 5 fragments à la phantom 2ème nœud. Ceux-ci apparaîtraient donc comme non assignés et ils ne pourraient jamais être déplacés au 1er et seul noeud.

la solution était d'éditer la config, en changeant le paramètre" gateway.expected_nodes " à 1, pour qu'il cesse de chercher son frère jamais trouvé dans le cluster, et redémarre l'instance de service élastique. Aussi, j'ai dû supprimer l'index, et en créer un nouveau. Après avoir créé l'index, les fragments sont tous apparus sur le 1er et seul noeud, et aucun n'était non attribuées.

# Set how many nodes are expected in this cluster. Once these N nodes
# are up (and recover_after_nodes is met), begin recovery process immediately
# (without waiting for recover_after_time to expire):
#
# gateway.expected_nodes: 2
gateway.expected_nodes: 1
0
répondu Daniel Knowlton 2016-04-28 19:02:57

j'ai essayé de supprimer les fragments non attribués ou de les assigner manuellement à un noeud de données particulier. Cela n'a pas fonctionné parce que des fragments non attribués continuaient d'apparaître et l'état de santé était "rouge" encore et encore. Puis j'ai remarqué qu'un des noeuds de données est resté dans l'état "restart". J'ai réduit le nombre de nœuds de données, je l'ai tué. Le problème n'est pas reproductible en plus.

0
répondu thepolina 2016-10-25 00:51:20