webentwicklung-frage-antwort-db.com.de

elasticsearch - Was tun mit nicht zugeordneten Shards?

mein Cluster hat einen gelben Status, da einige Scherben nicht zugewiesen sind. was soll ich damit machen?

Ich habe versucht, cluster.routing.allocation.disable_allocation = false für alle Indizes festzulegen, aber ich denke, dass dies nicht funktioniert, da ich Version 1.1.1 verwende.

Ich habe auch versucht, alle Maschinen neu zu starten, aber das passiert auch.

Irgendeine Idee?

BEARBEITEN:

  • Clusterstat: 

    { 
      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

Bei diesen nicht zugewiesenen Shards handelt es sich tatsächlich um nicht zugewiesene Replikate Ihrer tatsächlichen Shards vom Master-Knoten.

Um diese Shards zuordnen zu können, müssen Sie eine neue Instanz von Elasticsearch ausführen, um einen sekundären Knoten für die Datenreplikate zu erstellen.

EDIT: Manchmal gehören die nicht zugewiesenen Shards zu gelöschten Indizes und machen sie zu Waisen-Shards, die niemals zugewiesen werden, egal ob Knoten hinzugefügt werden oder nicht. Aber hier ist es nicht der Fall!

18
eliasah

Es gibt viele mögliche Gründe, warum keine Zuweisung erfolgt:

  1. Sie führen verschiedene Versionen von Elasticsearch auf verschiedenen Knoten aus
  2. Sie haben nur einen Knoten in Ihrem Cluster, die Anzahl der Replikate ist jedoch auf einen anderen Wert als Null gesetzt.
  3. Sie haben nicht genügend Speicherplatz.
  4. Sie haben die Shard-Zuweisung deaktiviert.
  5. Sie haben eine Firewall oder SELinux aktiviert. Wenn SELinux aktiviert, aber nicht ordnungsgemäß konfiguriert ist, werden Shards für immer in INITIALIZING oder RELOCATING hängen bleiben.

In der Regel können Sie folgende Probleme beheben:

  1. Sehen Sie sich die Knoten in Ihrem Cluster an: curl -s 'localhost:9200/_cat/nodes?v'. Wenn Sie nur einen Knoten haben, müssen Sie number_of_replicas auf 0 setzen. (Siehe ES-Dokumentation oder andere Antworten).
  2. Sehen Sie sich den verfügbaren Speicherplatz in Ihrem Cluster an: curl -s 'localhost:9200/_cat/allocation?v'
  3. Überprüfen Sie die Cluster-Einstellungen: curl 'http://localhost:9200/_cluster/settings?pretty' und suchen Sie nach cluster.routing-Einstellungen
  4. Schauen Sie sich an, welche Shards UNASSIGNED sind curl -s localhost:9200/_cat/shards?v | grep UNASS
  5. Versuchen Sie, einen Shard zuzuweisen 

    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. Sehen Sie sich die Antwort an und sehen Sie, was darin steht. Es wird eine Reihe von JA geben, die in Ordnung sind, und dann ein NEIN. Wenn es keine NEIN gibt, handelt es sich wahrscheinlich um ein Firewall/SELinux-Problem.

100
Alcanzar

Dies ist ein häufiges Problem, das sich aus der Standardindexeinstellung ergibt, insbesondere wenn Sie versuchen, auf einem einzelnen Knoten zu replizieren. Um dies mit der Einstellung für vorübergehende Cluster zu beheben, führen Sie folgende Schritte aus:

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

Aktivieren Sie anschließend das Cluster zur Neuzuweisung von Shards (Sie können dies jederzeit aktivieren, wenn alles gesagt und erledigt ist):

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

Jetzt lehnen Sie sich zurück und beobachten Sie, wie der Cluster die nicht zugewiesenen Replikat-Shards aufräumt. Wenn Sie möchten, dass dies für zukünftige Indizes wirksam wird, vergessen Sie nicht, die Datei elasticsearch.yml mit der folgenden Einstellung zu ändern und den Cluster abzubrechen:

index.number_of_replicas: 0
49
Philip M.

Das einzige, was für mich funktionierte, war das Ändern der number_of_replicas (ich hatte 2 Repliken, also habe ich es auf 1 geändert und dann wieder auf 2 geändert).

Zuerst:

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

Dann:

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

Die ersten beiden Punkte der Antwort von Alcanzar haben es für mich getan, aber ich musste hinzufügen

"allow_primary" : true

wie so

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

Bei neueren ES-Versionen sollte dies den Trick erfüllen (läuft in Kibana DevTools):

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

Dies kann jedoch die Ursache nicht beheben. In meinem Fall gab es viele nicht zugewiesene Shards, da die Standardreplikatengröße 1 betrug, aber eigentlich nur ein einzelner Knoten verwendet wurde. Also fügte ich meinem elasticsearch.yml diese Zeile hinzu:

index.number_of_replicas: 0
0
JohnP