etcd – Key-Value-Store für verteilte Systeme

17.12.2020Ricky Elfner
Cloud Kubernetes GNU/Linux Daemon Raft Distributed Web Storage

Was ist etcd?

etcd ist ein verteilter und konsistenter Key-Value-Store. Dieser bietet die Möglichkeit, einen zentralen, ausfallsicheren, fehlertoleranten und sicheren Speicherort für verteile Anwendungen anzubieten, bei denen sich immer wieder Informationen verändern. Dabei wurde etcd von dem CoreOS-Team entwickelt. etcd wurde –wie viele weitere Cloud Anwendungen– in Go geschrieben. Des Weiteren wird der Raft, ein Konsens-Algorithmus verwendet, um ein hochverfügbares repliziertes Protokoll verwalten zu können.

Der Name setzt sich dabei aus zwei Teilen zusammen. Der erste Teil etc steht für das zentrale Verzeichnis /etc für alle systemweiten Konfigurationsdateien innerhalb von GNU/Linux-Systemen. Während der zweite Teil, das d, die Abkürzung für distributed ist.

Zugleich ist etcd sehr bekannt durch seine Funktion als primärer Datenspeicher von Kubernetes. Dort wird es zur Sicherung und Replizierung von Kubernetes-Clustern verwendet. Dies ist zum Beispiel ein Grund, warum etcd sehr zuverlässig bei der Konfiguration, sowie beim Management sein muss.

Kernpunkte von etcd

Durch etcd ergeben sich folgende Vorteile:

  • simple: da es auf sehr gut definierte und benutzerorientierte API (gRPC) setzt, welche auf REST und JSON basieren
  • sicher: es wird standardmässig automatisch auf eine Übertragung via SSL/TLS verwendet. Zusätzlich gibt es auch noch die Möglichkeit Client-Zertifikat-Authentifizierung zu nutzen
  • schnell: Benchmarks bestätigen bis zu 10'000 Schreibvorgänge pro Sekunde
  • zuverlässig: durch den Raft-Algorithms wird der Speicher immer korrekt verteilt
  • replizierbar: da der gesamte Speicher auf jedem Knoten des Clusters verfügbar ist, ist dieser vollständig replizierbar
  • hohe Verfügbarkeit: einzelne Fehlerquellen werden vermieden
  • konsistent: über mehrere Hosts hinweg liefert jeder Lesevorgang den letzten Schreibvorgang.

Die Funktionsweise

Hier für muss man zunächst drei wichtige Begriffe im Zusammenhang mit der Verwaltung von Speichern kennen, nämlich

  • Anführer (Leader),
  • Wahlen (Elections)
  • Zeiträume (Terms)

Bei etcd wird immer für einen bestimmten Zeitraum ein Anführer gewählt. Dieser ist anschliessend für alle Anfragen zuständig, welche die Zustimmung des Clusters erfordern. Alle Änderungen von gesicherten Daten brauchen dabei eine Zustimmung des Anführers. Sollte es sich aber um andere Anfragen handeln, welche keine Zustimmung benötigen, dann können diese auch von den anderen Mitgliedern beantwortet werden. Hier gehören beispielsweise Leseanfrage dazu. Sobald der Anführer einmal nicht antworten sollte, weil er ausgefallen ist, werden direkt Neuwahlen durchgeführt und ein neuer Anführer wird bestimmt. Die Neuwahlen werden durch die Timer der einzelnen Knoten eingeleitet. Denn dadurch wird entschieden, wie lange es dauert bis eine Neuwahl gefordert wird. Bei dieser Forderung stellt der Knoten auch sich selbst als Kandidat zur Verfügung. Diese Zeiten können sich je nach Knoten unterscheiden. Durch dieses Prinzip kann gewährleistet werden, dass es zu keinem Unterbruch des festgelegten Ablaufs kommt.

Sobald die Anfrage von dem Anführer akzeptiert wurde, wird durch etcd gewährleistet, dass die Informationen über den Anführer an die nachfolgenden Konten repliziert werden. Bestätigen diese den Empfang, kann der Anführer auch die Änderungen übernehmen. Diese Änderung kann aufgrund des Raft Algorithmus erst durch die Befragung und Mehrheit der Knoten durchgeführt werden. Einzelne Knoten können durch eine Verweigerung die Stabilität und Funktionsfähigkeit schützen und auch Folgeprobleme vermeiden. Um dieses Prinzip aufrechtzuerhalten, sollte man bei der Planung darauf achten, dass die Anzahl von Knoten immer ungerade ist und zusätzlich die Anzahl von 7 Stück nicht übersteigt.

etcd und Kubernetes

etcd kommt schon seit 2014 bei Kubernetes zum Einsatz. Dort dient die etcd-Datenbank als Speicher für Konfigurationsdateien, den Status sowie Metadaten. Durch etcd wird gewährleistet, dass alle aus dem Cluster die Daten lesen und schreiben können. Des Weiteren wird der Zustand des gesamten Systems überwacht. Sollte sich der gewünschte Zustand mit dem aktuellen Zustand unterscheiden, kann Kubernetes Änderungen vornehmen, damit dies behoben wird.

Grundlegende Befehle von etcd

Im nachfolgenden Teil, können Sie sehen, wie die grundlegenden Befehle ausgeführt werden. Hierfür benötigen sie einen etcd Server und einen Client. Mit dem Befehl etcdctl greifen Sie vom Client aus auf den Server zu.

Hinzufügen eines Wertes

Um einen Wert in Ihren Key-Value-Store hinzuzufügen, benötigen Sie folgendes Kommando.

1
2
$ etcdctl put myKey myValue
> OK

Wenn der Befehl korrekt war und verarbeitet wurde, bekommen Sie ein OK als Antwort zurück.

Einen Key Auslesen

Im Anschluss, wollen Sie natürlich überprüfen, ob dieser Wert auch korrekt hinzugefügt wurde. Dabei bekommt man den Key, sowie die dazugehörige Value zurück. Möchte man aber nur die Value, gibt es die Option --print-value-only.

1
2
3
$ etcdctl get myKey
> myKey
> myValue
1
2
$ etcdctl get myKey --print-value-only
> myValue

Es gibt natürlich auch die Möglichkeit mehrere Keys auf einmal auszulesen. Um dies aufzuzeigen, gibt es bereits folgende Key-Value-Paare, welche ausgelesen werden soll:

1
2
3
4
myKey1 = myValue1
myKey2 = myValue2
myKey3 = myValue3
myKey4 = myValue4

Auch hier, können Sie ausschliesslich die Values auslesen, wenn dies bevorzugt wird. Des Weiteren müssen Sie hier beachten, dass myValue4 nicht ausgelesen wird. Stattdessen wird bis Value 4 gelesen.

1
2
3
4
$ etcdctl get myKey myKey4 --print-value-only
> myValue1
> myValue2
> myValue3

Es gibt aber natürlich die Möglichkeit, mit einem Prefix zuarbeiten, mit dem Sie alle unsere Beispiele auslesen können.

1
$ etcdctl get --prefix myKey

Einen Key Löschen

Auch beim Löschen haben Sie die Möglichkeit, einzelne Key-Value-Paare zu löschen oder eine bestimmte Reihe. Nachdem Sie den Befehl ausgeführt haben, bekommen Sie die Anzahl der gelöschten Paare zurück.

1
2
$ etcdctl del myKey
> 1

Wollen Sie sicher gehen, dass Sie die richtigen Daten gelöscht haben, können Sie diese Ausgabe auch Befehlen mittels --prev-kv.

1
2
3
4
$ etcdctl del --prev-kv myKey2 
> 1
> myKey2
> myValue2

Nun können Sie auch noch die beiden letzten Paare löschen.

1
2
$ etcdctl del --prefix myKey
> 2

Überwachung

Mittels etcd können Sie auch einzelne Keys überwachen, ob diese sich ändern. Um dies nachzustellen, können Sie in einem Terminal den Befehl zum Überwachen eingeben.

1
$ etcdctl watch myKey1

Nun wechseln Sie in ein zweites Terminal-Fenster und ändern der Wert von dem Key myKey1.

1
$ etcdctl put myKey1 myValue1

Durch diese Änderung bekommen Sie im ersten Terminal-Fenster die Meldung einer Änderung.

1
2
3
> PUT
> myKey1
> myValue2`

Selbstverständlich können Sie aber nicht nur einzelne Werte überwachen, sondern auch eine ganze Reihe.

1
$ etcdctl watch --prefix myKey

Ein weiterer Vorteil von etcd ist, dass Sie die Möglichkeit haben auch ältere Änderungen nachzuverfolgen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ etcdctl watch --rev=2 myKey1
> PUT
> myKey1
> myValue1
> DELETE
> myKey1

> PUT
> myKey1
> myValue1
Ricky Elfner

Ricky Elfner – Denker, Überlebenskünstler, Gadget-Sammler. Dabei ist er immer auf der Suche nach neuen Innovationen, sowie Tech News, um immer über aktuelle Themen schreiben zu können.