Изменение лидерства кластера зоопарка, когда лидер умирает
Далеко внизу вы можете найти файлы docker-compose.yml.
Предпосылки:
Я запускаю 3 сервера zookeeper как кластер, используя docker-compose (docker-compose.yml, 3 zookeepers), затем добавляю 4. один (еще один docker-compose.yml, 1 zookeeper) в кластер. Лидером является один из первых трех зоопарков, как и ожидалось, четвертый.
Проблема:
Когда я останавливаю первых трех зоопарков (с помощью docker-compose down
), Я "теряю" лидера и ожидаю, что 4. зоопарк возьмет лидерство.
Единственное, что происходит, это то, что zookeeper показывает ошибки, например:
WARN Cannot open channel to 3 at election address localhost/127.0.0.1:43888
java.net.ConnectException: Connection refused
дела echo stat | nc localhost 52181 | grep Mode
ранее вернул режим follower
за этот последний зоопарк и сейчас ничего не возвращает.
Все еще работающий сервер zookeeper только говорит, например:
INFO Closed socket connection for client /127.0.0.1:43548 (no session established for client) (org.apache.zookeeper.server.NIOServerCnxn)
Решение 1:
Увеличение сроков не помогло, тот же результат:
ZOOKEEPER_TICK_TIME: 4000
ZOOKEEPER_INIT_LIMIT: 30
ZOOKEEPER_SYNC_LIMIT: 15
Решение 2:
- Другой способ Aorund:
Когда я сначала запускаю один сервер zookeeper (без других запущенных), он просто возвращает сообщения об ошибках (см. Ошибки выше) и, очевидно, работает неправильно echo stat | nc localhost 52181 | grep Mode
опять ничего не возвращает.
Когда я затем добавляю остальные 3 зоопарка в кластер, все работает хорошо, и первый сервер зоопарка является leader
,
Убийство первого зоопарка оставляет 3 бега, и один из них - новый leader
,
Вопрос:
- Я ожидаю, что если оставить в кластере одного зоопарка, он станет "лидером".
- Он работает "наоборот", как описано в решении 2 (но тогда не один, а три зоопарка оставлены работающими, только один убит).
- Почему он не работает так, как описано в проблеме, оставляя одного zookeeper в качестве лидера или одного рабочего сервера zookeeper, соответственно?
Файлы docker-compose.yml:
Я запускаю 3 сервера zookeeper с помощью docker-compose и следующего docker-compose.yml:
---
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
Я начинаю 4. таким же образом:
---
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
1 ответ
Имейте в виду одну вещь: zookeeper будет работать только в том случае, если работает большинство серверов. так что если у вас есть 4 сервера и вы отключите 3 из них, zookeeper будет работать только при запуске еще двух серверов.
какую версию zookeeper вы используете? если это до 3.5 или (вы используете 3.5 и не используете команды переконфигурирования), вам нужно будет перезапустить серверы, когда вы измените конфигурации.