Info
Content

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
Back to top