2016-11-04 4 views
3

Ich mache meine ersten Schritte mit Docker Swarm und frage mich, wie man mit Diensten umgehen, die persistente Daten wie redis, elasticsearch oder eine Datenbank verwenden.Docker Swarm mit Daten: Shared Volumen vs Clustering vs Einzelinstanz

Ich habe viele Tutorials zur Konfiguration von redis/elasticsearch/database clustern mit docker swarm gefunden - aber ist es nicht einfacher, einen freigegebenen Speicher zu verwenden? Zum Beispiel arbeite ich mit Azure, also könnte ich einfach einen einzelnen Azure-Dateispeicher als ein redis/elasticsearch/Datenbank-Datenträger verwenden und alle meine Knoten diesen Dateispeicher mounten lassen. Ist dies ein akzeptabler Ansatz oder gibt es erhebliche Nachteile (z. B. wenn zwei oder mehr Datenbankinstanzen gleichzeitig versuchen, auf diesen Speicher zu schreiben)?

Wird es überhaupt empfohlen, solche "Daten" -Dienste in alle Knoten zu verwenden? Oder sollte ich Docker Swarm nur für Frontend-Dienste verwenden und einen einzigen redis/elasticsearch/database Service haben?

Antwort

1

Wenn Sie einen freigegebenen Ordner verwenden möchten, auf den von mehr als einer Anwendungsinstanz zugegriffen wird, muss die Anwendung selbst so entworfen werden, dass Datenbeschädigung vermieden wird (keine bestimmte Datei wird gleichzeitig von mehr als einer Anwendung geschrieben) Mutex Locks)

Alle Datenbanken, die ich kenne, sind nicht auf diese Weise entworfen, so dass Sie sie nicht mit freigegebenen Speicher verwenden können.

Normalerweise wird stattdessen die gesamte Datenbank in einem Cluster verbunden, und die Synchronisierung erfolgt auf Softwareebene.

+0

Vielen Dank für Ihre Gedanken! Im Moment plane ich einen komplexen Schwarmcluster mit verschiedenen Diensten, die nicht zustandslos sein können. Meine Ergebnisse sind die gleichen wie bei Ihnen: 1. Vermeiden Sie die Verwendung von freigegebenen Volumes. 2. Verwenden Sie Cluster-Funktion, wenn der Service sie bereitstellt. 3. Vermeiden Sie einzelne Instanzen eines Service (in Produktion) aus Gründen der Ausfallsicherheit. Eine andere Sache, die ich kam, war die Frage: (Zum Beispiel) Wenn eine meiner gruppierten Datenbanken stirbt, wie sollte mein Knoten von der gleichen Maschine aus reagieren? Meine Antwort: Markieren Sie den gesamten Rechner als "krank", damit er nicht mehr erreichbar und/oder neu gestartet werden kann. – Munchkin

+0

Wenn Sie den DB-Container als Dienst bereitstellen, können Sie checkchecks verwenden. Wenn der Container also wirklich tot ist, wird docker swarm ihn beenden und einen neuen hochfahren, was nur wenige Sekunden Ausfallzeit bedeutet. Wenn Sie mysql verwenden, arbeite ich gerade auf einer sehr einfachen Clustering-Lösung, so dass Sie viele Instanzen bereitstellen können und sie werden alle zusammen mit dem Gallera-Cluster synchronisieren, so dass ein Problem ist kein Problem ist es noch nicht fertig, aber vielleicht in ein paar Wochen Zeit. https://github.com/vipconsult/percona-docker/tree/master/pxc-57 –