Что такое etcd?

etcd — это распределенное, надежное key-value хранилище, которое обеспечивает простой способ хранения данных в кластере машин. etcd написан на Go и использует алгоритм консенсуса Raft для обеспечения согласованности данных. Наиболее известен как основное хранилище конфигурации в Kubernetes.

Основные возможности etcd

  • Distributed consensus — алгоритм Raft для согласованности
  • Key-value store — простая модель данных
  • Watch API — уведомления об изменениях в реальном времени
  • TTL support — автоматическое истечение ключей
  • Atomic operations — транзакционные операции
  • SSL/TLS encryption — безопасная передача данных
  • Authentication — контроль доступа и авторизация

Архитектура etcd

  • Raft consensus — алгоритм для распределенного консенсуса
  • Leader election — выбор лидера в кластере
  • Log replication — репликация изменений
  • Snapshot — периодические снимки состояния
  • WAL (Write-Ahead Log) — журнал изменений

Установка etcd

 1# Установка из релизов GitHub
 2ETCD_VER=v3.5.10
 3DOWNLOAD_URL=https://github.com/etcd-io/etcd/releases/download
 4curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o etcd-${ETCD_VER}-linux-amd64.tar.gz
 5tar xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz
 6sudo mv etcd-${ETCD_VER}-linux-amd64/etcd* /usr/local/bin/
 7
 8# Запуск одиночного узла
 9etcd --name my-etcd-1 \
10  --data-dir /tmp/etcd/s1 \
11  --listen-client-urls http://0.0.0.0:2379 \
12  --advertise-client-urls http://0.0.0.0:2379 \
13  --listen-peer-urls http://0.0.0.0:2380 \
14  --initial-advertise-peer-urls http://0.0.0.0:2380 \
15  --initial-cluster my-etcd-1=http://0.0.0.0:2380 \
16  --initial-cluster-token my-etcd-token \
17  --initial-cluster-state new

Основные команды etcdctl

 1# Установка значения
 2etcdctl put mykey "Hello World"
 3
 4# Получение значения
 5etcdctl get mykey
 6
 7# Получение всех ключей
 8etcdctl get --prefix ""
 9
10# Удаление ключа
11etcdctl del mykey
12
13# Watch за изменениями
14etcdctl watch mykey
15
16# Транзакционные операции
17etcdctl txn --interactive
18
19# Создание пользователя
20etcdctl user add myuser
21
22# Создание роли
23etcdctl role add myrole
24
25# Включение аутентификации
26etcdctl auth enable

Настройка кластера etcd

 1# Узел 1
 2etcd --name etcd1 \
 3  --data-dir /tmp/etcd1 \
 4  --listen-client-urls http://10.0.0.1:2379 \
 5  --advertise-client-urls http://10.0.0.1:2379 \
 6  --listen-peer-urls http://10.0.0.1:2380 \
 7  --initial-advertise-peer-urls http://10.0.0.1:2380 \
 8  --initial-cluster etcd1=http://10.0.0.1:2380,etcd2=http://10.0.0.2:2380,etcd3=http://10.0.0.3:2380 \
 9  --initial-cluster-token my-etcd-token \
10  --initial-cluster-state new
11
12# Проверка здоровья кластера
13etcdctl endpoint health --cluster
14etcdctl endpoint status --cluster

Использование в приложениях

 1# Пример на Python с python-etcd3
 2import etcd3
 3
 4# Подключение к etcd
 5etcd = etcd3.client(host='localhost', port=2379)
 6
 7# Запись данных
 8etcd.put('config/database/host', 'localhost')
 9etcd.put('config/database/port', '5432')
10
11# Чтение данных
12value, metadata = etcd.get('config/database/host')
13print(f"Database host: {value.decode()}")
14
15# Watch за изменениями
16def watch_callback(event):
17    print(f"Key {event.key} changed to {event.value}")
18
19etcd.add_watch_callback('config/', watch_callback, range_end='config0')

Когда использовать etcd

  • Хранение конфигурации для распределенных систем
  • Service discovery и координация сервисов
  • Distributed locking и leader election
  • Метаданные для контейнерных оркестраторов
  • Configuration management в микросервисах
  • Координация между узлами кластера
  • Feature flags и A/B тестирование

Преимущества etcd

  • Консистентность — строгая согласованность данных
  • Надежность — fault-tolerant архитектура
  • Простота — простой key-value API
  • Производительность — высокая скорость чтения
  • Watch API — реактивные обновления
  • Security — встроенная аутентификация и TLS

Ограничения etcd

  • Размер значений ограничен (по умолчанию 1.5MB)
  • Не подходит для больших объемов данных
  • Записи медленнее чтения из-за консенсуса
  • Требует нечетное количество узлов для кворума
  • Не подходит для аналитических запросов

Мониторинг etcd

 1# Метрики Prometheus
 2curl http://localhost:2379/metrics
 3
 4# Проверка производительности
 5etcdctl check perf
 6
 7# Дефрагментация
 8etcdctl defrag
 9
10# Компактирование истории
11etcdctl compact 1000
12
13# Создание снимка
14etcdctl snapshot save backup.db
15
16# Восстановление из снимка
17etcdctl snapshot restore backup.db

Best Practices

  • Используй нечетное количество узлов (3, 5, 7)
  • Размещай узлы в разных availability zones
  • Регулярно создавай резервные копии
  • Мониторь размер базы данных
  • Настрой TLS для production
  • Используй компактирование для управления историей
  • Настрой алерты на health checks

etcd в Kubernetes

1# Проверка etcd в Kubernetes
2kubectl get pods -n kube-system | grep etcd
3
4# Backup etcd в Kubernetes
5ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
6  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
7  --cert=/etc/kubernetes/pki/etcd/server.crt \
8  --key=/etc/kubernetes/pki/etcd/server.key \
9  snapshot save /tmp/etcd-backup.db

Альтернативы etcd

  • Consul — service discovery с key-value store
  • Apache ZooKeeper — координационный сервис
  • Redis — in-memory key-value store
  • Vault — secrets management с key-value
  • DynamoDB — managed NoSQL в AWS
  • TiKV — distributed key-value database

FAQ

Подходит ли etcd для продакшена?

Да, etcd широко используется в production как основное хранилище Kubernetes и многих других систем. Это зрелое и стабильное решение с активной поддержкой.

Какие требования к инфраструктуре?

etcd требует минимальные ресурсы: 2-8 GB RAM, SSD диски для лучшей производительности. Важна низкая latency между узлами кластера.

Как обеспечить высокую доступность?

Используй кластер из 3-5 узлов, размести их в разных зонах доступности, настрой мониторинг и регулярные резервные копии.