Для одного проекта потребовалась довольно специфичная конфигурация из нескольких серверов БД. Суть в следующем. Есть один центральный узел и N региональных узлов. Связи между региональными узлами нет, но все региональные узлы связаны с центральным. Нужно поддерживать все базы в синхронном состоянии. Т.е. при изменении таблицы на одном из региональных узлов эти изменения должны отразиться на центральном узле и на всех остальных региональных (через центр). Аналогично, при изменении данных на центральном сервере они должны быть перенесены на региональные.
Можно ли организовать подобное с PostgreSQL? Если да, то в каком направлении смотреть, буду признателен за ссылки на документацю.
И второй вопрос, отчасти связанный с первым. Можно ли процесс синхронизации пустить «в обход», чтобы пакеты изменений шли не напрямую от центра к региону, а через один или несколько промежуточных узлов-маршрутизаторов. Что-то вроде форвардинга пакетов.
Ответ на второй вопрос сперва
Ответ на второй вопрос сперва - главное, чтобы сервервы видели друг друга по TCP/IP.
Ответ на первый вопрос не столь очевиден. У меня встречный вопрос - а что мешает региональным серверам общаться друг с другом через канал центрального? Раз региональные серверы оба видят центральный, то дело лишь за правильной маршрутизацией пакетов. Настройте и будет вам счастье и мультимастер-репликация, т.е. каждый сервер будет одновременно и мастер и слейв.
Спасибо за ответ! По поводу
Спасибо за ответ!
По поводу топологии. По идее ничего не мешает региональным базам общаться друг с другом через центр, но региональных серверов достаточно много (около 40), и как понимаю, в этом случае число сетевых запросов, проходящих через центр будет очень большим. Т.е. от каждого региона надо послать данные в центр и остальные N-1 регионов.
А не посоветует софт для организации мультимастр-репликации? Пока присматриваемся к Bucardo, но может упустили какие-то ещё варианты.
Кстати, возник ещё такой
Кстати, возник ещё такой вопрос. А не возникнет ли зацикливания когда от одного региона приходят изменения в центр, а центр эти изменения рассылает во все регионы, в том числе и тот, который их и прислал?
Если репликация настроена
Если репликация настроена грамотно никаких зацикливаний не наступает
Собственно всё написано в
Собственно всё написано в мануале:
http://postgresql.ru.net/manual/different-replication-solutions.html
Могу лишь высказать своё мнение. В вашем случае я бы рассмотрел такой вариант.
Приложение в регионе не работает напрямую ни с каким PostgreSQL-сервером. Вместо этого оно работает с промежуточным сервером, который запросы измеряющие данные - отправляет в центр, а запросы читающие данные отправляет на обработку региональному серверу. При этом настроена удалённая репликация типа master-hot standby или master-slave, где master - центральный сервер, а slave-серверы региональные. Подавляющее большинство запросов как правило касается чтения данных, поэтому такая архитектура кажется мне наиболее подходящей.