Мультимайстерна реплікація USABLE для Postgres?


16
  1. Я спробував Postgres-XC, і він ще не реалізує повний SQL (наприклад, SERIAL)

  2. Postgres-R виглядає цікаво, але, на думку розробників, це не готове виробництво.

Тому я використав pgpool-II 3.0.1. Так, це чудово працює. Але наскільки я бачу, це лише для 2-х PG вузлів.

Чи є щось там, що насправді готове до виробництва та здатне працювати з кількома PG-вузлами?


Кілька років тому ми приземлилися з тією ж проблемою. Врешті-решт, ми перенесли всі наші речі в Oracle. Сподіваємось, ви сьогодні можете знайти корисну мультимайстерну реплікацію, я не дивився ... Удачі, тим більше.
grufftech

2
PostgreSQL власної документації «s каже , щоб використовувати додаток проміжного :) ..» Синхронний Multimaster Replication .. PostgreSQL не пропонує цей тип реплікації, хоча PostgreSQL двухфазной фіксації (ГОТУВАТИ TRANSACTION і COMMIT ГОТОВИЙ) можуть бути використані для реалізації цього в код програми або проміжне програмне забезпечення "
warren

Ви не обмежені двома вузлами.
foocorpluser

Відповіді:


6

Ви розглядали Букардо ? Це асинхронний мультимайстер. Це не повністю наздогнало і не є загальним рішенням, але, можливо, варто спробувати.


1
Мабуть, я не був достатньо конкретним: мені потрібна синхронна реплікація. Крім того, який сенс цього у FAQ? "Чи може Букардо копіювати між більш ніж двома господарями? Ні. Букардо підтримує лише майстра, щоб оволодіти (як і майстра багатьох рабів, звичайно)." Так це мультимайстер чи ні?
mrkafk

4
Тільки якщо ваше визначення "мульти" - "2"!
hmallett

Зауважте, що, починаючи з Bucardo 5, обмеження лише 2 майстрів було знято
Joril

3

Я повинен погодитися з оцінкою Петра: На даний момент немає дійсно гарної мультимайстерної реплікації для Postgres. (Зробити справжню реплікацію мультимайстра - дуже складна проблема, і я не захоплююся жодним із доступних рішень.)

Склавши список можливих рішень Вікіпедії, які ви хочете вивчити:

PostgreSQL пропонує безліч рішень для багатопрофільної реплікації, включаючи рішення, засновані на двофазній фіксації. Існують Bucardo, rubyrep, PgPool і PgPool-II, PgCluster і Sequoia, а також деякі фірмові рішення. Іншим перспективним підходом, що реалізує нетерплячу (синхронну) реплікацію, є Postgres-R, однак він ще в розробці. Ще один проект, що реалізує синхронну реплікацію - це Postgres-XC. Postgres-XC також ще знаходиться на стадії розробки.


Нічого собі, просто читання цього списку викликає у мене шок і жах. :)
Пітер Ейзентраут

Для мене це депресія та ненависть :-)
voretaq7

Я думаю, що використання системи, подібної до etcd для конфігурації та комунікацій, можливо, можливо, запуск будь-якого оператора оновлення протягом двох фазових комірок ... важка частина буде утримувати вузол, поки він не наздогнать і не відповідає іншим вузлам .. Мені б дуже хотілося майже автоматичне рішення для цього
Tracker1

3

Це дуже орієнтоване на Java, але API рідних клієнтських баз даних можна з'єднати з джерелами даних JDBC. Вольфрамовий Myosotis - приклад для MySQL, що є власником мосту JDBC.


  • Вольфрам Enterpriese добре підходить для асинхронного керування кількома майстрами. Я думаю, що це працює для MySQL, PostgreSQL та Oracle. Він може працювати окремо або вбудовано в додаток Java. Я бачив, як це працює для MySQL, але вони стверджують, що PostgreSQL. Їх компонент Replicator є відкритим кодом, але повне рішення має більше деталей і вимагає ліцензійних витрат. Первісні спочатку мали Sequoia для синхронного керування кількома майстрами, але вони відмовилися від неї і створили Вольфрам замість асинхронного мультимайстра - вони вважають масштабування більш стратегічним бізнесом, ніж синхронну послідовність ACID. Вольфрам написаний на Java, отже, саме тому вони пропонують Myosotis з'єднати рідних клієнтів баз даних.

  • SymmetricDS добре підходить для асинхронних мультимайстрів. Це з відкритим кодом. Він встановлює / видаляє тригери для зйомки оновлень, а не логічного журналу. Він може працювати окремо або вбудовано в додаток Java.

  • HA-JDBC хороший для синхронного керування декількома майстрами. Він випереджає більш старі програми, такі як C-JDBC та Sequoia. Це з відкритим кодом. Він використовує двофазну фіксацію і працює для PostgreSQL, MySQL, Oracle, SQL Server, Derby, Sybase та багатьох інших через діалекти. Це в основному для вбудованих, тому вбудовуйте в програму Java, щоб перевести її на PostgreSQL. Розподіленими блокуваннями, послідовностями, часом, rand тощо, обробляються jGroups від Redhat / JBoss. Одна приємна особливість - режим транзакції "серійний" замість "паралельний", якщо ваш додаток зазнав тупикових ситуацій і не підтримує відкат. Я успішно використовував цей "серійний" режим для доопрацювання застарілого додатка, який не був відомий DB-кластеру, тому в ньому відсутній код повторної транзакції. Серійний режим врятував день і уникнув неприємного переписування.

  • H2 хороший для синхронного керування кількома майстрами. Це з відкритим кодом. Він підтримує окремі бази даних або кластери, використовуючи двофазну фіксацію, подібну архітектурі HA-JDBC, але це все в одному, замість того, щоб вимагати додаткового компонента для двофазної фіксації. Не впевнений, чи дійсно він розподіляє блокування самостійно, або залежить від сторонніх виробників, таких як jGroups або Hazelcast.

Будь-яка реплікація, що базується на JDBC, для PostgreSQL та інших баз даних, має потребу в мові JDBC, якщо ваша програма вже не написана на Java. Для MySQL Tungsten Enterprise пропонує додатковий компонент під назвою Myosotis. Я успішно використав це для перенесення PHP / Perl / C / mysqlclient до JDBC, де джерело даних JDBC було джерелом даних про-HA-JDBC, що вказує на 4-вузловий кластер MySQL / InnoDB.

Вольфрам підтримує PostgreSQL в компонентах Replicator і Router, але не впевнений у компоненті Myosotis. Можливо. Компоненти вольфрамового реплікатора / маршрутизатора призначені для асинхронного керування декількома майстрами, але Myosotis може переадресувати вас на альтернативний JDBC-бік, як HA-JDBC або H2 для синхронності.

Якщо є PostgreSQL, який є рідним для мосту JDBC, я хотів би почути про це. Теоретично будь-яку базу даних з драйвером JDBC Type 4 можна з'єднати. Тип 4 JDBC розмовляє з нативним протоколом бази даних так само, як і з власним клієнтським інтерфейсом для цієї бази даних, тому має бути індивідуальне відображення нативних викликів для дзвінків JDBC.


2

Відповідь на це - резонне "ні".


минуло кілька років, як я робив дослідження, але моя компанія прийшла до цього висновку, коли ми спробували.
grufftech

1

Я використовую londiste протягом останніх 2 років для мультимайстерної реплікації в postgresql.

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

Ви можете прочитати про londiste тут ( http://pgfoundry.org/projects/skytools/ ), це те, що хлопці Skype використовують для свого кластеру, також вони створили його, так що це вдвічі крутіше :)


Хм, це цікаво, але згідно з тим, що я бачив тут: wiki.postgresql.org/wiki/… , Londiste є Master-Slave та Asynchronous? То як воно може бути мультимайстром? Крім того, мені справді потрібна синхронна реплікація: транзакція повинна завершитися невдачею, якщо будь-який з (активних) кластерних вузлів вийде з ладу.
mrkafk

Ця реплікація є трансакційною, інакше вона буде досить повільною
рись

Я не маю на увазі звучати як біль у попці (нітпікінг), але ... 1. Я використав pgpool-II і транзакції пройшли досить швидко (хоча я ще не робив орієнтирів), і 2. хоча окрема транзакція може бути повільнішою, я не бачу вагомих причин, щоб загальна пропускна спроможність транзакцій була низькою. У будь-якому разі, мабуть, більш важливим моментом є те, як лондістський мультимайстер? Чи можу я записатись на pg-сервер 1 та повторити його на 2, а також записати на pg-сервер 2 та чи повторити його на сервер 1?
mrkafk


-2

Я знайшов корисну систему реплікації "multi-master":

  1. отримати RabbitMQ http://www.rabbitmq.com/ - це програмне забезпечення для повідомлення.

  2. налаштувати кластер Rabbit MQ у Rabbit.

  3. створити чергу для кожного вузла в кластері та зв’язати їх для обміну типами 'fanout'.

Таким чином повідомлення, надіслане на будь-який вузол і будь-яку чергу, реплікується на всі інші вузли. У мене є робочий код для цього!


2
@mrafk - ви б опублікували / прив'язали "робочий код", який у вас є?
warren

2
Що це стосується реплікації з постгресами? Це поширюватиме повідомлення, але де ви отримуєте повідомлення / оновлення даних із БД та як оновляється вузли, які отримують повідомлення у черзі повідомлень?
ченці

3
Це може бути вирішенням основної проблеми, з якою ви стикалися, але це не відповідь на це питання.
Том Андерсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.