Elastic Search - Shard-Verteilung kontrollieren

Post date: Jun 9, 2013 8:21:28 AM

Um die Last optimal in den Cluster zu verteilen, die Skalierbarkeit und die Ausfallsicherheit des Clusters zu gewährlesiten und die verschiedenen Shards die Teil eines Index sind effizient aufzuteilen muss Elastic Search die Zuteilung der unterschiedlichen Shards auf den Knoten berechnen.

Gelegentlich, insbesondere nach einem gesamten Cluster Restart um die Antwortzeiten optimal zu halten ist es sinnvoll die Shard-Verteilung explizit auszuschalten. Das kann durch folgende Konfiguration (die "cluster.routing.allocation.disable_allocation" und "cluster.routing.allocation.disable_replica_allocation" Parameter) in der elasticsearch.yml Datei aktiviert werden.

Das Elastic Search "head" Plugin das nach der Installation auf der lokalen Maschine auf dem standardmäßigen Port verfügbar ist (http://localhost:9200/_plugin/head/) zeigt eine umfassende Übersicht der unterschiedlichen Shards und deren Verteilung zwischen den Knoten auf. In manchen Fällen ist deren Verteilung aber nicht optimal und dann ist es sinnvoll die Shard-Verteilung explizit zu definieren. Um das zu realisieren sind folgende Schritte notwendig:

1) Definiere die Zone zu der ein einzelner Knoten zugeteilt werden soll (mit Hilfe von dem "node.zone" Parameter in der elasticsearch.yml Datei):

node.zone = "technical_books_zone"

2) Erstelle einen Index in einer bestimmten Zone (er kann auch über zwei Zones verteilt werden, in diesem Fall sollen die Zones durch Komma getrennt werden):

curl -XPOST 'localhost:9200/books'

curl -XPUT 'localhost:9200/books/_settings' -d '{"index.routing.allocation.include.zone" : "technical_books_zone"}'

Ein Knoten kann aus einer spezifischen Zone mit Hilfe von dem "index.routing.allocation.exclude.zone"-Parameter ausgeschlossen werden. Elastic Search bietet auch die Möglichkeit die Einbeziehung und den Ausschluss auf IP-Adresse Ebene durch die "index.routing.allocation.include._ip" and "index.routing.allocation.exclude._ip" Optionen die zum oben erwähnten "_settings" Endpoint übergeben werden zu konfigurieren, an. Es ist möglich eine Liste von IP-Adressen (durch Komma getrennt)zu übergeben.

Shard-Verteilung auf Cluster-Ebene kann durch die "index.routing.allocation.include._ip" Option die zum "_settings" Endpoint übergeben wird, konfiguriert werden.

Eine andere Fähigkeit die von Elastic Search angeboten wird ist die Anzahl der Shards per Knoten (durch die "index.routing.allocation.total_shards_per_node" Option die zum "_settings" Endpoint auf Index-Ebene übergeben wird) zu spezifizieren. Diese Einstellung kann entweder in einer dynamischen Art und Weise (wie oben erwähnt) oder statisch in der elasticsearch.yml konfiguriert werden.

Falls der Cluster-Zustand rot wird, ist es klar dass nicht alle primären Shards in der spezifizierten Art und Weise verteilt werden konnten und in diesem Fall ist es zu empfehlen besonders aufmerksam zu werden um die Fehler beheben zu können.

Die manuelle Bewegung der Shards und deren Replicas ist ein anderes Highlight das von Elastic Search in diesem Bereich angeboten wird. Der "_cluster/reroute" Endpoint ist für diesen Zweck gedacht worden. Es ist möglich, ein Shard von einem Knoten zum Anderen zu bewegen, die Shard-Zuteilung abzubrechen oder zu forcieren. Alle diesen Operationen können mit Hife des "commands" JSON Array der zum "reroute" Endpoint auf Cluster-Ebene übergeben wird, spezifiziert werden. Der Code-Ausschnitt unten veranschaulicht diesen Fall:

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{

"commands": [

{

"allocate": {

"index": "books",

"shard": 0, //Shard

"node": "Franz Kafka"

}

},

{

"move": {

"index": "books",

"shard": 1, //Anzahl der Shards die übertragen werden sollen

"from_node": "Franz Kafka",

"to_node": "Steve Jobs"

}

},

{

"cancel": {

"index": "books",

"shard": 1, //Shard

"node": "Albert Einstein"

}

}

]

}'

Standardmäßig wird Shard-Rebalancing nach der vollen Initialisierung der Shards und deren Replicas stattfinden. Dieser Wert kann durch die "cluster.routing.allocation.allow_rebalance" Option konfiguriert werden. Der Standardwert für diese Option ist "indices_all_active". Andere möglichen Werte für diese Einstellung sind "always" und "indices_primaries_active".

Die folgende Tabelle fasst die Möglichkeiten für die detaillierte Konfiguration des Rebalancing-Prozesses zusammen:

Column: Einstellung

1) Kontrolliert die Anzahl der Shards die nebenläufig zwischen den Knoten bewegt werden können.

Sie spezifiziert die Anzahl der Shards die auf einmal gleichzeitig bewegt werden können, Defaultwert ist 2.

2) Kontrolliert die Anzahl der Shards die gleichzeitig auf einem Knoten initialisiert werden können.

Der Shard Recovery-Prozess ist sehr I/O intensiv und Aufmerksamkeit ist in diesem Bereich zu empfehlen.

3) Kontrolliert die Anzahl der Primary-Shards die nebenläufig auf einem Knoten initialisiert werden können.

Column: Parameter

1) cluster.routing.allocation.cluster_concurrent_rebalance

2) cluster.routing.allocation.node_concurrent_recoveries

3) cluster.routing.allocation.node_initial_primaries_recoveries

Abschließend lässt sich sagen, dass explizite Shard-Verteilung und Rebalancing kann helfen, den Elastic Search Cluster optimal für Load-Balancing, Ausfallsicherheit und Hochverfügbarkeit-Zwecke zu konfigurieren.