2015-05-07 8 views
5

Ich kämpfe derzeit mit folgendem Problem:in Hazelcast Mehrknoten-Docker Umgebungen mit TCPIP

ich eine Java-EE-Anwendung, die in einem Cluster ausgeführt werden soll fähig sein (es tatsächlich der Fall ist). Für den Datenaustausch zwischen den Knoten verwende ich Hazelcast 3.3.3. Da unsere Kunden Angst vor UDP haben, verwenden wir TCP. Also konfiguriere ich 3 Hascast-Parameter pro Knoten: Die Netzwerkschnittstelle zu verwenden, den Port und die Mitglieder des Clusters. Im wirklichen Leben (keine Docker-Umgebung) funktioniert alles. Jetzt möchte ich meine Java EE-Server in Docker-Container (einen pro Knoten) und auch über Hazelcast verknüpfen.

Was ich tat, war:

auf dem Host-Computer ausgeführt wird, die Docker-Container I mehrere virtuelle Netzwerkschnittstellen (172.21.0.X) erstellt. für jeden Docker Container gab ich Netzwerk-Mappings wie -p 172.21.0.X: 5190: 5190 (5190 ist die Port I für Hazelcast verwenden)

In meiner Java-EE-Anwendung innerhalb des Behälters I Hazelcast Schnittstelle zu hören konfigurierte 172.21.0.X, Port 5190 Mitglieder 172.21.0.X: 5190, ...... Das Problem ist jetzt: Docker weist jedem Münzprüfer eine interne IP-Nummer zu. Im Voraus kann ich nicht sicher sein, welches IP-Nummer-Andockgerät zugewiesen wird. Es ist definitiv nicht die IP, die ich verwenden möchte (172.21.0.X). Hazelcast startet und sagt mir: keine passende Schnittstelle gefunden. Natürlich nicht. Hazelcast überprüft die IP-Schnittstellen des Andock-Containers, etwa 172.4.XX. Dies passt nicht zu der Konfiguration, die ich Haselcast gegeben habe (benutze 172.21.X.X).

Bisher scheint es nicht möglich zu sein, die interne IP-Nummer eines Andock-Containers anzugeben. Ich könnte es von einem laufenden Container abfragen, aber das ist zu spät, da ich die Konfiguration meines Java EE Servers VOR dem Starten des Containers vornehmen muss.

Irgendwelche Hinweise darauf? Ist es möglich, den Hazelcast mit TCPIP laufen zu lassen?

Antwort

4

Dieser Thread und die Antwort von Nick Scavelli ist, was ich denke, dass Sie suchen.

https://groups.google.com/forum/#!msg/vertx/MvKcz_aTaWM/QM6CfllX9HQJ

+0

Die Verwendung der "public-address" in der hazelcast-Konfiguration für das Netzwerk hat die Aufgabe erfüllt. Setzen Sie es auf die IP-Adresse, der Andock-Container ist von extern erreichbar und funktioniert. Vielen Dank. – magicroomy

4

Dieser Thread gibt eine Antwort und ein Beispiel: https://groups.google.com/d/msg/orient-database/ehfKcInWZXs/wxs8xLUOGB8J

Grundsätzlich Sie Hazelcast Variablen in Hazelcast-Datei verwenden, dh

<property name="hazelcast.local.localAddress">${hazelcast.ip}</property> 

Dann, wenn Sie die Docker laufen enthalten Sie hinzufügen:

-e IP=`ip route | awk '/default/ { print $9 }'` 

Legt eine Umgebungsvariable im Andockcontainer fest. Dann dort tun Sie etwas wie folgt aus:

CMD ["java", "-Dhazelcast.ip=${IP}", ... 

So ist es die Docker env Variable nehmen und Zerschlagung in Java als eine Definition, die dann Hazelcast herauspickt und ersetzt in sie zur Laufzeit-Konfigurationsdatei ist.

+0

Eigenschaft * haselcast.local.localAddress * ist nicht mehr gültig –

0

Ich möchte @ Gremwells Antwort auf den neuesten Stand bringen, denn jetzt ist es nicht ganz korrekt. Die Eigenschaft hazelcast.local.localAddress ist nicht mehr gültig. Stattdessen sollte man dieses Snippet in hazelcast einfügen.xml

<network> 
     <public-address>${hazelcast.ip}:${hazelcast.port}</public-address> 
     <port auto-increment="false" port-count="100">${hazelcast.port}</port> 
     ... 
    </network> 

dann die params passiert beim Start Docker Container (I offizielles Hazelcast Bild verwenden und montiert Ordner mit meinem config Option -v)

sudo docker run -p 5701:5701 -e JAVA_OPTS="-Dhazelcast.config=/etc/conf/hazelcast.xml -Dhazelcast.ip=`ip route get 8.8.8.8 | awk '{print $NF; exit}'` -Dhazelcast.port=5701" -v /data/docker/hazelcast:/etc/conf -ti hazelcast/hazelcast 

Befehl -Dhazelcast.ip=ip route get 8.8.8.8 | awk '{print $NF; exit}' nimmt IP-Host-Maschine und gibt es im Innern Konfigurationsdatei als hazelpause.ip-Variable. Die Zuordnung von innerem Port und Docker-Port sollte an drei Stellen gleich 5701 sein. Nächster Container läuft mit 5702 und so weiter.

Hoffe, das hilft.