Обновление etcd от 3.1 до 3.2
В общем случае переход с etcd 3.1 на 3.2 можно выполнить как поэтапное обновление без простоя:
- поочерёдно останавливать процессы etcd v3.1 и заменять их процессами etcd v3.2
- после запуска всех процессов v3.2 кластеру станут доступны новые возможности v3.2
Перед обновлением внимательно прочитайте оставшуюся часть этого руководства для подготовки.
Контрольные списки обновления
При миграции с v2 без данных v3
сервер etcd v3.2+ аварийно завершается при восстановлении из существующих снимков без файла v3 ETCD_DATA_DIR/member/snap/db. Это происходит, когда сервер был перенесён с v2 и ранее не содержал данных v3. Это также предотвращает случайную потерю данных v3 (например, файл db мог быть перемещён). etcd требует, чтобы миграция на более новые версии v3 выполнялась только при наличии данных v3. Не обновляйтесь до более новых версий v3, пока сервер v3.0 не содержит данных v3.
Основные нарушающие совместимость изменения в 3.2.
Изменено стандартное значение snapshot-count
Большее значение --snapshot-count удерживает до снимка больше записей Raft
в памяти, вызывая периодически повышенное потребление памяти
.
Лидер дольше хранит последние записи, и медленный последователь получает больше
времени догнать его до снимка. --snapshot-count — компромисс между памятью и
доступностью медленных последователей.
Начиная с v3.2 значение --snapshot-count по умолчанию изменено с 10,000 на 100,000
.
Изменена зависимость gRPC (>=3.2.10)
Выпуск 3.2.10 или более поздний теперь требует grpc/grpc-go
v1.7.5 (<=3.2.9 требует v1.2.1).
Устаревший grpclog.Logger
grpclog.Logger устарел в пользу grpclog.LoggerV2
. clientv3.Logger теперь grpclog.LoggerV2.
Перед
После
Устаревший grpc.ErrClientConnTimeout
Ранее при истечении тайм-аута клиентского подключения возвращалась ошибка grpc.ErrClientConnTimeout. Вместо неё 3.2 возвращает context.DeadlineExceeded (см. #8504
).
Перед
После
Изменены максимальные ограничения размера запроса (>=3.2.10)
Версии 3.2.10 и 3.2.11 позволяют настраивать ограничение размера запроса на сервере. >=3.2.12 позволяет задавать его и на сервере, и на клиенте. В предыдущих версиях (v3.2.10, v3.2.11) ответ клиенту был ограничен 4 MiB.
Серверные ограничения на запросы можно настроить с помощью флага --max-request-bytes:
Или настройте поле embed.Config.MaxRequestBytes:
Если значение не задано, серверное ограничение по умолчанию равно 1.5 MiB.
Клиентские ограничения на запросы должны быть настроены в соответствии с серверными ограничениями.
Если значения не заданы, клиентское ограничение отправки по умолчанию равно
2 MiB (1.5 MiB + накладные байты gRPC), а получения — math.MaxInt32.
Подробнее см. godoc clientv3
.
Изменены низкоуровневые (raw) оболочки клиента gRPC
3.2.12 или более поздняя версия изменяет сигнатуры функций низкоуровневой (raw) оболочки gRPC клиента clientv3. Эти изменения были необходимы для поддержки пользовательских grpc.CallOption
для ограничений размера сообщений.
До и после
Изменение API clientv3.Lease.TimeToLive
Ранее API clientv3.Lease.TimeToLive возвращал ошибку lease.ErrLeaseNotFound, если указанный идентификатор аренды не существовал. Вместо неё 3.2 возвращает в ответе TTL=-1 и не выдаёт ошибку (см. #7305
).
Перед
После
Перемещен clientv3.NewFromConfigFile в clientv3.yaml.NewConfig
clientv3.NewFromConfigFile перенесен в yaml.NewConfig.
Перед
После
Изменение в --listen-peer-urls и --listen-client-urls
3.2 теперь отвергает доменные имена для --listen-peer-urls и --listen-client-urls (3.1 только выводит предупреждения), так как доменное имя недопустимо для привязки к сетевому интерфейсу. Убедитесь, что эти URL правильно форматированы как scheme://IP:port.
См. issue #6336 для более подробной информации.
Контрольные списки обновления сервера
Требования к обновлению
Для обновления существующего развёртывания etcd до 3.2 кластер должен быть версии 3.1 или выше. Если версия ниже 3.1, перед обновлением до 3.2 обновитесь до 3.1 .
Для плавного поэтапного обновления работающий кластер также должен быть исправен. Перед продолжением проверьте его работоспособность командой etcdctl endpoint health.
Подготовка
Перед обновлением etcd обязательно протестируйте зависящие от него службы в промежуточной среде, прежде чем развёртывать обновление в производственной среде.
Перед началом сделайте резервную копию данных etcd
. Если что-то пойдет не так с обновлением, можно использовать эту резервную копию для понижения версии
обратно к существующей версии etcd. Обратите внимание: команда snapshot выполняет резервное копирование только данных v3. Для данных v2 см. резервное копирование v2 хранилища данных
.
Смешанные версии
При обновлении кластер etcd поддерживает смешанные версии участников etcd и работает с протоколом самой низкой общей версии. Кластер считается обновленным только после того, как все его участники будут обновлены до версии 3.2. Участники etcd согласуют общую версию кластера, которая определяет сообщаемую версию и поддерживаемые возможности.
Ограничения
Примечание: это ограничение не относится к кластеру, содержащему только данные версии 3 без данных версии 2.
Если кластер обслуживает набор данных версии v2 размером более 50MB, каждому только что обновлённому участнику может потребоваться до двух минут, чтобы догнать существующий кластер. Проверьте размер последнего снимка, чтобы оценить общий размер данных. Иными словами, безопаснее всего ждать 2 минуты между обновлениями участников.
При значительно большем объёме данных, 100MB или более, этот одноразовый процесс может занять еще больше времени. Администраторы очень больших кластеров etcd такого масштаба могут обратиться к команде etcd перед обновлением, и мы с удовольствием предоставим рекомендации по процедуре.
Понижение версии
Если все участники были обновлены до v3.2, кластер будет обновлен до v3.2, и понижение версии из этого завершенного состояния невозможно. Если хотя бы один участник остается v3.1, кластер и его операции остаются “v3.1”, и из этого смешанного состояния кластера возможно вернуться к использованию etcd-бинарного файла версии v3.1 на всех участниках.
Создайте резервную копию каталога данных всех участников, чтобы понижение версии оставалось возможным после полного обновления.
Процедура обновления
Этот пример показывает, как обновить кластер etcd v3.1 из 3 участников, работающий на локальной машине.
1. Проверьте требования к обновлению
Исправен ли кластер и работает ли он на версии v3.1.x?
2. Остановите существующий процесс etcd
Когда процесс etcd останавливается, ожидаемые ошибки будут записаны другими участниками кластера. Это нормально, так как соединение участника было (временно) прервано:
На этом этапе рекомендуется создать резервную копию данных etcd , чтобы обеспечить возможность понижения версии в случае возникновения любых проблем:
3. Замените двоичный файл etcd на v3.2 и запустите новый процесс etcd
Новый etcd v3.2 будет публиковать свои данные в кластер:
Убедитесь, что с новым двоичным файлом etcd v3.2 каждый участник, а затем весь кластер становятся исправными:
Обновленные участники будут регистрировать предупреждения следующего вида до тех пор, пока весь кластер не будет обновлен. Это ожидаемо и прекратится после того, как все участники кластера etcd будут обновлены до v3.2:
4. Повторите шаги 2–3 для остальных участников
5. Завершите обновление
Когда все участники будут обновлены, кластер будет сообщать об успешном переходе к 3.2: