Что такое 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 узлов, размести их в разных зонах доступности, настрой мониторинг и регулярные резервные копии.