172 похожих чатов

Коллеги добрый вечер. Подскажите решение проблемы. На мастере по крону

раз в 4 часа запускается задача на insert/update большого количества строк длительностью 1.5 часа. Поток wal порядка 2 ГБ в минуту. Почти сразу реплика отстаёт (слота репликации нет) и начинается восстановление из архива. К сожалению за 2.5 часа до следующего крона она не успевает догнать мастер. В результате запускается следующий крон и очередь растет ещё больше пока wal не удалятся из архива и окончательно теряем реплику. Хотелось бы узнать проигрывание wal через протокол потоковой репликации идёт быстрее или так же как из архива (всё идет в один поток но возможно что в первом случае быстрее)? Какие есть варианты решения?

11 ответов

20 просмотров

> Почти сразу реплика отстаёт (слота репликации нет) А почему бы не добавить (перейти на streaming по умолчанию)? > Поток wal порядка 2 ГБ в минуту. А покажите связанные с WAL настройки на primary. И главное — какая это версия PostgreSQL (SELECT version();)? > Какие есть варианты решения? Сначала нужно больше информации, см. выше.

Aleksey-Lex-sey Автор вопроса
Yaroslav Schekin
> Почти сразу реплика отстаёт (слота репликации не...

1. Что бы не уронить мастер. Для этого сделали архив wal 2. версия PostgreSQL 14.8 (Debian 14.8-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit (1 row) max_wal_size = 4GB min_wal_size = 1GB wal_level = logical max_wal_senders = 3 wal_buffers = 16MB archive_mode = on archive_timeout = 60 archive_command = 'pgbackrest --stanza=cards --process-max=8 archive-push %p' Настройки pgbackrtest process-max=8 archive-async=y spool-path=/data/postgresql/14/main/pg_wal/spool compress-type=gz compress-level=3

> Что бы не уронить мастер. Для этого сделали архив wal А варианта сделать там больше места нет? Ну и таки сделать слот и подстраховаться max_slot_wal_keep_size. Далее, почему max_wal_size = 4GB, почему бы не увеличить? Да и wal_buffers тоже можно. А почему wal_level = logical — есть и логическая репликация? wal_compression выключен? Если да, то почему? ;) > и начинается восстановление из архива Да, а архив-то где находится? Если не на реплике — нет ли там "тормозов" с получением оттуда файлов?

Aleksey Lex-sey
1. Что бы не уронить мастер. Для этого сделали арх...

И вот ещё что — если медленно работает именно восстановление (т.е. со скоростью доступа к файлам и т.п. проблем нет) — посмотрите вот на это: https://www.postgresql.org/docs/15/runtime-config-wal.html#RUNTIME-CONFIG-WAL-RECOVERY Этого всего нет в используемой Вами версии, но была сторонняя утилита для предыдущих, которая делает примерно то же самое (т.е. если именно в этом там проблема, то утилиту можно найти / посмотреть / применить).

Aleksey-Lex-sey Автор вопроса
Konstantin Zaitsev
Хм а зачем logical?

что бы не перезапускать мастер если понадобится логическая репликация. Но идея понятна - уменьшить объем wal включение сжатия туда же

Aleksey-Lex-sey Автор вопроса
Yaroslav Schekin
> Что бы не уронить мастер. Для этого сделали архи...

можно и max_slot_wal_keep_size выставить для слота и max_wal_size увеличить но это имеет смысл только если потоковая репликация работает быстрее чем восстановление из архива. Сжатие включу, wal_level выставлю в replica. Архив находится на другом хосте. При архивировании действительно были проблемы - авторизация по ssh медленнее чем процесс архивирования. Для pgbackrest это решается настройкой archive-async=y (он архивирует и передаёт пачками а не каждый файл отдельно) эта настройка так же актуальна и для восстановления. Закидывает пачку и по одному проигрывает. Кстати при работе крона очередь на архивацию вырастает до 100 ГБ.

Алексей, вам нужно сначала разобраться с причинами. Отвечая на ваш вопрос, потоковая репликация работает по тому же принципу что и восстановление из архива, в том смысле что тоже в один поток, НО. Потоковая репликация передает данные от сервера бд к серверу бд, и влияет на её скорость сеть между серверами бд. "восстановление из архива" же состоит из двух шагов: archive_command на мастере отправляет wal'ы в промежуточное хранилище, а restore_command на слейве забирает их из промежуточного хранилища. То есть на "восстановление из архива" будет влиять сеть от мастера к хранилищу, и от хранилища к слейву. И в случае с дебагом восстановления из архива - нужно проверять оба этапа, и скорость отправления валов в хранилище, и восстановление из него. Если у вас "хранилище" это какое-нибудь облако, к которому хороший канал (более быстрый чем сеть между серверами, хотя было бы странновато) - то восстановление из архива будет работать быстрее потоковой репликации. 2GB в минуту это так-то не очень много, 270 мегабит/с всего. У вас сеть между серверами 100мегабитная что ли, если отставание сразу происходит?

Aleksey Lex-sey
можно и max_slot_wal_keep_size выставить для слот...

> но это имеет смысл только если потоковая репликация работает быстрее чем восстановление из архива Не так просто — если (как там это происходит, видимо) большую часть времени она работает быстрее, чем генерируются WAL на primary, но иногда бывает наоборот, то её перспектива догнать primary зависит как раз от запаса места для WAL на нём. Ну и max_wal_size влияет на частоту checkpoints, которые, в свою очередь, влияют на объём WAL (за счёт необходимости писать full-page images при первом изменении страницы после них). Т.е. в том, чтобы дать больше места, есть и такая потенциальная выгода. > Архив находится на другом хосте. Хмм.. так в чём же проблема на реплике тогда, всё же (я как-то не понял, извините)? Т.е. она не успевает получать файлы, или не успевает проигрывать, или что-то третье, неизвестное?

Aleksey-Lex-sey Автор вопроса
Ilya Serbin
Алексей, вам нужно сначала разобраться с причинами...

Илья спасибо, посмотрю в сторону сети. Когда начал разбираться с проблемой действительно обнаружилось что реплика не в той сети и скорость ограничена 100 Мб. Эту проблему решили реплика сейчас наливается быстрее (обещали 10 ГБ/с но я пока видел в районе 5-7 Гб/с). Теперь проверю канал между архивом и репликой и то что писали выше.

Aleksey Lex-sey
Илья спасибо, посмотрю в сторону сети. Когда начал...

Эх, я только дописать хотел, что можно поменять кучу настроек, а в итоге окажется что на сервере 2 интерфейса, один на 10Гбит, а другой на 100 мегабит, и данные гоняются как раз не по тому, по которому должны)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта