кластер postgresql

WishMaster

Участник
Привет, наткнулся в одной из вакансий на такой набор:

Желателен опыт работы с:
HA компонентами (keepalived, pacemaker, WSFC)
Системами мониторинга (Zabbix, Prometheus и др.)
CI/CD инструментами (Ansible, Terraform, Jenkins, GitLab и др.)
Виртуализацией (VMware, RHV, oVirt, Proxmox VE)
Контейнеризацией (Docker, Kubernetes/OpenShift, Istio)
Облачными платформами AWS, Azure, GCP, MCS или Yandex Cloud
Базами данных MySQL, PostgreSQL

Не работал с keepalived, pacemaker. Хочу дома на VirtualBox собрать стенд что бы прокачать этот скилл
Есть тут кто может проконсультировать по этим штукам ?:rolleyes:
 
ну а если мануал почитать
 
ну а если мануал почитать
достаточно долго. + ко всему нигде нет общей схемы работы, к примеру двух нод. В виде картинки. Не могу даже понять сколько минимум нод надо что бы балансировать нагрузку приложения. Ну вот к примеру есть веб приложение, httpd, высоко нагруженный сайт работающий на апач. Мне надо распределить нагрузку, какова будет системная архитектура решения??
 
В общем посидел немного и решил поднять кластер на postgreSQL + etcd + patroni + haproxy в целях вообще понять как это все работает. Шел в основном по этому гайду но даже там много непонятного и я решил задокументировать чисто для себя но и вдруг кому полезно будет. На правильность ваааще не претендую т.к. сам первый раз сталкиваюсь с этим, но по крайней мере это работает.

1. Создал 3 виртуальные машины на ubuntu (Linux node1 5.4.0-156-generic #173-Ubuntu )
node1
node2
node3
2. На каждую машину поставил обновления, поставил статический ip, создал записи в dns для каждой ноды, поставил postegresql и etcd.

sudo apt install etcd
sudo apt install postgresql

Если вдруг ваши пакеты как то по другому называются то можно поискать нужный пакет в репозитории командой:
apt-cache search postgre

3.Отключил автозапуск postgresql на нодах
sudo systemctl disable postgresql

Это готовый конфиг etcd с node1, у меня он лежал в /etc/default/etcd
Когда только начинаем собирать кластер то следует использовать этот параметр вместо existing:
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_NAME="core"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
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://node1.domen.local:2380"
ETCD_INITIAL_CLUSTER="node1=http://node1.domen.local:2380,node2=http://node2.domen.local:2380,node3=http://node3.domen.local:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://node1.domen.local:2379"

Конфиг /etc/default/etcd с node2 (на узлах node2 и node3 сразу ставим параметр existing)
ETCD_NAME="node2"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"

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://node2.domen.local:2380"
ETCD_INITIAL_CLUSTER="node2=http://node1.domen.local:2380,node2=http://node2.domen.local:2380,node3=http://node3.domen.local:2>
ETCD_INITIAL_CLUSTER_STATE="existing"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://node2.domen.local:2379"

Конфиг /etc/default/etcd с node3
ETCD_NAME="node3"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
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://node3.domen.local:2380"
ETCD_INITIAL_CLUSTER="node1=http://node1.domen.local:2380,node2=http://node2.domen.local:2380,node3=http://node3.default.local:2380>
ETCD_INITIAL_CLUSTER_STATE="existing"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://node3.domen.local: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", узел при старте будет пытаться установить связь с остальными узлами кластера.
 
4. После того как конфиг на node 1 готов - запускаем etcd (на node2 и node3 etcd не запущен )
sudo systemctl start etcd.service
демон должен быть запущен и находится в состоянии Active
Смотрим состояние кластера, он должен состоять из одного узла:
etcdctl cluster-health
Если все так то идем дальше.
На node1 оповещаем кластер о добавлении нового узла:

[COLOR=rgb(0, 0, 0)]etcdctl member add node2 http://node2.domen.local:2380[/COLOR]

Сразу парочка полезных команд по узлам кластера:
etcdctl member list - посмотреть узлы кластера
etcdctl member remove de1bcad8886dc9dc - удалить узлы кластера по id
etcdctl member add node2 http://node2.domen.local:2380 - добавить узел в кластер

Добавляем node2 к кластеру.
Конфиг etcd приводим к виду выше и стартуем демон

[COLOR=rgb(0, 0, 0)]sudo systemctl start etcd.service [/COLOR]
Смотрим что он запустился и в состоянии Active
sudo systemctl status etcd.service

Если есть ошибки или демон не запускается то ищем причину тут же или изучаем лог (команда journalctl -xe)
Если etcd запускается без ошибок то проверяем членство в кластере
etcdctl cluster-health
Узлов должно быть 2.

С node3 повторяем тоже самое что и с node 2.

1692859490397.png
 
Последнее редактирование:
хороший гайд спасибо. А дальше будет ?:unsure:
 
Назад
Верх