Verteilte Systeme mit Etcd in der Praxis

Key-Value-Knoten

Spielereien mit Key-Value-Knoten

Generell ist bei der Interaktion mit Etcd darauf zu achten, dem cURL-Kommando immer den Parameter -L mitzugeben. Dieser sorgt dafür, dass der Befehl eventuellen Redirects folgt, von denen Etcd exzessiven Gebrauch macht.

Folgendes Kommando erstellt einen simplen Knoten:

curl -L http://${DOCKER_HOST_IP}:7001/v2/keys/forever \
-XPUT -d value="I am here forever"

Als Antwort sollte folgendes JSON-Dokument zurückgegeben werden:

{
"action":"set",
"node":{
"key":"/forever",
"value":"I am here forever",
"modifiedIndex":7,
"createdIndex":7
}
}

Der Parameter action steht für die durchgeführte Operation. Das in node abgelegte JSON-Objekt enthält alle Informationen rund um den Knoten. Neben key und value finden sich hier der modifiedIndex, der für jede Veränderung durch ein update hochgezählt wird, und der createIndex, der für jedes Erzeugen des Knotens erhöht wird.

Dessen Existenz überprüft folgendes Kommando:

curl -L http://${DOCKER_HOST_IP}:7001/v2/keys/forever

Erfolg meldet das Resultat

{
"action":"get",
"node":{
"key":"/forever",
"value":"I am here forever2",
"modifiedIndex":7,
"createdIndex":7
}
}

Der nun folgende Befehl erzeugt durch Verwenden des ttl-Flags einen Knoten mit einer Lebenszeit von fünf Sekunden:

curl -L http://${DOCKER_HOST_IP}:7001/v2/keys/temporary \
-XPUT -d value="I will be gone soon" -d ttl=5

Seinen Zustand überprüft folgendes Kommando:

curl -L http://${DOCKER_HOST_IP}:7001/v2/keys/temporary

Falls zwischen den beiden Befehlen mehr als fünf Sekunden verstreichen, hat der Knoten seine Lebensdauer überschritten, was zu folgender Meldung führt:

{
"errorCode":100,
"message":"Key not found",
"cause":"/temporary",
"index":9
}

Eine wichtige Eigenschaft von TTL-Knoten ist die Möglichkeit, ihn über einen Refresh mit der Ergänzung -d prevExist=true am Leben zu halten:

curl -L http://${DOCKER_HOST_IP}:7001/v2/keys/temporary \
-XPUT -d value="I will be gone soon" -d ttl=5 -d prevExist=true

Wenn dieses Kommando vor dem Erreichen der TTL ausgeführt wird, bleibt der Knoten erhalten.

Spielereien mit Verzeichnis-Knoten

Um einen hierarchischen Graphen aufzubauen, wird zunächst ein Verzeichnisknoten benötigt, der mit dem dir-Flag als true entsteht:

curl -L http://${DOCKER_HOST_IP}:7001/v2/keys/queue -XPUT -d dir=true

Als Ergebnis liefert Etcd folgendes Dokument:

{
"action":"set",
"node":{
"key":"/myDir",
"dir":true,
"modifiedIndex":11,
"createdIndex":11
}
}

Innerhalb eines solchen Verzeichnisses haben weitere Knoten oder Verzeichnisse Platz. Praktischerweise bietet Etcd die Möglichkeit, Knoten automatisch zu nummerieren und dadurch sortiert abzulegen. Durch das Ausführen eines HTTP-POSTs, der nur einen value setzt, wird ein solcher Schlüssel automatisch vergeben:

curl http://${DOCKER_HOST_IP}:7001/v2/keys/queue \
-XPOST -d value=Job1
curl http://${DOCKER_HOST_IP}:7001/v2/keys/queue \ 
-XPOST -d value=Job2

Das Ergebnis dieser Kommandos lässt sich wieder mit einem einfachen HTTP-GET überprüfen:

curl http://${DOCKER_HOST_IP}:7001/v2/keys/queue

Das Antwort-JSON sollte in etwa wie folgt aussehen:

{
"action":"get",
"node":{
"key":"/queue",
"dir":true,
"nodes":[
{
"key":"/queue/12",
"value":"Task1",
"modifiedIndex":12,
"createdIndex":12
},
{
"key":"/queue/17",
"value":"Task2",
"modifiedIndex":17,
"createdIndex":17
}],
"modifiedIndex":11,
"createdIndex":11
}
}

So lassen sich auf einfache Art und Weise Work-Queues erzeugen.