Делаем кластер PostgreSQL на etcd +patroni +HAProxy

0 Comments

Потребовалось сделать кластер для PostgreSQL, ну – поехали. 

За основу “прохождения” принимается статья о1 1С – « Построение отказоустойчивого кластера PostgreSQL. Настройка внешней синхронизации на PostgreSQL для механизма копий баз данных».

Предвариловка

Устанавливаем русскую локаль. dpkg-reconfigure locales . По умолчанию для операционки я оставляю английскую, но русская нужна, чтобы потом выставить её в качестве основной для СУБД. Сравнения там, сортировки,…

etcd

Нетривиально: при нахождении кластера внутри сети организации, приходится использовать прокси для доступа к внешним ресурсам. Репозиториям или ещё к чему. Стандартный вариант – через переменные окружения http[s]_proxy. Но! etcdctl обращается через тот же http протокол, как следствие – лезет через прокси. Можно добавить хосты в no_proxy, однако, надо помнить, что no_proxy заточено под работу именно с именами, а не с ip. *.domain.ru – работает, а 10.* – нет. При этом, использование dns имён в конфиге etcd сомнительная практика (моя личная точка зрения), ибо сам по себе софт предназначен для контроля кластеризации и завязывать его на dns … Ну, не уверен, что это хорошая идея. Я перечисляю все ip серверов кластера в явном виде в переменной no_proxy.

Set a network range in the no_proxy environment variable

no_proxy: This variable should contain a comma-separated list of domain extensions proxy should not be used for

patroni

stats_temp_directory – я наступил на ситуации, когда пришлось снести базу на ведомом узле кластера. После этого, при запуске: инициализация базы происходит, репликатор всасывает с мастера, но потом postgres не стартует, ругается на отсутствующий каталог. Ибо он создаётся при стандартном запуске сервиса postgres, но не при запуске через patroni. Соответственно, в конфиге patroni должна быть эта опция.

wal_keep_segments – в примере от 1С – стоит 8. Но, это несерьёзно. Если потребуется пересоздать базу на слейве или добавить узел в кластер, то репликатор на ведомом просто не будет успевать всосать в себя базу за то время, пока файлы wal не перезапишутся. И реплика не создастся. Ну, вот у меня нагрузка такая, я наступал на эти грабли. Моё мнение: должно хватать на максимальный размер технологического окна, чтобы на слейве можно было сделать всё, что требуется. Каждый сегмент – 16 метров, 1000 должно хватать часа на четыре 🙂

haproxy

Самая беспроблемная (пока) часть. Тупо, по инструкции и работает, на удивление.

TimescaleDB

Расширение должно быть доступно при работе с любой схемой пользователя. Для некоторых прикладух, типа zabbix, это важно. Соответственно, я ставлю в pg_catalog. Т.е., команда \dx должна выдавать что-то типа:

=> \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+------------------------------------------------------------------------
...
timescaledb | 2.8.1 | pg_catalog | Enables scalable inserts and complex queries for time-series data

Поскольку для меня данный опыт будет, возможно, первым и последним, тонкие настройки – потом. Да и вообще, сделана куча ляпов, но “на скорость не влияет”, а описывать все изменения, которые я уже внёс – лень.

Использованные материалы. Извините, если кого забыл

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