Поскольку stolon по умолчанию обеспечивает согласованность в ущерб доступности, существует необходимость в том, чтобы клиенты были подключены к текущему кластерному избранному мастеру и отключены от неизбранных. Например, если вы подключены к текущему избранному мастеру, а затем кластер (по любой уважительной причине, такой как разделение сети) выбирает нового мастера, для достижения согласованности клиент должен быть отключен от старого мастера (иначе он будет записывать данные на него, которые будут потеряны при повторной синхронизации). В этом и заключается назначение прокси-сервера stolon.
Для нашей потребности принудительно закрывать соединения с неизбранными мастерами и обрабатывать хранителей/часовых, которые могут появляться и исчезать и менять свои адреса, мы внедрили специальный прокси, который напрямую считывает своё состояние из хранилища. Благодаря горутинам на языке Go это происходит очень быстро.
Мы открыты для альтернативных решений (приветствуются PR), таких как использование haproxy, если они могут соответствовать вышеуказанным требованиям. Например, гипотетический прокси на основе haproxy должен иметь возможность работать с изменяющимися IP-адресами, получать текущую информацию о кластере и иметь возможность принудительно закрыть соединение, когда бэкенд haproxy помечен как неисправный (обратите внимание, что для достижения последнего возможное решение, требующее тестирования, будет заключаться в использовании опции сервера haproxy on-marked-down shutdown-sessions).
В настоящее время прокси перенаправляет все запросы на мастер. Существует запрос функции для использования прокси также для резервных серверов, но он находится в конце списка приоритетов.
Существует простой скрипт на Python, который получает информацию о резервных серверах от stolonctl
и генерирует конфигурацию HAProxy: UnitedTraders/stolon-standby-haproxy.
Если ваше приложение хочет запросить горячие резервные серверы, в настоящее время вы можете прочитать резервные базы данных и их статус из данных кластера непосредственно из хранилища (но имейте в виду, что это не является стабильным решением).
stolon устраняет необходимость общего хранилища, поскольку он использует потоковую репликацию postgres и может избежать необходимости ограждения (убить узел, лишить доступа к общему хранилищу и т. д.) благодаря своей архитектуре:
Чистый подход kubernetes к достижению высокой доступности postgres заключается в использовании постоянных томов и statefulsets (petsets). Использование постоянных томов означает, что вы не потеряете ни одной транзакции. В настоящее время k8s требует ограждения, чтобы избежать повреждения данных при использовании statefulsets с постоянными томами (см. https://github.com/kubernetes/kubernetes/pull/34160).
Вместо этого stolon использует потоковую репликацию postgres для обеспечения высокой доступности. Чтобы избежать потери какой-либо транзакции, вы можете включить синхронную репликацию.
С stolon у вас также есть другие плюсы:
Используя предоставленный агент ресурсов pacemaker, вы можете достичь высокой доступности экземпляров и выбрать между использованием общего хранилища или без него. Репликация хранилища или потоковая репликация
Преимущества Stolon такие же, как и в предыдущем вопросе. Это позволит вам избежать необходимости в изоляции узлов и обеспечит более простое управление кластером и масштабирование.
Что происходит при разделении etcd/Consul?
См. «Архитектура Stolon и требования» (architecture.md).
Как выполняются резервные копии с помощью Stolon?
Stolon позволяет легко интегрироваться с любым решением для резервного копирования и восстановления. См. «Восстановление на момент времени» (pitr.md) и пример wal-e (pitr_wal-e.md).
Каким образом Stolon решает, какой резервный сервер должен быть повышен до главного?
При использовании асинхронной репликации ведущий Sentinel пытается найти лучший резервный сервер, используя доступный резервный сервер с ближайшим местоположением xlog к последнему известному местоположению xlog мастера. Если мастер не работает, нет способа узнать его последнее местоположение xlog (Stolon получает и сохраняет его через определённые промежутки времени), поэтому невозможно гарантировать, что резервный сервер не отстаёт, а просто будет выбран лучший из доступных резервных серверов.
При синхронной репликации будут выбраны только синхронные резервные серверы, поэтому отстающие от мастера резервные серверы выбраны не будут (обратите внимание на ограничения синхронной репликации PostgreSQL, объяснённые в документации PostgreSQL, например, когда мастер перезапускается, пока синхронные резервные сервера недоступны, транзакции, ожидающие подтверждения на мастере, будут помечены как полностью зафиксированные. Это «исправлено» Stolon. См. документацию по синхронной репликации (syncrepl.md).
Использует ли Stolon методы кворума синхронной репликации PostgreSQL (FIRST или ANY)?
Уже существует аналогичная, но более мощная и расширяемая функция, предоставляемая Stolon, которая управляется Sentinel с использованием параметров спецификации кластера MinSynchronousStandbys и MaxSynchronousStandbys (если вы хотите расширить её, пожалуйста, откройте запрос на новую функцию или запрос на вытягивание).
Мы намеренно не используем методы FIRST или ANY PostgreSQL с N, отличным от количества требуемых синхронных резервных серверов, потому что нам нужно, чтобы все определённые резервные серверы были синхронными (поэтому только один отказавший резервный сервер заблокирует основной).
Это необходимо для обеспечения согласованности. Если у нас есть 3 резервных сервера и мы используем FIRST 2 (a, b, c), Sentinel, когда мастер выходит из строя, не сможет определить, какой из 3 резервных серверов действительно является синхронным и синхронизирован с мастером. И выбор несинхронного приведёт к потере транзакций, содержащихся в записях wal, которые не были переданы.
Использует ли Stolon Consul в качестве DNS-сервера?
Consul (или etcd) используется только как хранилище ключей и значений.
Допустим, у меня несколько кластеров Stolon. Нужно ли мне отдельное хранилище (etcd или Consul) для каждого кластера Stolon?
Stolon будет создавать свои ключи, используя имя кластера как часть иерархии ключей. Таким образом, несколько кластеров Stolon могут совместно использовать одно хранилище.
Рекомендуется использовать хранилище, расположенное в том же регионе/центре обработки данных (понятия связаны с вашей архитектурой/поставщиком облачных услуг), что и кластер Stolon.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )