etcd: узел не входит в кластер после переустановки
Каталог данных узла помнит, к какому кластеру он относится. После переустановки или клонирования образа идентификаторы расходятся, и узел получает отказ. Удалять каталог данных наугад опасно: на нём может лежать единственная актуальная копия состояния.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Каталог данных остался от другого кластера
Узел читает свой каталог и видит чужой идентификатор кластера. Присоединение отвергается.
-
Образ клонирован вместе с данными
Клонирование машины копирует и каталог данных, и идентификатор участника. Два узла заявляют одно и то же.
-
Адреса объявления не совпадают с настройками кластера
Участник объявляет себя по одному адресу, а кластер знает его по другому. Соединение не устанавливается.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сообщения о присоединении к кластеру.
journalctl -u etcd -n 40 --no-pager | grep -iE "mismatch|member|raft"Список участников с их адресами и идентификаторами.
sudo etcdctl member list 2>/dev/nullЗдоровье узлов кластера.
sudo etcdctl endpoint health 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Узел читает свой каталог и видит чужой идентификатор кластера. Присоединение отвергается.
- Как проверить
-
Посмотрите сообщения службы и каталог данных.
journalctl -u etcd -n 30 --no-pager | grep -iE "cluster ID mismatch|member" sudo ls -l /var/lib/etcd/ 2>/dev/null
- Как исправить
- Убедитесь, что актуальное состояние есть на других узлах, затем очистите каталог данных только этого узла и добавьте его в кластер как нового участника.
- Почему происходит
- Клонирование машины копирует и каталог данных, и идентификатор участника. Два узла заявляют одно и то же.
- Как проверить
-
Сравните идентификаторы участников на узлах.
sudo etcdctl member list 2>/dev/null; cat /etc/machine-id
- Как исправить
- Перед клонированием очищайте каталог данных и идентификатор машины. Уникальность идентификатора машины важна и для самого systemd.
- Почему происходит
- Участник объявляет себя по одному адресу, а кластер знает его по другому. Соединение не устанавливается.
- Как проверить
-
Сравните адреса объявления и список участников.
systemctl cat etcd | grep -iE "advertise|initial-cluster" sudo etcdctl member list 2>/dev/null
- Как исправить
- Приведите адреса объявления в соответствие со списком участников. Изменение адреса участника делается штатной командой, а не правкой настроек.
Пример вывода
Каталог данных остался от прежнего кластера. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
etcd[5200]: request cluster ID mismatch (got 8e9f1a2b3c4d5e6f want 1a2b3c4d5e6f7081)
etcd[5200]: rejecting connection from member with mismatched cluster ID
systemd[1]: etcd.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=238/STATE_DIRECTORY в systemd Код 238/STATE_DIRECTORY: не удалось подготовить постоянный каталог службы в /var/lib из StateDirectory=.
- MongoDB: NotWritablePrimary при записи Запись отклоняется: узел не является основным в наборе репликации. Разбор выборов и состояния узлов.
- MariaDB Galera: узел не стартует без bootstrap Кластер Galera не поднимается после полной остановки: нужен запуск первого узла особой командой и файл grastate.dat.
- Смена имени машины ломает работу служб После переименования часть служб отказывает: имя запомнено в настройках, сертификатах и кластерах.
- Узел кластера не поднимается: включён раздел подкачки Служба узла кластера отказывается стартовать при включённой подкачке. Как отключить правильно.
- Узел поиска не входит в кластер: имя кластера не совпадает Узел работает сам по себе: имя кластера или список узлов для обнаружения заданы иначе, чем у остальных.
- Узлы очередей не соединяются: не совпадает файл общего секрета Узлы не видят друг друга, а команды управления отказывают: файл общего секрета различается или недоступен.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Источники
- Документация etcd: работа с участниками кластера
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено запуском узла с каталогом данных от другого кластера.