Добрый день.
Задача состоит в том, что нужно разработать такую схему, при которой будет удобно динамически масштабировать БД без даунтайма. Объясню более подробно:
В docker-контейнере поднят, например, Postgres, настроенный на репликацию в качестве мастера и контейнер со слейвом. До какого-то времени это выдерживает нагрузки и всё нормально. Но в какой-то момент сервер перестанет справляться с запросами (заранее точно не известно сколько будет селектов и инсертов/апдейтов, но скорее всего поровну или даже больше будет именно последних). Тогда будет необходимо поднять ещё один сервер с БД и если нагрузки не упираются в железо, то можно, например, сделать:
docker-compose scale db-slave=2
Тогда нужно балансировать нагрузку. Для этого возможно использовать pgpool: поднимаем сначала контейнер с pgpool и прописываем адрес бэкенда, затем поднимаем контейнер с БД.
Проблема номер один возникнет, когда нужно будет масштабировать. Придётся убивать контейнер с pgpool и поднимать его с указанием дополнительных бэкендов. А это недопустимый даунтайм.
Проблема номер два - если апдейтов/инсертов будет равно или больше селектов... Вижу решение в мультимастер-репликации, но мне сложно представить, как это реализовать и исключить неконсистентность данных.
Проблема номер три - железо. Однажды возможности сервера иссякнут и нужно будет докупать ещё один сервер. И для этого есть интересный проект Kubernetes. Он позволяет поднимать контейнеры на других серверах. Но как этим всем управлять??? Как балансировать запросы?
Возможно, postgres не лучший вариант для этих целей? Если это так - посоветуйте, пожалуйста, другую СУБД. Расскажите, кто как делает у себя.
Прошу вашей помощи. Заранее благодарю.