LINUX.ORG.RU
ФорумAdmin

Горизонтальное масштабирование базы данных

 , , , ,


0

5

Добрый день.

Задача состоит в том, что нужно разработать такую схему, при которой будет удобно динамически масштабировать БД без даунтайма. Объясню более подробно:

В docker-контейнере поднят, например, Postgres, настроенный на репликацию в качестве мастера и контейнер со слейвом. До какого-то времени это выдерживает нагрузки и всё нормально. Но в какой-то момент сервер перестанет справляться с запросами (заранее точно не известно сколько будет селектов и инсертов/апдейтов, но скорее всего поровну или даже больше будет именно последних). Тогда будет необходимо поднять ещё один сервер с БД и если нагрузки не упираются в железо, то можно, например, сделать:

docker-compose scale db-slave=2
(Рассмотрим пока случай, когда селектов больше)

Тогда нужно балансировать нагрузку. Для этого возможно использовать pgpool: поднимаем сначала контейнер с pgpool и прописываем адрес бэкенда, затем поднимаем контейнер с БД.

Проблема номер один возникнет, когда нужно будет масштабировать. Придётся убивать контейнер с pgpool и поднимать его с указанием дополнительных бэкендов. А это недопустимый даунтайм.

Проблема номер два - если апдейтов/инсертов будет равно или больше селектов... Вижу решение в мультимастер-репликации, но мне сложно представить, как это реализовать и исключить неконсистентность данных.

Проблема номер три - железо. Однажды возможности сервера иссякнут и нужно будет докупать ещё один сервер. И для этого есть интересный проект Kubernetes. Он позволяет поднимать контейнеры на других серверах. Но как этим всем управлять??? Как балансировать запросы?

Возможно, postgres не лучший вариант для этих целей? Если это так - посоветуйте, пожалуйста, другую СУБД. Расскажите, кто как делает у себя.

Прошу вашей помощи. Заранее благодарю.

Потрясающая наивность

Ишь одна проблема у него, даунтайм при релоаде pgpool. То же самое что строить бизнес с нуля и найти единственную проблему в том что деньги будет некуда складывать.

Про джойны не забыл? Если джойны не нужны, нет смысла брать РСУБД

anonymous
()

Не надо pgpool

У меня так:

Front server:
pgbouncer:
host=127.0.0.1:5000 #master
host=127.0.0.1:5001 #slave

haproxy:
frontend master
bind 127.0.0.1:5000
frontend slave
bind 127.0.0.1:5001
backend backend_master
option httpchk OPTIONS /master
server node1 example.com:5432 check port 8008
server node2 example.com:5432 check port 8008
backend backend_slave
option httpchk OPTIONS /slave
server node1 example.com:5432 check port 8008
server node2 example.com:5432 check port 8008

DB server:
Patroni (https://github.com/zalando/patroni/) + PostgreSQL

uspen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.