elasticsearch - que faire des tessons non assignés?

mon groupe est jaune car certains fragments ne sont pas attribués. que faire avec cela?

j'ai essayé set cluster.routing.allocation.disable_allocation = false pour tous les index, mais je pense que cela ne fonctionne pas parce que j'utilise la version 1.1.1.

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

une idée?

EDIT :

  • 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
demandé sur eliasah 2014-05-14 17:45:09

6 réponses

ces fragments non attribués sont en fait des répliques non attribuées de vos fragments réels du noeud maître.

pour assigner ces fragments, vous devez exécuter une nouvelle instance d'elasticsearch pour créer un noeud secondaire pour transporter les répliques de données.

EDIT: parfois, les fragments non attribués appartiennent à des index qui ont été supprimés, ce qui en fait des fragments orphelins qui ne seront jamais assignés indépendamment de l'ajout de nœuds ou non. Mais ce n'est pas le cas ici!

19
répondu eliasah 2015-04-22 15:00:23

il y a de nombreuses raisons possibles pour lesquelles la répartition n'aura pas lieu:

  1. vous utilisez différentes versions D'Elasticsearch sur différents noeuds
  2. vous n'avez qu'un seul noeud dans votre cluster, mais vous avez un nombre de répliques fixé à quelque chose d'autre que zéro.
  3. vous n'avez pas assez d'espace disque.
  4. vous avez désactivé l'allocation des fragments.
  5. Vous avez un pare-feu ou SELinux est activé. Avec SELinux activé mais pas configuré correctement, vous verrez des fragments bloqués dans L'initialisation ou le déplacement pour toujours.

en règle générale, vous pouvez dépanner des choses comme ceci:

  1. regardez les noeuds de votre cluster: curl -s 'localhost:9200/_cat/nodes?v' . Si vous n'avez qu'un seul noeud, vous devez définir number_of_replicas à 0. (Voir la documentation sur les SE ou d'autres réponses).
  2. Regardez l'espace disque disponible dans votre groupe: curl -s 'localhost:9200/_cat/allocation?v'
  3. vérifiez les paramètres de cluster: curl 'http://localhost:9200/_cluster/settings?pretty' et cherchez cluster.routing paramètres
  4. regardez quels éclats ne sont pas attribués curl -s localhost:9200/_cat/shards?v | grep UNASS
  5. Essayer de forcer un tesson à être cédés

    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, et puis un non. S'il n'y a pas de non, c'est probablement un pare-feu/SELinux problème.

95
répondu Alcanzar 2016-11-15 13:18:13

il s'agit d'une question courante découlant du réglage par défaut de l'index, en particulier, lorsque vous essayez de répliquer sur un seul noeud. Pour corriger cela avec le réglage de cluster transitoire, faites ceci:

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

ensuite, activez le cluster pour réattribuer les fragments (vous pouvez toujours activer ceci après tout est dit et fait):

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

maintenant, asseyez-vous et regardez l'amas nettoyer les fragments de répliques non assignés. Si vous voulez que cela prenne effet avec futurs indices, n'oubliez pas de modifier elasticsearch.fichier yml avec le paramètre suivant et rebondir le cluster:

index.number_of_replicas: 0
49
répondu Philip M. 2015-08-29 18:37: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
     }
}
10
répondu Edi 2015-04-12 11:42:39

les 2 premiers points de la réponse D'Alcanzar l'ont fait pour moi, mais j'ai dû ajouter

"allow_primary" : true

comme si

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
répondu dazl 2016-12-04 13:46:33

vérifiez que les versions D'ElasticSearch sur chaque noeud sont les mêmes. Si ce n'est pas le cas, alors ES n'attribuera pas de copies de l'index aux "anciens" noeuds.

en utilisant la réponse de @Alcanzar, vous pouvez récupérer des messages d'erreur de diagnostic:

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

résultat:

{
  "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
}

comment déterminer le numéro de version de ElasticSearch:

adminuser@arc-elk-web:/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"
}

dans mon cas, j'ai mis en place le apt-get dépôt incorrect et ils sont sortis de synchronisation sur les différents serveurs. Je l'ai corrigé sur tous les serveurs avec:

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

et puis l'habituel:

sudo apt-get update
sudo apt-get upgrade

et un dernier redémarrage du serveur.

-1
répondu Guy 2017-01-06 14:06:19