Verteilte Systeme mit Etcd in der Praxis

Seite 2: Key-Value-Knoten

Inhaltsverzeichnis

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.

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.