Patroni: Шаблон для обеспечения высокой доступности PostgreSQL с использованием ZooKeeper, etcd или Consul
Эта страница переведена при помощи нейросети GigaChat.
Запуск 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, эффективно сериализуются, поскольку используется одно соединение с базой данных, поэтому увеличение этого значения обычно не дает никакой пользы.