Репликация некоторых таблиц из одной базы данных postgres в другую


9

У меня следующая ситуация: у меня есть три машины с базами данных postgresql. Один компьютер содержит информацию об учетной записи клиента (назовите этот компьютер C), на двух других машинах хранится информация регистрации клиента (назовите эти L1 и L2). Причина разделения заключается в том, чтобы разделить загрузку на несколько машин (поэтому некоторые клиенты отправляют информацию о журналировании на L1, некоторые на L2 ... и, возможно, иногда на L3, L4, ...).

При получении информации о журнале, в принципе, я хотел бы иметь возможность СОЕДИНЯТЬСЯ между таблицами журналов на Ln и таблицами учетных записей клиентов на C. На самом деле я не могу делать JOINы подобным образом (и даже если бы я мог, я бы чтобы избежать загрузки C).

Моя мысль состоит в том, чтобы скопировать таблицы на C на каждый из L1, L2, ... так, чтобы я мог сделать соединения. Что касается таблиц из C, то C является ведущим, а L1, L2, ... - ведомыми. Но для других таблиц на L1, L2, ... эти машины являются мастерами. Это не совсем реплика мастер-мастер, и не является ли она точно подчиненной.

Можно ли убедить репликацию postgres (я использую 9.1), или, если нет, существуют ли другие пакеты, которые бы выполняли эту работу. В крайнем случае, я могу написать некоторый код периодически синхронизируемых таблиц (я могу допустить некоторую задержку), но было бы неплохо этого не делать!

Заранее спасибо.


1
Возможно использовать FDW на машинах регистрации для доступа к C? Хотя это повлечет за собой снижение производительности на C. Материализованные представления могут снизить снижение производительности, но я не совсем уверен, как PostgreSQL обнаруживает обновления для сторонней таблицы. Если это происходит автоматически (что, по-видимому, означает конец документации Materialized View), это может полностью решить вашу проблему. Это 9,3 функции, хотя. Очень активный список рассылки также может помочь.
jpmc26

Ответы:


4

В PostgreSQL 9.3 вы можете использовать postgres_fdwдля прозрачного запроса чужой таблицы на другом компьютере.

На более старых версиях dblinkможет быть вариант, упомянутый Эндрю.

Другой вариант - использовать такой инструмент, как Londiste или Slony-I, для репликации нужных вам таблиц. Я рекомендую использовать Londiste для этого, это будет намного проще. Он создает триггеры в таблице для обнаружения вставки / обновления / удаления и реплицирует их, используя свой собственный клиент / сервер и систему очередей, в другую базу данных, где он выполняет соответствующую вставку / обновление / удаление. Я использую его в производстве на нескольких клиентских сайтах, и он работает очень хорошо.

В будущем (возможно, в PostgreSQL 9.5) будет использоваться логическая репликация потоковой передачи журналов, извлечение логических изменений и двунаправленная репликация, что позволит реплицировать отдельные базы данных или таблицы на уровне SQL. Часть работы для этого была посвящена PostgreSQL 9.4, но этого недостаточно, чтобы сделать его полезным для того, что вы хотите сделать.


3

Вы должны использовать dblinks и материализованные представления для достижения этой цели. Обе функции встроены в последние версии Postgres:

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

По сути, вы создаете Mview для каждой базы данных L1, L2 ... с данными, извлеченными из таблиц на C, а затем используете обновление Mview для периодического обновления Mviews так часто, как это требуется. Данные хранятся локально, поэтому доступ к ним очень быстрый. Это подходит только в том случае, если данные относительно статичны, и вы не возражаете против локальных баз данных, иногда имеющих немного устаревшую информацию. Вы должны установить частоты обновления, чтобы управлять этим соответствующим образом, и если это неприемлемо, тогда вы должны просто использовать ссылку на базу данных и иметь дело с результирующей медлительностью.

Если вам нужны дополнительные функции, проект снимков предоставляет расширенные функции, такие как быстрое обновление и журналы снимков:

http://pgfoundry.org/projects/snapshot/

Благодаря этому вы можете выполнять обновления только для тех строк, которые нуждаются в обновлении, что может сделать их чрезвычайно быстрыми для больших неэластичных наборов данных, сводя к минимуму нарушение работы вашего приложения. По умолчанию Mviews полностью удаляются и воссоздаются в Postgres, что может быть очень плохим по производительности по понятным причинам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.