Готово ли производство репликации PostgreSQL?

16

Как собственная репликация PostgreSQL сравнивается с MySQL?

Я знаю, что асинхронная репликация поддерживается дольше, чем синхронизация, что недавно. Является ли синхронный надежным для использования в реальных проектах?

SrgHartman
источник

Ответы:

31

Производство готово?

Да, он готов к производству и широко используется. Последователи Heroku основаны, например, на встроенной асинхронной репликации PostgreSQL, а также на AWS RDS standbys и репликах чтения. Потоковая репликация используется почти повсеместно в PostgreSQL.

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

В общем, функция просто не будет выпущена в PostgreSQL, пока не будет готова к работе. Ошибки случаются, как и в любом программном обеспечении, но обычно они исправляются вскоре после их выявления. В действительно важных новых функциях иногда возникают ошибки и проблемы, обнаруженные после выпуска .0, но если это так, исправление их является первоочередной задачей; ошибки не просто остались.

Я не знаю каких-либо серьезных проблем с потоковой репликацией - синхронизация или асинхронность - и я не видел никаких сообщений в течение достаточно долгого времени. Они были менее стабильны, чем обычный стандарт Pg в .0 выпусках основных версий, в которых они были представлены, но оба быстро созрели и полностью готовы к производству.

(Обновление: в новой версии 9.3 до 9.3.4 была специфическая ошибка, которая в некоторых случаях вызывала проблемы с репликацией; пользователям 9.3 следует немедленно обновить до 9.3.4. Более старые версии не затрагиваются.)

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

Сравните с MySQL?

Собственная репликация Pg сильно отличается от MySQL.

MySQL использует логическую репликацию, где он отправляет логические изменения, внесенные в данные таблицы, структуру таблицы и т. Д., И реплика применяет эти изменения.

Репликация PostgreSQL находится на более низком уровне (в 9.5 и ниже; в будущих версиях также может быть добавлена ​​логическая репликация). Он отправляет блоки, которые изменились в таблицах. Это проще, легче получить правильную информацию и снижает нагрузку на сервер реплики, но потребляет большую пропускную способность сети и требует больше памяти на главном сервере для хранения еще не реплицированных изменений. Лучше всего настроить потоковую репликацию с резервным резервированием WAL, что делает его более сложным в настройке, чем MySQL. Он реплицирует изменения низкого уровня, такие как активность VACUUM, а не только изменения кортежей, сохраняя состояние реплики на диске таким же, как и у основного. Он не способен реплицировать только одну базу данных; вся система должна быть реплицирована, что может расстраивать, если у вас есть одна большая база данных с высоким уровнем оттока и неважной базой данных и одна маленькая база данных с низким уровнем оттока и важной базой данных.

В общем, все зависит от того, что вы хотите с ним делать.

Я считаю, что репликация PostgreSQL значительно лучше для реплик, используемых для резервного копирования, высокой доступности и аварийного восстановления. Особенно в сочетании с моментом восстановления (PITR) .

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

Продолжается работа по включению логической репликации в PostgreSQL , где реплицируются логические изменения структуры таблицы, содержимого таблицы и т. Д., А не их состояние на диске. Дизайн каталога Pg и поддержка всего определяемого пользователем делает эту задачу довольно сложной. Некоторая основа была заложена для 9.4, но полная логическая репликация вряд ли будет использоваться до 9.6 или позже.

Крейг Рингер
источник
Отличный ответ на вопрос, который у меня тоже был. Спасибо, Крейг.
swasheck
6
Есть одна вещь в syn rep, которая удивляет некоторых пользователей, но на самом деле имеет смысл, если вы подумаете об этом: фиксация транзакции, которая подлежит синхронной репликации, не вернется, пока транзакция не будет сохранена хотя бы в одном кластере, кроме главного , Люди из других систем считают, что это должно произойти, если попытка репликации не займет слишком много времени , что означает «синхронно, если это не так», что не является приемлемой гарантией для сообщества PostgreSQL. Используйте несколько целей синхронизации, чтобы избежать остановки в случае сбоя реплики, или используйте асинхронный режим.
кгрит
1
@kgrittn Хорошая мысль о нескольких целях. Я слегка испуган тем, что кто-то захочет / ожидает возврата коммита до репликации транзакции в синхронной репликации; Похоже, они действительно хотят асинхронную репликацию с максимальным пределом промежутка подписчика, который приостанавливает запись на мастер, пока подписчики не догонят достаточно? Совершенно разумная вещь, которую нужно хотеть, но не синхронизировать респ.
Крейг Рингер,
1
@CraigRinger: я видел, что люди просят не совсем то, что вы заявили, они иногда просят «использовать синхронизацию, но автоматически переходят к асинхронному представлению, если синхронизация занимает слишком много времени». Таким образом, они не хотят приостанавливать работу мастера, если он слишком далеко отходит от реплики, - это как раз тот случай, когда они хотят, чтобы он подтвердил быстрые фиксации без какой-либо записи на другой сайт. Для меня это звучит как обещание большего, чем обещанное. Они хотят заранее: «Да, у вас есть представитель синхронизации; вы в безопасности». и после сбоя «Эти подтвержденные данные исчезли; они больше нигде не были записаны».
kgrittn
@CraigRinger может обновить его с помощью pg10 / logic?
Эван Кэрролл