Назад | Перейти на главную страницу

Как использовать распределенную базу данных PostgreSQL на веб-сайте?

Я хочу разместить веб-сайт, бэкэнд будет сервером базы данных PostgreSQL. Я хотел бы иметь несколько веб-серверов в разных центрах обработки данных для резервирования. Затем я бы использовал циклический DNS для каждого веб-сервера, чтобы распределить нагрузку.

Должен ли я для этого иметь несколько баз данных и использовать какую-то репликацию? Или было бы лучше иметь одну базу данных и каждый веб-сервер указывал на нее через Интернет?

Обновление 1

Была высказана идея, что несколько веб-серверов должны иметь несколько серверов БД, чтобы исключить единую точку отказа. Мне бы очень хотелось, чтобы в каждом центре обработки данных был установлен дубликат. У меня был бы веб-сервер и сервер БД в каждом центре обработки данных. Я не был уверен, возможно ли это, поэтому остался открытым для идеи иметь только один сервер БД или все БД в одном месте. Но в идеале у каждого дата-центра должен быть свой.

Я недавно попытался выяснить это для похожего проекта. Я обнаружил, что это не так просто. Когда дело доходит до репликации, существует несколько открытых и коммерческих альтернатив. Однако большинство из них не поддерживает несколько решений «мастер-мастер», и многие из них сложно поддерживать и настраивать.

У вас есть несколько альтернатив, в зависимости от того, как настроено ваше веб-приложение и сколько вам нужно избыточности. Самый простой из них - это, вероятно, теплый режим ожидания (эта функция уже включена в версию 8.3), но в случае сбоя у вас будет простой.

Другие решения репликации, которые я рассмотрел, включают:

Из них я нашел Bucardo наиболее интересным, поскольку он поддерживает master-master (хотя и не multi) и, кажется, довольно прост в настройке.

Slony немного сложно настроить, а также требует значительного обслуживания при обновлении таблиц (изменения DDL не реплицируются), а также является только мастером-подчиненным, что означает, что вы можете писать только в одну базу данных.

PgCluster, похоже, не поддерживается и не производит серьезного впечатления от документации и веб-сайта (веб-сайт не обновлялся с 2005 года).

Выполнение глобального циклического перебора через DNS может привести к тому, что ваши соединения будут нестабильными. Если ваш код не поддерживает узел, вы должны ожидать записи в любую из реплицированных баз данных.

Вы можете выполнить настройку репликации с несколькими мастерами с пара решений. Раньше я успешно использовал PgCluster. Также есть интересный проект на Postgres-R.

Имейте в виду, что последовательность - ваш враг. Если вы пишете в один узел, а затем читаете из другого, ваш запрос может превзойти вашу фиксацию в другой базе данных.

Если основная часть ваших запросов - это чтение, вы можете настроить обычную схему репликации, а затем сделать так, чтобы ваш код выполнял запись в центральную главную базу данных. Это больше работы, но облегчает решение проблемы согласованности. Вы можете использовать что-то вроде Slony делать «нормальную» репликацию.

Изменить: я согласен с комментариями о том, что PgCluster сложно настроить и у него плохие документы! Я не ссылался на них, так как их сайт не работает, когда я пишу это.