Взаимодействие с etcd
Пользователи чаще всего взаимодействуют с etcd, устанавливая или получая значение ключа. В этом разделе описано, как это сделать с помощью etcdctl — утилиты командной строки для взаимодействия с сервером etcd. Описанные здесь концепции должны быть применимы к API gRPC и API клиентских библиотек.
etcdctl v3.7 использует API v3. API v2 и выбор версии через ETCDCTL_API удалены.
Приведённые ниже примеры сохраняют исторический вывод команд, поэтому показанные номера версий могут отличаться от вашей установки. Старые выпуски etcd хранили ключи v2 и v3 в отдельных хранилищах; перенесите данные v2 до обновления до v3.7.
Определение версий
Версия etcdctl и версия API сервера могут быть полезны при определении подходящих команд для выполнения различных операций с etcd.
Следующая команда предназначена для поиска версий:
Запись ключа
Приложения сохраняют данные в кластере etcd, записывая значения ключей. Каждый сохранённый ключ реплицируется всем участникам кластера etcd через протокол Raft для достижения согласованности и надёжности.
Команда задаёт ключу foo значение bar:
Также ключ можно установить на определённый период времени, привязав к нему аренду.
Следующая команда предназначена для установки ключу foo1 значения bar1 на 10s.
В команде выше идентификатор аренды 1234abcd относится к идентификатору, возвращённому при создании аренды длительности 10s. Этот идентификатор можно затем прикрепить к ключу.
Чтение ключей
Приложения могут читать из кластера etcd один ключ или диапазон ключей.
Предположим, что кластер etcd содержит следующие ключи:
Команда читает значение ключа foo:
Команда читает значение ключа foo в шестнадцатеричном формате:
Команда выводит только значение ключа foo:
Команда читает диапазон ключей от foo до foo3:
foo3 исключается, так как диапазон является полуоткрытым интервалом [foo, foo3), исключающим foo3.
Команда читает все ключи с префиксом foo:
Следующая команда предназначена для обхода всех ключей с префиксом foo и ограничением количества результатов до 2:
Следующая команда предназначена для обхода всех ключей с префиксом foo с использованием RPC RangeStream
. Результат идентичен унарному Range:
--stream не поддерживает --order, --sort-by и фильтры ревизий.
Чтение предыдущих версий ключей
Приложения могут захотеть прочитать устаревшие версии ключа. Например, приложение может захотеть откатиться к старой конфигурации, обратившись к более ранней версии ключа. Кроме того, приложение может получить согласованное представление над несколькими ключами через несколько запросов, обратившись к истории ключа. Поскольку каждое изменение хранилища ключей и значений кластера etcd увеличивает глобальную ревизию кластера etcd, приложение может прочитать замещённые ключи, предоставив более старую ревизию etcd.
Предположим, что кластер etcd уже содержит следующие ключи:
Ниже приведён пример, как получить доступ к прошлым версиям ключей:
Читать ключи, которые не меньше указанного ключа по байтовому значению
Приложениям может потребоваться прочитать ключи, которые больше или равны байтовому значению указанного ключа.
Предположим, что кластер etcd уже содержит следующие ключи:
Команда читает ключи, байтовое значение которых не меньше ключа b:
Удаление ключей
Приложения могут удалить ключ или диапазон ключей из кластера etcd.
Предположим, что кластер etcd уже содержит следующие ключи:
Следующая команда предназначена для удаления ключа foo:
Следующая команда предназначена для удаления ключей от foo до foo9:
Команда удаляет zoo и возвращает удалённую пару «ключ — значение»:
Команда удаляет ключи с префиксом zoo:
Команда удаляет ключи, байтовое значение которых не меньше ключа b:
Наблюдение за изменениями ключа
Приложения могут наблюдать за ключом или диапазоном ключей для мониторинга любых обновлений.
Следующая команда предназначена для наблюдения за ключом foo:
Команда наблюдает за ключом foo в шестнадцатеричном формате:
Следующая команда предназначена для наблюдения за диапазоном ключей от foo до foo9:
Следующая команда предназначена для наблюдения за ключами с префиксом foo:
Команда наблюдает за несколькими ключами foo и zoo:
Наблюдение за историческими изменениями ключей
Приложения могут захотеть наблюдать за историческими изменениями ключей в etcd. Например, приложение может захотеть получать все модификации ключа; если приложение останется подключено к etcd, то watch будет достаточно. Однако, если приложение или etcd даст сбой, изменение может произойти во время сбоя, и приложение не получит обновление в реальном времени. Чтобы гарантировать доставку обновления, приложение должно быть способно наблюдать за историческими изменениями ключей. Для этого приложение может указать историческую ревизию при наблюдении, как при чтении прошлых версий ключей.
Предположим, что мы завершили следующую последовательность операций:
Ниже приведён пример наблюдения за историческими изменениями:
Ниже приведён пример наблюдения только с последнего исторического изменения:
Наблюдение за прогрессом
Приложение может проверять ход наблюдения, чтобы определить актуальность потока. Например, если наблюдение используется для обновления кэша, полезно знать, не устарел ли он относительно ревизии, полученной чтением по кворуму.
Запросы прогресса можно отправлять с помощью команды “progress” в интерактивном сеансе наблюдения, чтобы попросить сервер etcd отправлять уведомление о прогрессе в потоке наблюдения:
Номер ревизии в ответе на уведомление о прогрессе — это номер ревизии локального узла сервера etcd, к которому подключён поток наблюдения. Если этот узел отсечён и не является частью кворума, то номер ревизии уведомления о прогрессе может быть ниже номера ревизии, возвращаемого чтением по кворуму на неотсечённом узле сервера etcd.
Компактизированные ревизии
Как мы уже упоминали, etcd хранит ревизии, чтобы приложения могли читать прошлые версии ключей. Однако, чтобы избежать накопления неограниченного количества истории, важно компактизировать прошлые ревизии. После компактизации etcd удаляет исторические ревизии, освобождая ресурсы для будущего использования. Все замещённые данные с ревизиями, предшествующими компактизированной ревизии, станут недоступны.
Следующая команда предназначена для компактизации ревизий:
Текущую ревизию сервера etcd можно найти с помощью команды get для любого ключа (существующего или несуществующего) в формате json. Пример показан ниже для ключа mykey, который не существует на сервере etcd:
Выдача аренды
Приложения могут выдавать аренды для ключей из кластера etcd. Когда ключ прикреплён к аренде, его срок жизни связан со сроком жизни аренды, который в свою очередь регулируется сроком жизни (TTL). Каждая аренда имеет минимальное значение срока жизни (TTL), указанное приложением при выдаче. Фактическое значение TTL аренды составляет не менее минимального TTL и выбирается кластером etcd. После истечения TTL аренды она истекает, и все прикреплённые ключи удаляются.
Команда выдаёт аренду:
Отзыв аренды
Приложения отзывают аренды по идентификатору аренды. Отзыв аренды удаляет все связанные с ней ключи.
Предположим, что мы завершили следующую последовательность операций:
Команда отзывает ту же аренду:
Поддержание активности аренды
Приложения могут поддерживать аренду активной обновлением её TTL, чтобы она не истекла.
Предположим, что мы завершили следующую последовательность операций:
Команда поддерживает ту же аренду активной:
Получение сведений об аренде
Приложению могут потребоваться сведения об аренде, чтобы продлить её или проверить, существует ли она и не истёк ли срок её действия. Также может потребоваться список ключей, привязанных к определённой аренде.
Предположим, что мы завершили следующую последовательность операций:
Команда получает сведения об аренде:
Команда получает сведения об аренде вместе с привязанными ключами: