Синхронная репликация
Синхронную репликацию обычно используют, чтобы избежать потери некоторых транзакций. В Stolon она реализована таким образом, чтобы исключить возможность выбора несинхронизированных резервных серверов в качестве новых главных серверов.
Когда включена синхронная репликация, Stolon всегда обеспечивает наличие у главного сервера N синхронных резервных серверов (где N будет между значениями MinSynchronousStandbys и MaxSynchronousStandbys, определёнными в спецификации кластера). Если доступных резервных серверов недостаточно, он также добавит поддельный резервный сервер в synchronous_standby_names
. Добавление несуществующего резервного сервера гарантирует, что главный сервер всегда будет блокироваться в ожидании удалённых коммитов.
Включить или отключить синхронную репликацию можно в любое время, и хранители переконфигурируют себя с помощью команды stolonctl update
, чтобы обновить спецификацию кластера.
В спецификации кластера можно установить значения MinSynchronousStandbys
и MaxSynchronousStandbys
(по умолчанию оба равны 1). Наличие нескольких синхронных резервных серверов — это функция, предоставляемая начиная с PostgreSQL 9.6. Значения, отличные от 1 для версий PostgreSQL ниже 9.6, будут игнорироваться.
Предполагая, что имя вашего кластера — mycluster
и вы используете etcd (v3 api), прослушивающий порт localhost:2379:
stolonctl --cluster-name=mycluster --store-backend=etcdv3 update --patch '{ "synchronousReplication" : true }'
stolonctl --cluster-name=mycluster --store-backend=etcdv3 update --patch '{ "synchronousReplication" : false }'
Установите значения MinSynchronousStandbys/MaxSynchronousStandbys больше 1 (только при использовании PostgreSQL >= 9.6)
stolonctl --cluster-name=mycluster --store-backend=etcdv3 update --patch '{ "synchronousReplication" : true, "minSynchronousStandbys": 2, "maxSynchronousStandbys": 3 }'
У синхронной репликации PostgreSQL есть недостаток, описанный в документации:
Если первичный сервер перезапускается во время ожидания подтверждения коммитов, эти ожидающие транзакции будут помечены как полностью зафиксированные после восстановления первичной базы данных. Невозможно быть уверенным, что все резервные серверы получили все выдающиеся данные WAL на момент сбоя первичного сервера. Некоторые транзакции могут не отображаться как зафиксированные на резервном сервере, даже если они отображаются как зафиксированные на первичном сервере. Гарантия, которую мы предлагаем, заключается в том, что приложение не получит явного подтверждения успешной фиксации транзакции до тех пор, пока данные WAL не будут надёжно получены всеми синхронными резервными серверами.
При некоторых событиях это может привести к потере транзакций. Например:
Таким образом, могут возникнуть некоторые условия, при которых синхронизированный резервный сервер может быть выбран, даже если он пропустил последние транзакции, если он был недоступен во время фиксации.
Эту проблему нелегко решить, поскольку эти события не могут быть разрешены sentinel, поскольку невозможно узнать, действительно ли синхронизированный резервный сервер синхронизирован, когда основной сервер не работает (поскольку мы не можем запросить его последнюю позицию WAL, а отчёт от хранителя является асинхронным).
Но с Stolon у нас есть возможность преодолеть эту проблему, замечая, когда первичный сервер перезапускается (поскольку он контролируется нами), и разрешая только «внутренние» соединения до тех пор, пока все определённые синхронные резервные сервера не синхронизируются.
Разрешение только «внутренних» соединений означает запрет на... Добавление стандартных правил или пользовательских правил pgHBA, но только тех, которые необходимы для репликации (и локального взаимодействия с keeper).
Поскольку «внутренние» правила принимают определённого суперпользователя и пользователей репликации, клиент не должен использовать эти роли для нормальной работы, иначе вышеуказанное решение не будет работать (но они всё равно не должны этого делать, так как это может привести к исчерпанию зарезервированных соединений суперпользователя, необходимых keeper для проверки экземпляра).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )