Интеракция с etcd
Пользователи чаще всего взаимодействуют с etcd, устанавливая или получая значение ключа. В этом разделе описано, как это сделать с помощью etcdctl — командной строки для взаимодействия с сервером etcd. Концепции, описанные здесь, должны применимы к gRPC–API или API клиентской библиотеки.
Версию API 2 или 3, которую etcdctl использует для связи с etcd, задаёт
переменная окружения ETCDCTL_API. По умолчанию etcdctl из master (3.4)
использует API v3, а версии 3.3 и старше — API v2.
Примечание: любой ключ, созданный с использованием v2 API, не сможет быть запрослен через v3 API. Запрос v3 API etcdctl get ключа v2 завершится с кодом 0 и без данных ключа, это ожидаемое поведение.
Найти версии
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, с использованием RangeStream
RPC. Результат идентичен однократному 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, чтобы она не истекла.
Предположим, что мы завершили следующую последовательность операций:
Команда поддерживает ту же аренду активной:
Получить информацию об аренде
Приложения могут заинтересоваться информацией об арендах, чтобы их можно было продлить или проверить, существует ли аренда и не истек ли срок её действия. Приложения также могут заинтересоваться ключами, к которым прикреплена определённая аренда.
Предположим, что мы завершили следующую последовательность операций:
Команда получает сведения об аренде:
Команда получает сведения об аренде вместе с привязанными ключами: