Перейти к основному содержимому

Patroni: Шаблон для обеспечения высокой доступности PostgreSQL с использованием ZooKeeper, etcd или Consul

примечание

Эта страница переведена при помощи нейросети GigaChat.

warning

Запуск Patroni на системах с ограниченным объемом памяти с использованием Python 3.11+.

Если Patroni запускается в системе со строгими ограничениями памяти, например с vm.overcommit_memory=2 (рекомендуется для PostgreSQL), и используете Python 3.11 или новее, то можете наблюдать неожиданное поведение:

  • Patroni выглядит здоровым;
  • PostgreSQL продолжает работать;
  • API REST Patroni перестает отвечать на запросы;
  • Операционная система сообщает, что Patroni прослушивает порт REST API;
  • Журналы Patroni выглядят нормально, однако один раз могут появиться следующие сообщения: Exception ignored in thread started by: <object repr() failed>, MemoryError;
  • Журналы ядра могут содержать такие сообщения: not enough memory for the allocation.

Такое поведение вызвано ошибкой в Python 3.11+. При строгих условиях использования памяти запуск нового потока может зависнуть на неопределенный срок, если свободной памяти недостаточно.

Рекомендуемое решение

Последние выпуски Patroni (4.1.1+, 4.0.8+) уменьшают влияние этой проблемы, запуская все необходимые потоки на раннем этапе запуска, до того, как система окажется под нехваткой памяти.

Дополнительные рекомендации (Linux, glibc)

При работе с vm.overcommit_memory=2 (рекомендуется для PostgreSQL) также рекомендуется запустить Patroni со следующими настроенными переменными среды:

  • MALLOC_ARENA_MAX=1 — уменьшает объем виртуальной памяти, выделяемой glibc для многопоточных приложений;
  • PG_MALLOC_ARENA_MAX= — сбрасывает значение MALLOC_ARENA_MAX для процессов PostgreSQL, запускаемых Patroni.

Кроме того, можно настроить следующие параметры конфигурации Patroni:

  • thread_stack_size — размер стека, используемый для потоков, запускаемых Patroni. Уменьшение этого значения уменьшает использование памяти процессом Patroni. Значение по умолчанию, установленное Patroni, составляет 512kB. Увеличьте thread_stack_size, если у Patroni происходят сбои, связанные со стеком, в противном случае достаточно значения по умолчанию.
  • thread_pool_size — размер пула потоков, используемый Patroni для асинхронных задач и взаимодействия REST API с другими участниками во время гонки за лидером или отказоустойчивых проверок. Значение по умолчанию — 5, чего достаточно для кластеров из трех узлов.
  • restapi.thread_pool_size — размер пула потоков, используемого для обработки запросов REST API. Значение по умолчанию — 5, что позволяет использовать до пяти параллельных запросов REST API. Обратите внимание, что запросы, включающие запросы SQL, эффективно сериализуются, поскольку используется одно соединение с базой данных, поэтому увеличение этого значения обычно не дает никакой пользы.