Я пробовал Postgres-XC, но он еще не реализует полный SQL (например, SERIAL)
Postgres-R выглядит интересно, но, по словам разработчиков, он «не готов к производству».
Поэтому я использовал pgpool-II 3.0.1. Да, прекрасно работает. Но насколько я понимаю, это только для 2 узлов PG.
Есть ли что-нибудь, что действительно готово к производству И способно работать с несколькими узлами PG?
Вы считали Bucardo? Это асинхронный мультимастер. Это не полностью прижилось и не является общим решением, но, возможно, стоит попробовать.
Я должен согласиться с оценкой Питера: на самом деле нет хорошо репликация с несколькими мастерами для Postgres прямо сейчас. (Выполнение настоящей репликации с несколькими мастерами - очень сложная проблема, и я не в восторге от любого из доступных решений.)
Составьте список потенциальных решений, которые вы, возможно, захотите изучить в Википедии:
PostgreSQL предлагает несколько решений для репликации с несколькими мастерами, включая решения, основанные на двухфазной фиксации. Есть Bucardo, rubyrep, PgPool и PgPool-II, PgCluster и Sequoia, а также некоторые проприетарные решения. Другой многообещающий подход, реализующий активную (синхронную) репликацию, - это Postgres-R, однако он все еще находится в разработке. Еще один проект, реализующий синхронную репликацию, - Postgres-XC. Postgres-XC также все еще находится в стадии разработки.
Это сильно ориентировано на Java, но собственные клиентские API баз данных могут быть связаны с источниками данных JDBC. Tungsten Myosotis - это пример MySQL, встроенного в мост JDBC.
Tungsten Enterpriese подходит для асинхронного режима с несколькими ведущими. Я думаю, что это работает для MySQL, PostgreSQL и Oracle. Он может работать автономно или встроен в приложение Java. Я видел, как это работает для MySQL, но они требуют PostgreSQL. Их компонент Replicator имеет открытый исходный код, но полное решение состоит из большего количества частей и требует затрат на лицензирование. Первоначально у Continuent была Sequoia для синхронной работы с несколькими ведущими, но они отказались от нее и создали Tungsten вместо асинхронной с несколькими ведущими - они считают горизонтальное масштабирование более стратегическим бизнесом, чем синхронная согласованность ACID. Tungsten написан на Java, поэтому они предлагают Myosotis для соединения собственных клиентов баз данных.
SymmetricDS подходит для асинхронной работы с несколькими мастерами. Это открытый исходный код. Он устанавливает / удаляет триггеры для сбора обновлений, а не ведение журнала. Он может работать автономно или встроен в приложение Java.
HA-JDBC хорош для синхронной работы с несколькими мастерами. Он заменяет более старое несуществующее программное обеспечение, такое как C-JDBC и Sequoia. Это открытый исходный код. Он использует двухфазную фиксацию и работает с PostgreSQL, MySQL, Oracle, SQL Server, Derby, Sybase и многими другими через диалекты. В основном он предназначен для встраиваемых систем, поэтому встраивайте его в приложение Java, чтобы связать его с PostgreSQL. Распределенные блокировки, последовательности, время, рандом и т. Д. Обрабатываются jGroups от Redhat / JBoss. Одна приятная особенность - это режим транзакции «последовательный» вместо «параллельного», если ваше приложение столкнулось с взаимоблокировками и не поддерживает откат. Я успешно использовал этот «последовательный» режим для модернизации устаревшего приложения, которое не поддерживает кластер БД, поэтому в нем отсутствовал код повтора транзакции. Последовательный режим спас положение и позволил избежать неприятной перезаписи.
H2 подходит для синхронной работы с несколькими ведущими. Это открытый исходный код. Он поддерживает автономные базы данных или кластеры, использующие двухфазную фиксацию, аналогично архитектуре HA-JDBC, но это все в одном, а не требует дополнительного компонента для двухфазной фиксации. Не уверен, выполняет ли он распределенные блокировки самостоятельно или зависит от сторонних разработчиков, таких как jGroups или Hazelcast.
Любая репликация на основе JDBC для PostgreSQL и других баз данных требует встроенного моста JDBC, если ваше приложение еще не написано на Java. Для MySQL Tungsten Enterprise предлагает дополнительный компонент Myosotis. Я успешно использовал это, чтобы связать PHP / Perl / C / mysqlclient с JDBC, где источником данных JDBC оказался источник данных прокси HA-JDBC, указывающий на 4-узловой кластер MySQL / InnoDB.
Tungsten поддерживает PostgreSQL в своих компонентах Replicator и Router, но не уверен в компоненте Myosotis. Может быть. Компоненты Tungsten Replicator / Router предназначены для асинхронной работы с несколькими мастерами, но Myosotis может связать вас с альтернативным сервером JDBC, таким как HA-JDBC или H2 для синхронного.
Если есть собственный PostgreSQL для моста JDBC, я хотел бы услышать об этом. Теоретически любая база данных с драйвером JDBC Type 4 может быть соединена мостом. Тип 4 JDBC использует собственный протокол базы данных так же, как собственный клиентский интерфейс для этой базы данных, поэтому должно быть однозначное сопоставление собственных вызовов с вызовами JDBC.
Ответ на этот вопрос - решительное нет.
Я использую londiste последние 2 года для репликации с несколькими мастерами в postgresql.
Вы помещаете свои таблицы в очереди с помощью pg_queue, и вы можете подписаться на столько других баз данных, сколько хотите, на каждую очередь, репликация выполняется атомарно по очереди и очень устойчиво.
О лондисте можно прочитать здесь (http://pgfoundry.org/projects/skytools/), это то, что ребята из Skype используют для своего кластера, тоже они его создали, так что это вдвойне круче :)
Если вам все еще интересно, попробуйте это: http://www.symmetricds.org/ (Только Java)
Я нашел пригодную для использования систему репликации с несколькими мастерами:
получить RabbitMQ http://www.rabbitmq.com/ - это промежуточное ПО для сообщений.
настроить кластер Rabbit MQ в Rabbit.
создать очередь для каждого узла в кластере и привязать их к обмену типа «fanout».
Таким образом, сообщение, отправленное на любой узел и любую очередь, реплицируется на все другие узлы. У меня есть для этого рабочий код!