Debezium приводит к тому, что у Postgres заканчивается место на диске в RDS

У меня есть небольшая база данных разработки Postgres, работающая на Amazon RDS, и я использую K8s. Насколько я могу судить, трафика практически нет. Я хочу включить захват изменений, я включил rds.logical_replication, запустил экземпляр Debezium, и темы появляются в Kafka, и все выглядит нормально.

Через несколько часов свободное место на диске начинает уменьшаться:

Он начал потреблять диск с постоянной скоростью и съел все доступные 20 Гб в течение 24 часов. Остановка Debezium ничего не делает. Способ, которым я вернул свое дисковое пространство, был следующим:

select pg_drop_replication_slot('services_debezium')

и:

vacuum full

Затем, через несколько минут, как видно на графике, место на диске восстанавливается.

Какие-нибудь советы? Я хотел бы увидеть, что на самом деле заполняет пространство, но я не думаю, что смогу. На стороне Debezium вроде ничего не происходит (никаких зловещих журналов), да и журналы Postgres не показывают ничего особенного. Или есть какое-то внешнее событие, которое вызывает это начало?

Вы наконец нашли причину/обходной путь?

Kokizzu 13.10.2021 03:32

Насколько я понял, на экземпляре есть «невидимая» база данных AWS, которая делает что-то, разделяет WAL и имеет довольно много активности. Поэтому, если захват изменений не выполняется из-за отсутствия активности в вашей базе данных или по какой-либо другой причине, он довольно быстро займет место на диске. Настройка сердцебиения «heartbeat.interval.ms» помогает, когда ваша база данных очень малоактивна.

Frank Lee 17.10.2021 18:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
2 138
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема в слоте репликации. Он помечает позицию в WAL, и PostgreSQL не будет удалять более новые сегменты WAL. Эти файлы находятся в подкаталоге pg_wal каталога данных.

Удаление слота репликации и запуск CHECKPOINT удалит файлы и свободное место. Возможно, вам также придется VACUUM (FULL) столы, которые раздулись, а VACUUM не могли добиться никакого прогресса.

Причиной проблемы должна быть неправильная конфигурация Debrezium: он не использует изменения и не перемещает слот репликации вперед. Решите эту проблему, и вы хорошо.

Да, но нет. Странно то, что Debezium работает нормально: изменения используются, задержка низкая, ошибок нет с обеих сторон. Я бы хотел увидеть, что на самом деле находится в файловой системе, но, ЧТО-ТО, Amazon этого не позволяет. А прямолинейность линии, кажется, указывает на то, что она не связана с движением. Единственная "подозрительная" вещь, которую я вижу в логах: "Параметру max_wal_senders было присвоено значение, несовместимое с репликацией. Оно было скорректировано с 10 до 15".

Frank Lee 22.12.2020 17:11

Вы не обязаны мне верить :^)

Laurenz Albe 22.12.2020 17:18

Хорошо, я думаю, что понял это. В Amazon RDS есть еще одна «скрытая» база данных, в которой есть изменения, но изменения, которые я не вносил и которые я вижу, поэтому Debezium также не может их подобрать. Если изменить мою отслеживаемую базу данных, она покажет это изменение и в процессе сбросит буфер и освободит это пространство. Так что само отсутствие изменений было причиной его заполнения. Не знаю, есть ли для этого красивое решение, но, по крайней мере, я могу с этим работать.

Ответ принят как подходящий

Вам необходимо периодически генерировать некоторые движения в вашей базе данных (например, выполнять обновление любой записи).

Debezium предоставляет функцию под названием Heartbeat для выполнения операций такого типа.

Сердцебиение можно настроить в коннекторе следующим образом:

"сердцебиение.интервал.мс": "300000", "heartbeat.action.query": "обновить my_table SET date_column = now();"

Вы можете найти больше информации в официальной документации:

https://debezium.io/documentation/reference/connectors/postgresql.html#postgresql-wal-disk-space

Обратите внимание, что достаточно просто иметь интервал сердцебиения. Запрос действия пульса используется только в том случае, «когда захват изменений из базы данных с низким трафиком на том же хосте, что и база данных с высоким трафиком, не позволяет Debezium обрабатывать записи WAL». Из документации: debezium.io/documentation/reference/connectors/…

maxTrialfire 09.02.2023 17:51

Другие вопросы по теме