Динамическое изменение конфигурации
etcd поддерживает поэтапное изменение конфигурации во время работы, позволяя обновлять состав кластера без остановки.
Запросы изменения конфигурации обрабатываются только при работающем большинстве участников. В производственной среде настоятельно рекомендуется кластер размером более двух. Удалять участника из кластера из двух участников небезопасно: его большинство также равно двум, поэтому ошибка во время удаления может остановить кластер и потребовать перезапуска после потери большинства .
Архитектура описана в документе о динамическом изменении конфигурации .
Сценарии реконфигурации
В этом разделе рассмотрены распространённые причины изменения конфигурации. Обычно это сочетания добавления и удаления участников, описанные в разделе Операции изменения конфигурации кластера .
Поочерёдная замена или обновление машин
Если несколько участников кластера необходимо переместить из-за запланированного обслуживания (обновления аппаратного обеспечения, простоя сети и т. д.), рекомендуется изменять их по одному.
Лидера можно безопасно удалить, но во время выборов возникнет краткий простой. Если кластер содержит более 50MB данных v2, рекомендуется перенести каталог данных участника .
Изменение размера кластера
Увеличение размера кластера может повысить устойчивость к отказам участников и обеспечить лучшую производительность чтения. Поскольку клиенты могут читать из любого участника, увеличение числа участников увеличивает общую серийную пропускную способность чтения.
Уменьшение размера может ускорить запись ценой отказоустойчивости. До фиксации запись реплицируется большинству участников; меньшее большинство подтверждает её быстрее.
Заменить сбойную машину
Машину, отказавшую из-за оборудования, повреждения каталога данных или другой критической причины, следует заменить как можно скорее. Неудалённый отказавший участник ухудшает кворум и снижает устойчивость к следующему отказу.
Для замены удалите участника , затем добавьте нового . Если кластер содержит более 50MB и каталог отказавшего участника доступен, рекомендуется перенести его .
Перезапуск кластера после потери большинства
При потере большинства или изменении IP-адресов всех узлов требуется ручное восстановление: создать новый кластер из старых данных , принудительно назначить одного участника лидером, затем по одному добавить новых участников .
Восстановить кластер после миноритарной ошибки
Потеря отдельного участника эквивалентна замене отказавшей машины; см. Замена отказавшей машины .
Операции перенастройки кластера
Для этих сценариев используются следующие операции.
Перед внесением любых изменений должно быть доступно простое большинство (кворум) участников etcd. Это в сущности то же самое требование для любого вида записи в etcd.
Все изменения в кластере должны выполняться последовательно:
- Чтобы обновить peerURLs одного участника, выполните операцию обновления.
- Чтобы заменить одного исправного участника, удалите старого и добавьте нового.
- Для увеличения с 3 до 5 участников выполните две операции добавления.
- Для уменьшения с 5 до 3 выполните две операции удаления.
Во всех примерах используется поставляемая с etcd утилита etcdctl. Чтобы
изменить состав без etcdctl, используйте HTTP API участников v2
или
gRPC API участников v3
.
Обновление участника
Обновление адресов клиентов для обмена
Для обновления адресов advertise клиентских URL-ов участника достаточно перезапустить этот участник с флагом (--advertise-client-urls) или переменной окружения (ETCD_ADVERTISE_CLIENT_URLS) обновленными клиентскими URL-ами. Перезапущенный участник сам опубликует обновленные URL-ы. Неправильно обновленный клиент (URL) не повлияет на состояние здоровья кластера etcd.
Обновление анонсируемых адресов пеерконтроллеров
Для обновления адресов пеер-членов участника, сначала явно обновите его с помощью команды member, а затем перезапустите участника. Дополнительное действие необходимо, так как обновление адресов пеер-членов изменяет конфигурацию кластера и может повлиять на состояние etcd кластера.
Для обновления объявляемых URL сначала найдите ID участника. Список выводится командой etcdctl:
Пример выполняет update участника с ID a8266ecf031671f3 и задаёт peerURLs
http://10.0.1.10:2380:
Удалить участника
Предположим, что идентификатор участника для удаления — a8266ecf031671f3. Используйте команду remove для выполнения удаления:
Целевой участник остановит себя на этом этапе и выведет удаление в лог:
Было бы безопасно удалить лидера, однако кластер будет неактивен до тех пор, пока не будет выбран новый лидер. Этот период составляет обычно сумму тайм-аута выборов и процесса голосования.
Добавление нового участника
Добавление участника является двухэтапным процессом:
- Добавьте участника через HTTP API участников
, gRPC API участников
или
etcdctl member add. - Запустите его с новой конфигурацией кластера и обновлённым списком участников (существующие + новый).
etcdctl добавляет участника по его имени
и
объявляемым URL однорангового узла
:
etcdctl уведомил кластер о новом участнике и вывел переменные окружения, необходимые для успешного запуска. Теперь запустите новый процесс etcd с соответствующими флагами для нового участника:
Новый участник будет функционировать как часть кластера и немедленно начнет синхронизироваться с остальными участниками кластера.
При добавлении нескольких участников настраивайте их по одному и проверяйте
запуск. После добавления участника в кластер из 1 узла кластер не продвигается,
пока новый участник не запустится: для консенсуса теперь нужно большинство из
двух. Пауза длится от etcdctl member add до успешного соединения нового участника.
Добавление нового участника как обучающегося
Начиная с v3.4 etcd поддерживает добавление обучающегося участника без права голоса. Мотивация и дизайн можно найти в документе по дизайну . Чтобы сделать процесс добавления нового участника безопаснее, и снизить время простоя кластера при добавлении нового участника, рекомендуется добавлять новый участник в кластер как обучающийся до тех пор, пока он не синхронизируется. Это можно описать как трехступенчатый процесс:
Добавьте новый участник как обучающийся участника через gRPC members API или команду
etcdctl member add --learner.Запустите нового участника с новой конфигурацией и обновлённым списком участников (существующие + новый). Этот шаг не отличается от описанного выше.
Промотировать новый добавленный обучающийся до участника с правом голоса через gRPC members API или командой
etcdctl member promote. сервер etcd проверяет запрос на промотацию для обеспечения его оперативной безопасности. Только после того как лог raft обучающегося участника захватит лог лидера, он может быть промовирован до участника с правом голоса. Если обучающийся участник не захватил лог лидера, запрос на промотацию участника завершится неудачей (см. раздел об ошибках при промотации участника для получения дополнительной информации). В этом случае пользователь должен подождать и повторить попытку позже.
В v3.4 сервер etcd ограничивает количество обучающихся участников, которые может иметь кластер, одним. Основное соображение заключается в ограничении дополнительной нагрузки на лидера при распространении данных от лидера к обучающемуся участнику.
Используйте etcdctl member add с флагом --learner для добавления нового участника в кластер как обучающегося участника.
После запуска нового процесса etcd для нового добавленного обучающегося участника используйте etcdctl member promote для повышения обучающегося участника до голосующего участника.
Случаи ошибок при добавлении участников
В следующем случае новый хост не включается в список перечисленных узлов. Если это новый кластер, узел должен быть добавлен в список исходных участников кластера.
В этом случае используйте другую адресацию (10.0.1.14:2380), отличную от той, которая была использована для присоединения к кластеру (10.0.1.13:2380):
Если etcd начинает использовать данные из директории данных удаленного участника, etcd автоматически завершает работу, если он подключается к любому активному участнику в кластере:
Ошибки при добавлении обучающегося участника
Нельзя добавить обучающегося участника в кластер, если кластер уже имеет 1 обучающегося участника (v3.4).
Ошибки при повышении обучающегося участника до участника
Обучающегося можно повысить до голосующего участника только после синхронизации с лидером.
Повышение участника, который не является обучающимся, завершится ошибкой.
Повышение отсутствующего в кластере участника завершится ошибкой.
Тщательный режим проверки строгой реконфигурации (-strict-reconfig-check)
Как описано выше, лучшая практика добавления новых участников заключается в настройке одного участника за раз и проверке того, что он стартует корректно, прежде чем добавлять новые участники. Этот пошаговый подход очень важен, так как если новый участник не настроен правильно (например, URL-адреса коллегиальных узлов неверны), кластер может потерять кворум. Потеря кворума происходит, так как новый участник учитывается в кворуме даже если он недоступен из других существующих участников. Также потеря кворума может произойти при проблемах с связностью или при операционных проблемах.
Для предотвращения проблемы etcd предоставляет -strict-reconfig-check.
С этим параметром etcd отклоняет изменение конфигурации, если число запущенных
участников станет меньше кворума нового состава.
По умолчанию включено.