Docs
Demo
Set up a cluster
TOKEN=token-01
CLUSTER_STATE=new
NAME_1=two
NAME_2=three
NAME_3=four
HOST_1=45.155.207.216
HOST_2=194.169.160.23
HOST_3=194.169.160.207
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
# For machine 1
THIS_NAME=${NAME_1} # Заменить на каждой машине в соответствии с ее номером
THIS_IP=${HOST_1} # Тоже
etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
--advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
Подробнее про команду запуска
etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
--advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
-
--data-dir=data.etcd
- создается самаroot@three:~# tree -a data.etcd/ data.etcd/ `-- member |-- snap | `-- db `-- wal |-- 0000000000000000-0000000000000000.wal `-- 0.tmp 3 directories, 3 files
-
--name
- человекочитаемое имя ноды
Порт 2379 для клиентов (etcdctl), через порт 2380 ноды etcd взаимодействуют друг с другом
-
--initial-cluster ${CLUSTER}
- начальная конфигурация кластера для старта -
--initial-cluster-state ${CLUSTER_STATE}
- 'new' or 'existing' -
--initial-cluster-token ${TOKEN}
- защитит от непреднамеренного кросс-кластерного взаимодействия -
--discovery ${DISCOVERY}
, гдеDISCOVERY=https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92
получена черезcurl 'https://discovery.etcd.io/new?size=3'
- discovery url, используется для бутстрапа. Идея в том чтобы разворачивать новые кластеры помогая уже существующим кластером (дискавери лежит в etcd). Важно что discovery должен использоваться только для стартапа кластера, дальше он становится непригодным потому что инфа в нем устаревает
Подключение к кластеру
export ETCDCTL_API=3
HOST_1=45.155.207.216
HOST_2=194.169.160.23
HOST_3=194.169.160.207
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
Эти переменные нужно объявить на хосте с etcdctl
И можно проверять
root@two:~# etcdctl --endpoints=$ENDPOINTS member list
135735bb80093eea, started, three, http://194.169.160.23:2380, http://194.169.160.23:2379
bed065586da60cb6, started, four, http://194.169.160.207:2380, http://194.169.160.207:2379
fefe1bcba0aadd43, started, two, http://45.155.207.216:2380, http://45.155.207.216:2379
root@two:~#
Access etcd
-
put
- запись -
get
- чтение-
--write-out="json"
etcdctl --endpoints=$ENDPOINTS --write-out="json" niga { "header": { "cluster_id": 8014646236035398000, "member_id": 13749601092833251000, "revision": 5, "raft_term": 17 }, "kvs": [ { "key": "bmlnYQ==", "create_revision": 2, "mod_revision": 5, "version": 4, "value": "bWF6YWZha2Ey" } ], "count": 1 }
-
--prefix
root@four:~# etcdctl --endpoints=$ENDPOINTS get niga --prefix niga1 mazafaka1 niga2 mazafaka2 niga3 mazafaka3 niga4 mazafaka4
-
-
del
- удаление--prefix
Transactional write
-
txn
- позволяет завернуть много запросов в одну транзакцию
Watch
-
watch
- получать нотификации о будущих изменениях
root@two:~# etcdctl --endpoints=$ENDPOINTS watch niga
PUT
niga
mazafaka
^C
root@two:~# etcdctl --endpoints=$ENDPOINTS watch niga --prefix
PUT
niga
mazafaka
PUT
niga2
mazafaka
DELETE
niga
Lease
-
lease
- записать с TTL
Создаем lease
etcdctl --endpoints=$ENDPOINTS lease grant 300
И кладем значение с его использованием
etcdctl --endpoints=$ENDPOINTS put sample value --lease=2be7547fbc6a5afa
-
keep-alive
- позволяет приостановить обратный отсчет TTL
etcdctl --endpoints=$ENDPOINTS lease keep-alive 5d4379600276611c
^C # пока не завершим
Жмем ctrl+c и отсчет тикает дальше и запись удаляется
root@three:~# etcdctl --endpoints=$ENDPOINTS watch test
DELETE
test
-
lease revoke 2be7547fbc6a5afa
- позволяет отозвать lease
Distributed locks
-
lock
- лок
Elections
-
elect
- для выборов
Cluster status
root@three:~# etcdctl --endpoints=$ENDPOINTS endpoint health
194.169.160.23:2379 is healthy: successfully committed proposal: took = 7.498346ms
45.155.207.216:2379 is healthy: successfully committed proposal: took = 8.34395ms
194.169.160.207:2379 is unhealthy: failed to connect: context deadline exceeded
Error: unhealthy cluster
root@three:~# etcdctl --endpoints=$ENDPOINTS --write-out=table endpoint status
+----------------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------------+------------------+---------+---------+-----------+-----------+------------+
| 45.155.207.216:2379 | fefe1bcba0aadd43 | 3.2.26 | 33 kB | true | 17 | 67 |
| 194.169.160.23:2379 | 135735bb80093eea | 3.2.26 | 33 kB | false | 17 | 67 |
| 194.169.160.207:2379 | bed065586da60cb6 | 3.2.26 | 33 kB | false | 17 | 67 |
+----------------------+------------------+---------+---------+-----------+-----------+------------+
Snapshot
-
snapshot
- сохранить снапшот в etcd базе
root@three:~# etcdctl --endpoints=$ENDPOINTS snapshot save test-snap
Snapshot saved at test-snap
root@three:~# etcdctl --endpoints=$ENDPOINTS --write-out=table snapshot status test-snap
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| 8d243124 | 37 | 42 | 33 kB |
+----------+----------+------------+------------+
Migrate
-
migrate
- etcdv2 -> etcdv3 data transformation
Member
-
member
- управление участникамиremove/add id
Пример, сдохла нода
Видим:
root@two:~# etcdctl --endpoints=$ENDPOINTS --write-out=table endpoint status
Failed to get the status of endpoint 194.169.160.23:2379 (context deadline exceeded)
+----------------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------------+------------------+---------+---------+-----------+-----------+------------+
| 45.155.207.216:2379 | fefe1bcba0aadd43 | 3.2.26 | 33 kB | true | 543 | 83 |
| 194.169.160.207:2379 | bed065586da60cb6 | 3.2.26 | 33 kB | false | 543 | 83 |
+----------------------+------------------+---------+---------+-----------+-----------+------------+
Чиним:
Проверяем что в конфиге на сломанной ноде проставлено
CLUSTER_STATE=existing
Удаляем папку с базой
root@three:~# rm -r data.etcd/
Смотрим id в member list
root@two:~# etcdctl --endpoints=$ENDPOINTS --write-out=table member list
+------------------+---------+-------+-----------------------------+-----------------------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |
+------------------+---------+-------+-----------------------------+-----------------------------+
| 3167db427e67b757 | started | three | http://194.169.160.23:2380 | http://194.169.160.23:2379 |
| bed065586da60cb6 | started | four | http://194.169.160.207:2380 | http://194.169.160.207:2379 |
| fefe1bcba0aadd43 | started | two | http://45.155.207.216:2380 | http://45.155.207.216:2379 |
+------------------+---------+-------+-----------------------------+-----------------------------+
Удаляем из кластера
root@two:~# etcdctl --endpoints=$ENDPOINTS member remove 3167db427e67b757
Member 3167db427e67b757 removed from cluster 6f39be49cb4fb7e3
Добавляем в кластер
root@two:~# etcdctl --endpoints=194.169.160.207:2379,45.155.207.216:2379 member add three --peer-urls=http://194.169.160.23:2380
Member 97fd5fbee4c94b5b added to cluster 6f39be49cb4fb7e3
ETCD_NAME="three"
ETCD_INITIAL_CLUSTER="three=http://194.169.160.23:2380,four=http://194.169.160.207:2380,two=http://45.155.207.216:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
Поднимаем etcd на сломанной ноде
. ./etcd
Убеждаемся что все ок
root@two:~# etcdctl --endpoints=$ENDPOINTS --write-out=table endpoint health
45.155.207.216:2379 is healthy: successfully committed proposal: took = 4.605078ms
194.169.160.207:2379 is healthy: successfully committed proposal: took = 8.384793ms
194.169.160.23:2379 is healthy: successfully committed proposal: took = 7.947833ms
Auth
-
auth
,user
,role
- для аутентификации
No Comments