postgrespro / pg_probackup

Backup and recovery manager for PostgreSQL
https://postgrespro.github.io/pg_probackup/
Other
712 stars 86 forks source link

Connection timed out в случае длительного бэкапа #608

Closed Cat-in-frill closed 1 year ago

Cat-in-frill commented 1 year ago

Доброго дня!

Я решал задачу оптимизации расходов на инфраструктуру в публичном облаке и столкнулся с не гуглящейся проблемой.

У нас есть сервер PostgreSQL 11 с объёмом данных ~380 Гб, с которого периодически снимается бэкап при помощи pg_probackup. Если бэкап в режиме FULL занимает в пределах 40 минут, всё проходит отлично. Если он занимает более приблизительно 70 минут, после окончания передачи всех файлов я получаю сообщение об ошибке следующего вида:

INFO: Start transferring data files INFO: Data files are transferred, time elapsed: 1h:14m ERROR: query failed: could not receive data from server: Connection timed out query was: SET client_min_messages = warning; WARNING: A backup is in progress, stopping it. ERROR: query failed: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. query was: SET datestyle = 'ISO, DMY'; WARNING: query failed: no connection to the server query was: SELECT pg_catalog.txid_snapshot_xmax(pg_catalog.txid_current_snapshot()), current_timestamp(0)::timestamptz, lsn, labelfile, spcmapfile FROM pg_catalog.pg_stop_backup(false, false) ERROR: Failed to send pg_stop_backup query WARNING: Backup RZHAWS is running, setting its status to ERROR

На время бэкапа в моём случае влияет скорость диска бэкап-сервера (более медленные диски стоят дешевле) и компрессия данных на уровне файловой системы (я знаю, что pg_probackup умеет сжимать данные и сам, это была оценка, не будет ли компрессия данных на уровне ФС производительнее). Конечно, мне ничто не мешает просто учитывать этот факт и использовать более быстрые диски, не использовать компрессию на уровне ФС и так далее. Но не баг ли это? По идее, успешность бэкапа не должна определяться скоростью бэкап-сервера - в разумных пределах, конечно, но ~92 мб/c кажутся вполне реалистичной производительностью.

В логах ОС ничего предосудительного не вижу. Sshd не настроен на какие-либо тайм-ауты, простаивающая сессия живёт вечно. Игры с ClientAliveInterval и ClientAliveCountMax на ситуацию не влияют.

Версии pg_probackup, на которых воспроизводится: pg_probackup-11 2.5.8, pg_probackup-11 2.5.12 ОС: Oracle Linux 8, UEKR7, полностью пропатченные PostgreSQL: 11.17, ванильный.

Подскажите, пожалуйста, может, это всё-таки я что-то делаю не так?

Cat-in-frill commented 1 year ago

Напишу на случай, если кто-то ещё в это вляпался. Решено занижением tcp_keepalive_time и завышением tcp_keepalive_probes так, чтобы tcp_keepalive_time был заведомо меньше времени бэкапа, а произведение tcp_keepalive_probes на tcp_keepalive_intvl было заведомо больше времени бэкапа. Возможно, что-то из этого было избыточным, но это сработало.

Дискуссия была интересной и плодотворной, всем спасибо.