web-dev-qa-db-fra.com

elasticsearch - que faire des éclats non attribués

mon cluster est au statut jaune car certains fragments ne sont pas attribués. Que faire avec ceci?

J'ai essayé de définir cluster.routing.allocation.disable_allocation = false sur tous les index, mais je pense que cela ne fonctionne pas car j'utilise la version 1.1.1.

J'ai également essayé de redémarrer toutes les machines, mais la même chose se produit.

Une idée?

MODIFIER :

  • Cluster stat: 

    { 
      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
    }
    
47
user3175226

Ces fragments non attribués sont en réalité des réplicas non attribués de vos fragments réels à partir du nœud maître.

Pour affecter ces fragments, vous devez exécuter une nouvelle instance de elasticsearch afin de créer un noeud secondaire pour transporter les réplicas de données.

EDIT: Parfois, les fragments non attribués appartiennent aux index supprimés, ce qui en fait des fragments orphelins qui ne seront jamais attribués, que des noeuds soient ajoutés ou non. Mais ce n'est pas le cas ici!

18
eliasah

Il y a plusieurs raisons possibles pour lesquelles l'allocation ne se produira pas:

  1. Vous exécutez différentes versions d'Elasticsearch sur différents nœuds.
  2. Votre cluster ne contient qu'un seul nœud, mais le nombre de réplicas est défini sur autre chose que zéro.
  3. Votre espace disque est insuffisant.
  4. L'affectation de tesson est désactivée.
  5. Vous avez un pare-feu ou SELinux activé. Avec SELinux activé mais non configuré correctement, vous verrez des fragments bloqués dans INITIALIZING ou RELOCATING pour toujours.

En règle générale, vous pouvez résoudre les problèmes suivants:

  1. Examinez les nœuds de votre cluster: curl -s 'localhost:9200/_cat/nodes?v'. Si vous n'avez qu'un seul nœud, vous devez définir number_of_replicas sur 0. (Voir la documentation de ES ou d'autres réponses).
  2. Examinez l’espace disque disponible dans votre cluster: curl -s 'localhost:9200/_cat/allocation?v'
  3. Vérifiez les paramètres du cluster: curl 'http://localhost:9200/_cluster/settings?pretty' et recherchez les paramètres cluster.routing
  4. Regardez quels fragments sont UNASSIGNED curl -s localhost:9200/_cat/shards?v | grep UNASS
  5. Essayez de forcer un fragment à être assigné 

    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
    
  6. Regardez la réponse et voyez ce qu'elle dit. Il y aura un tas de OUI qui sont ok, puis un NON. S'il n'y a pas de NON, c'est probablement un problème de pare-feu/SELinux.

100
Alcanzar

Il s'agit d'un problème courant lié au paramètre d'index par défaut, en particulier lorsque vous essayez de répliquer sur un seul nœud. Pour résoudre ce problème avec le paramètre de cluster transitoire, procédez comme suit:

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

Ensuite, activez le cluster pour réaffecter des fragments (vous pouvez toujours l'activer une fois que tout est dit et fait):

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

Maintenant, asseyez-vous et regardez le cluster nettoyer les fragments de répliques non attribués. Si vous souhaitez que cela prenne effet avec les index futurs, n'oubliez pas de modifier le fichier elasticsearch.yml avec le paramètre suivant et de faire rebondir le cluster:

index.number_of_replicas: 0
49
Philip M.

La seule chose qui a fonctionné pour moi a été de changer le nombre de répliques (j'avais 2 répliques, alors je l'ai changé en 1, puis de nouveau en 2).

Premier:

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

Ensuite:

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

Les deux premiers points de la réponse d'Alcanzar l'ont fait pour moi, mais je devais ajouter

"allow_primary" : true

ainsi

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
      }
    }
  ]
}'
4
dazl

Avec les nouvelles versions ES, cela devrait faire l'affaire (exécuté dans Kibana DevTools):

PUT /_cluster/settings
{
  "transient" : {
    "cluster.routing.rebalance.enable" : "all"
  }
}

Cependant, cela ne résoudra pas la cause première. Dans mon cas, il y avait beaucoup de fragments non attribués car la taille du réplica par défaut était de 1, mais en réalité je n'utilisais qu'un seul nœud. J'ai donc ajouté à ma elasticsearch.yml cette ligne:

index.number_of_replicas: 0
0
JohnP