Vous trouverez ci-dessous les fichiers docker-compose.yml.Changement de la direction du cluster de zookeeper lorsque le leader meurt
Pré-requis:
Je commence à 3 serveurs Zookeeper en tant que cluster à l'aide docker-Compose (docker-compose.yml, 3 zookeepers), puis-je ajouter un 4. un (un autre docker- compose.yml, 1 zookeeper) au cluster. L'un des 3 premiers zookeepers est le leader, le 4. est un suiveur, comme prévu.
Problème:
Quand j'arrête les trois premiers (zookeepers au moyen de docker-compose down
), je « perdre » le leader et je me attends le 4. Zookeeper de prendre la direction.
La seule chose qui arrive est que Zookeeper montre des erreurs, .: par exemple
WARN Cannot open channel to 3 at election address localhost/127.0.0.1:43888
java.net.ConnectException: Connection refused
Faire echo stat | nc localhost 52181 | grep Mode
précédemment retourné le mode follower
pour ce dernier Zookeeper et retourne maintenant rien.
Le serveur Zookeeper encore runnng dit que, par exemple:
INFO Closed socket connection for client /127.0.0.1:43548 (no session established for client) (org.apache.zookeeper.server.NIOServerCnxn)
Solution 1:
L'augmentation des délais n'a pas aidé, même résultat:
ZOOKEEPER_TICK_TIME: 4000
ZOOKEEPER_INIT_LIMIT: 30
ZOOKEEPER_SYNC_LIMIT: 15
Solution 2:
- L'autre façon aorund:
Quand je démarre le serveur Zookeeper seul au premier (sans les autres déjà en cours d'exécution), il retourne juste des messages d'erreur (voir les erreurs ci-dessus) et n'est évidemment pas runni ng correctement puisque echo stat | nc localhost 52181 | grep Mode
ne renvoie rien à nouveau.
Lorsque j'ajoute ensuite les 3 autres zookeepers au cluster, tout fonctionne bien et le premier serveur zookeeper est le leader
.
Tuer le premier gardien de zoo laisse 3 en marche et l'un d'eux est le nouveau leader
.
Question:
- Je pense que laisser un seul Zookeeper du cluster en fait le 'leader'.
- Il fonctionne "dans l'autre sens" comme décrit dans la solution 2 (mais pas un, mais trois gardiens de zoo sont laissés en marche, un seul est tué).
- Pourquoi cela ne fonctionne-t-il pas comme décrit dans le problème, en laissant le zookeeper unique en tant que leader ou en tant que serveur de zookeeper travaillant seul, respectivement?
fichiers docker-compose.yml:
Je commence à 3 serveurs Zookeeper avec docker-Compose et le docker-compose.yml suivante:
---
version: '2'
services:
zookeeper_1:
image: confluentinc/cp-zookeeper:3.1.1
network_mode: host
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 22181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888
zookeeper_2:
image: confluentinc/cp-zookeeper:3.1.1
network_mode: host
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888
zookeeper_3:
image: confluentinc/cp-zookeeper:3.1.1
network_mode: host
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 42181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888
Le départ I un 4. de la même manière:
---
version: '2'
services:
zookeeper_4:
image: confluentinc/cp-zookeeper:3.1.1
network_mode: host
environment:
ZOOKEEPER_SERVER_ID: 4
ZOOKEEPER_CLIENT_PORT: 52181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888
Cela m'a conduit dans la bonne direction, merci! Je vais mettre à jour ma question dès que possible. – rocksteady