Установка и настройка кластера etcd. Ubuntu 18. Debian 10. Debian 11.

Установка и настройка кластера etcd. Ubuntu 18. Debian 10. Debian 11.

Кластер etcd — это распределенное, согласованное хранилище ключей и значений, основной целью которого является совместное использование конфигурации и обнаружение служб. Etcd широко используется во многих распределенных системах.

В частности, создание кластера etcd потребовалось для разворачивания отказоустойчивого кластера PostgreSQL. Разворачивать кластер будем на трёх узлах: haproxy, db01, db02 (IP-адреса соответственно: 192.168.10.30, 192.168.10.31, 192.168.10.32).

Приступаем…

На всех хостах производим обновление системы:

# apt-get update # apt-get upgrade

И устанавливаем etcd:

# apt-get install etcd

# systemctl stop etcd

Чтобы создать один кластер из трёх узлов, нужно сконфигурировать эти установки etcd, чтобы они могли общаться друг с другом. Это означает, что каждая из них должна знать IP-адреса остальных. Этот процесс называется обнаружением. Обнаружение можно реализовать в форме статической конфигурации или динамического обнаружения службы.

Обнаружение с помощью статической конфигурации — это метод, который требует наименьшей настройки. Именно в этом случае конечные точки каждого члена передаются в команду etcd перед ее выполнением. Для использования статической конфигурации необходимо соблюсти следующие условия перед инициализацией кластера:

  • известное количество членов
  • известные конечные точки каждого члена
  • статические IP-адреса для всех конечных точек.

 

Инициализация кластера.

Для инициализации кластера на узле haproxy меняем содержимое файла /etc/default/etcd на следующее:


ETCD_NAME="haproxy"
ETCD_DATA_DIR="/var/lib/etcd/pg-cluster"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.30:2380"
ETCD_INITIAL_CLUSTER="haproxy=http://192.168.10.30:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="pg-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.30:2379"

Рассмотрим введённые параметры:
ETCD_DATA_DIR — указывает расположение каталога данных кластера
ETCD_LISTEN_PEER_URLS — задаёт схему и точку подключения для остальных узлов кластера, по шаблону scheme://IP:port. Схема может быть http, https. Альтернатива, unix:// или unixs:// для юникс сокетов. Если в качестве IP адреса указано 0.0.0.0, то указанный порт будет прослушиваться на всех интерфейсах.
ETCD_LISTEN_CLIENT_URLS — задаёт схему и точку подключения для клиентов кластера. В остальном совпадает с ETCD_LISTEN_PEER_URLS.
ETCD_NAME — человекочитаемое имя этого узла кластера. Должно быть уникально в кластере. Для первого узла может быть любым. Для последующих должно совпадать с именем, указанным при добавлении узла.
ETCD_HEARTBEAT_INTERVAL — время в миллисекудах, между рассылками лидером оповещений о том, что он всё ещё лидер. Рекомендуется задавать с учётом сетевой задержки между узлами кластера.
ETCD_ELECTION_TIMEOUT — время в миллисекундах, которое проходит между последним принятым оповещением от лидера кластера, до попытки захватить роль лидера на ведомом узле. Рекомендуется задавать его в несколько раз большим, чем ETCD_HEARTBEAT_INTERVAL. Более подробно о этих параметрах можно прочесть в документации.
ETCD_INITIAL_ADVERTISE_PEER_URLS — Список равноправных URL-адресов, по которым его могут найти остальные узлы кластера. Эти адреса используются для передачи данных по кластеру. По крайней мере, один из этих адресов должен быть маршрутизируемым для всех членов кластера. Могут содержать доменные имена. Используется только при первом запуске нового узла кластера.
ETCD_ADVERTISE_CLIENT_URLS — Список равноправных URL-адресов, по которым его могут найти остальные узлы кластера. Эти адреса используются для передачи данных по кластеру. По крайней мере, один из этих адресов должен быть маршрутизируемым для всех членов кластера. Могут содержать доменные имена.
ETCD_INITIAL_CLUSTER — Список узлов кластера на момент запуска. Используется только при первом запуске нового узла кластера.
ETCD_INITIAL_CLUSTER_TOKEN — Токен кластера. Должен совпадать на всех узлах кластера. Используется только при первом запуске нового узла кластера.
ETCD_INITIAL_CLUSTER_STATE — может принимать два значения «new» и «existing». Значение «new» используется при первом запуске первого узла в кластере. При значении «existing», узел при старте будет пытаться установить связь с остальными узлами кластера.

