Как правильно запустить PostgreSQL с постоянной вставкой и удалением в день - PullRequest
0 голосов
/ 22 февраля 2020

Извините за плохой заголовок. Я не могу придумать лучшего.

Вопрос:

Множество строк вставляются каждую секунду. Пакетное удаление выполняется, когда диск почти заполнен. Это вызывает две проблемы:

  1. Невозможно реально проверить, сколько места в том, сколько страниц можно использовать повторно. Все, что я вижу, это то, что диск почти заполнен, потому что база данных не возвращает дисковое пространство ОС после удаления.

  2. Фрагментация происходит. Использование диска медленно растет и в конечном итоге становится полным, что приводит к сбою машины.

Решения, которые я рассмотрел:

  1. Отслеживание использования диска и выполнение VACCUM FULL, когда диск заполнен на 48%. Но резервирование 52% (да, диск в основном занят базой данных) диска только для удаления записей звучит очень расточительно.

  2. Разделение моих таблиц по часу времени создания записи. Удалите только старые разделы и надейтесь, что удаленные разделы освобождают полные страницы, поэтому autovacuum вернет дисковое пространство этих полностью пустых страниц.

  3. Используйте базу данных, хранящуюся в файле, например SQLite. Разделяйте данные на файлы по часам. Загружайте только самые последние 24 часа, если не указано иное. Когда мне нужно удалить, просто удалите файлы. Я не пробовал это, но это звучит слишком много накладных, чтобы прикрепить все 24 базы данных каждый час.

Я действительно ценю любое предложение. Ниже приведены дополнительные детали. Большое спасибо!


Контекст:

В настоящее время я использую PostgreSQL для размещения потоковых сообщений в социальных сетях. Существует стример, который выполняет пакетную вставку, и промежуточное программное обеспечение, которое выполняет чисто читаемые запросы для клиентских запросов. Все приложение доставляется с использованием Docker image.

Когда стример вставляет записи, однажды диск будет заполнен. Поэтому нам нужно удалить записи. Но удаление записей не освобождает место на диске и может привести к фрагментации. Таким образом, в конечном итоге VACCUM FULL необходимо, чтобы снова сжать таблицы.

Требование:

  1. Пользователи, которые развертывают это приложение, не являются техническими. Они даже не знают, что такое оболочка / терминал.

  2. Пользователи не будут выполнять обслуживание базы данных. Так что VACUUM FULL это опция, только когда на диске достаточно места для новых таблиц.

...