Вопрос или проблема
У меня есть два узла postgresql, pg-0 и pg-1, мастер и реплика.
Они работают на разных машинах с пропускной способностью 25 Гбит/с, 8 ГБ ОЗУ и процессором AMD Epyc.
Внутри у меня 6 баз данных общим объемом 1,5 ГБ, то есть ничего огромного.
Это docker-compose.yaml для pg-1, pg-0 идентичен, за исключением переменных окружения REPMGR_NODE_NETWORK_NAME и REPMGR_NODE_NAME.
services:
pg-1:
image: bitnami/postgresql-repmgr:latest
container_name: pg-1
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
- '/home/crminformatica/backup/:/bitnami/backup/'
environment:
- POSTGRESQL_PASSWORD=postgres
- REPMGR_PASSWORD=repmgr
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_NODE_NETWORK_NAME=pg-1
- REPMGR_NODE_NAME=pg-1
- REPMGR_PARTNER_NODES=pg-0,pg-1
ports:
- 5432:5432
volumes:
db-data:
При запуске узла реплики repmgr, насколько я понял, выполняет pg_basebackup, но для завершения требуется 1 час, что безумие, учитывая объем имеющихся данных.
Я пытался записывать процент завершения с помощью этого repmgr.conf, но, похоже, это ничего не делает.
restore_command_options="--progress --compress=9"
log_level = DEBUG
log_file="/var/log/repmgr/repmgr.log"
У меня была такая же проблема с pg_basebackup (без repmgr), и я пробовал сжатие и увеличение числа соединений реплики, но это не изменилось.
Что я могу сделать?
Ответ или решение
Инициализация реплики PostgreSQL с использованием repmgr может быть сложной задачей, особенно если процесс занимает больше времени, чем ожидается. В данном случае, вы описали ситуацию, где репликация базы данных объемом 1,5 Гб занимает около часа, что действительно кажется чрезмерным. Рассмотрим возможные причины этой проблемы и предложим решения, используя подход FOREST (F-First Feelings, O-Obstacles, R-Reassurances, E-Explanations, S-Suggestions, T-Testimonials/Support):
Первоначальные чувства (First Feelings): Ваше беспокойство о медленной репликации оправдано, особенно учитывая, что это может повлиять на производительность и доступность вашего приложения.
Препятствия (Obstacles): Разберем потенциальные причины такой задержки:
-
Сетевые ограничения: Несмотря на заявленный пропускной канал в 25 Гбит/с, возможны узкие места в сети между вашими узлами, влияющие на производительность. Это может быть вызвано ограничениями оборудования или соседними службами, перегружающими сеть.
-
Производительность дисковой подсистемы: Медленная работа диска на любом из узлов может вызвать задержки при чтении и записи. Проведите тесты скорости ввода-вывода на обоих серверах.
-
Конфигурация сети и Docker: Возможно, Docker накладывает свои ограничения на производительность сети или обращение к файлам. Проверьте настройки Docker для оптимизации работы в вашей инфраструктуре.
-
Параметры репликации и компрессии: Неправильные параметры команд для репликации могут также увеличить время копирования. Параметры вроде
--compress=9
иногда ухудшают производительность из-за больших вычислительных нагрузок.
Уверенность (Reassurances): Эти проблемы являются распространенными, и есть ряд решений, которые могут помочь оптимизировать процесс.
Объяснения (Explanations): Вы уже изменили ряд конфигураций без заметного результата. Однако, логирование прогресса pg_basebackup
не работает из-за того, что параметры могут быть неверно интерпретированы или не поддерживаться в указанной конфигурации.
Предложения (Suggestions):
-
Тестирование сети: Проверьте задержки и скорость сети инструментами вроде
iperf3
, чтобы выявить узкие места. -
Оптимизация диска: Используйте инструменты как
iostat
илиdd
для проверки производительности дисковой подсистемы. Убедитесь, что уровень нагрузки допустим для выполнения бэкапов. -
Упрощение параметров: Попробуйте убрать или снизить степень компрессии, например до
--compress=1
, и проверьте изменения во времени. -
Прямая проверка pg_basebackup: Выполните ручной
pg_basebackup
вне Docker-контейнера для отладки и получения более детального логирования. -
Конфигурация Docker: Проверьте настройки сети Docker, такие как
host
илиbridge
network, и убедитесь в отсутствии ограничений. -
Журналирование и мониторинг: Настройте системное логирование (например,
syslog
), чтобы лучше отслеживать ресурсные потребности и поведение системы в процессе репликации.
Поддержка (Testimonials/Support): Если проблема не решится собственными усилиями, возможно, стоит обратиться к сообществу экспертов PostgreSQL или рассмотреть консультации с профессиональными поставщиками услуг по настройке баз данных.
Надеюсь, эти рекомендации помогут вам улучшить производительность репликации вашей базы данных.