Чтобы гарантировать работоспособность, etcd может принимать решения только в том случае, когда большинство узлов являются рабочими. Подобная практика известна как достижение кворума. Другими словами, в кластере из трех членов кворум достигается, если два или более членов являются рабочими.

Если для параметра initial-cluster-state установлено значение new, etcd будет знать, что это новый кластер, который будет запущен, и позволит членам начинать работу параллельно, не ожидая достижения кворума. Если говорить конкретнее, после запуска первого члена у него не будет кворума, поскольку одна треть (33,33%) меньше или равна 50%. Обычно etcd будет приостанавливать работу и отказывать в совершении любых действий, а кластер не будет сформирован. Однако, если для initial-cluster-state установлено значение new, отсутствие кворума будет игнорироваться.

Если установлено значение existing, член будет пытаться присоединиться к существующему кластеру и ожидать, что кворум будет достигнут.

Выполняем перезапуск etcd:

# systemctl restart etcd

Если всё прошло успешно, то кластер будет состоять из одного узла:

# etcdctl cluster-health

member 8268c8eb246786c7 is healthy: got healthy result from http://192.168.10.30:2379
cluster is healthy

Добавление второго узла.

Добавление нового узла в кластер etcd происходит в два этапа. На первом этапе кластер предупреждается о появлении нового узла. На втором этапе запускается сам новый узел.

На haproxy выполняем оповещение кластера о появлении нового узла db01:

# etcdctl member add db01 http://192.168.10.31:2380

Added member named db01 with ID 76fcafe1ab475b48 to cluster

ETCD_NAME="db01"
ETCD_INITIAL_CLUSTER="haproxy=http://192.168.10.30:2380,db01=http://192.168.10.31:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"

На узле db01 содержимое файла конфигурации /etc/default/etcd заменяем на следующее:
ETCD_NAME="db01"
ETCD_DATA_DIR="/var/lib/etcd/pg-cluster"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.31:2380"
ETCD_INITIAL_CLUSTER="haproxy=http://192.168.10.30:2380,db01=http://192.168.10.31:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
ETCD_INITIAL_CLUSTER_TOKEN="pg-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.31:2379"

И перезапускаем etcd:

# systemctl restart etcd

После этого на обоих узлах кластера должны видеть такую картину:
etcdctl cluster-health

member 76fcafe1ab475b48 is healthy: got healthy result from http://192.168.10.31:2379
member 8268c8eb246786c7 is healthy: got healthy result from http://192.168.10.30:2379

Аналогичным образом добавляем третий узел — выполняем оповещение кластера о появлении нового узла db02:

# etcdctl member add db02 http://192.168.10.32:2380

и корректируем файл конфигурации на db02:

ETCD_NAME="db02"
ETCD_DATA_DIR="/var/lib/etcd/pg-cluster"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.32:2380"
ETCD_INITIAL_CLUSTER="haproxy=http://192.168.10.30:2380,db01=http://192.168.10.31:2380,db02=http://192.168.10.32:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
ETCD_INITIAL_CLUSTER_TOKEN="pg-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.32:2379"

После успешного добавления всех узлов проводим окончательную корректировку конфигурации на всех узлах кластера:
— переменная ETCD_INITIAL_CLUSTER_STATE должна содержать значение «existing»;
— ETCD_INITIAL_CLUSTER должна содержать все узлы кластера: «haproxy=http://192.168.10.30:2380,db01=http://192.168.10.31:2380,db02=http://192.168.10.32:2380»

Nicko

Добавить комментарий