КМБ Postgres OZON: 1. Внутреннее устройство: реализация, отличия от других СУБД

YOUTUBE · 30.11.2025 10:04

Ключевые темы и таймкоды

Введение

0:00
  • Видео представляет собой обзор серверных процессов в PostgreSQL.
  • Рассматриваются различные серверные процессы, такие как постмастер, бэкэнд, пул и другие.

Постмастер

1:08
  • Постмастер является супервизором, который инициализирует общую память и разделяет ее с дочерними процессами.
  • Постмастер также выполняет аутентификацию и создает отдельный процесс для каждого соединения.

Бэкэнд

9:43
  • Бэкэнд является процессом, который обслуживает соединение и создается на каждый коннект.
  • Бэкэнд дорогой из-за необходимости считывать данные с диска и создавать контекты памяти.

Пул

11:32
  • Пул позволяет использовать один коннект для нескольких запросов, что повышает эффективность работы.
  • В PostgreSQL, один коннект может использовать один сипи (однопоточный бэкэнд).

Кластер

12:57
  • Кластер представляет собой совокупность баз данных, внутри которых находятся таблицы, индексы, функции и другие структуры.

Введение

13:23
  • В видео рассказывается о том, как работает PostgreSQL, и о том, что он использует только один движок хранения данных.
  • В PostgreSQL используются общие системные счетчики, такие как обжиг, общая память, общий диск, и они не могут быть ограничены или разделены между базами данных.

Буфер-пул и автовакуум

15:19
  • В PostgreSQL используется буфер-пул, который используется всеми базами данных и может быть ограничен.
  • Автовакуум используется для очистки старых версий данных и ускорения доступа к данным.

Информация о данных и транзакции

17:02
  • В PostgreSQL данные хранятся в виде таблиц, каждая из которых имеет свой заголовок и строки.
  • В каждой строке хранится информация о транзакции, которая создала, удалила или обновила данные.

Настройка автовакуума

25:25
  • Автовакуум может быть настроен на разные уровни агрессивности и на разные таблицы.
  • Настройка автовакуума может быть изменена на уровне кластера или на уровне конкретной базы данных.

Обсуждение статистики и мониторинга

28:16
  • В видео обсуждаются метрики мониторинга, которые нужно смотреть в отделе статистики.
  • Информация о том, какие страницы изменились, берется из процесса стат-коллектора, который агрегирует информацию и сбрасывает ее в системный каталог.

Автовакуум и оптимизация

30:10
  • Автовакуум ускоряет инсерты, апдейты и поиск данных.
  • Процесс автовакуум создает файл, в котором хранится информация о том, какая страница свободна.
  • В случае изменения видимости данных, индекс может быть создан с использованием специального файла, в котором хранится информация о видимости.

Рваная запись и в райта хэт лок

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

Оптимизация работы с данными

43:42
  • В видео рассказывается о том, как можно ускорить работу с данными в PostgreSQL, используя различные оптимизации.
  • Одна из оптимизаций - использование лидера, который сбрасывает свои данные до определенной позиции в вале, а остальные сбрасывают свои данные после него.

Создание контрольных точек

46:31
  • В видео объясняется процесс создания контрольных точек, который позволяет сбросить грязные страницы на диск и ускорить работу с данными.
  • Процесс создания контрольных точек называется "чек-пойнт" и происходит после успешного завершения процесса записи данных.

Работа с памятью

50:03
  • В видео рассказывается о работе с памятью в PostgreSQL, включая буфер-пул, кэш и информацию о блокировках.
  • Обсуждается проблема с дедлоками и их решение в PostgreSQL.

Обсуждение механизмов блокировки в PostgreSQL

56:38
  • В видео обсуждаются различные механизмы блокировки в PostgreSQL, включая блокировку на уровне транзакций, блокировку на уровне строк и блокировку на уровне страниц.
  • Блокировка на уровне транзакций используется для предотвращения одновременного выполнения нескольких транзакций, которые могут привести к конфликтам.
  • Блокировка на уровне строк используется для предотвращения одновременного изменения одной и той же строки несколькими транзакциями.
  • Блокировка на уровне страниц используется для предотвращения одновременного изменения нескольких страниц одной и той же таблицы.

Обсуждение проблем с памятью в PostgreSQL

1:00:45
  • В видео обсуждается проблема с памятью в PostgreSQL, связанная с использованием большого буфер-пула.
  • Если буфер-пул слишком большой, это может привести к проблемам с производительностью, так как процесс, который сбрасывает данные, должен обходить весь буфер-пул.
  • В результате, операции, такие как транкейты и дроб-тейблы, могут стать медленными и неэффективными.
  • Рекомендуется избегать использования операций, которые требуют обхода всего буфер-пула, таких как транкейты и дроб-тейблы.

Обсуждение использования временных таблиц в PostgreSQL

1:07:01
  • Временные таблицы могут быть использованы для избежания проблем с памятью, так как они не требуют обхода всего буфер-пула.
  • Однако, временные таблицы также имеют свои проблемы, такие как необходимость их удаления после использования.
  • Рекомендуется использовать временные таблицы только для краткосрочных операций, чтобы избежать проблем с памятью и производительностью.

Временные таблицы

1:08:42
  • Временные таблицы в PostgreSQL - это аналог материализованных представлений в других СУБД.
  • Материальные и синтаксические временные таблицы имеют разные названия и функции.

Автовакуум и осиротевшие таблицы

1:14:04
  • Автовакуум в PostgreSQL удаляет осиротевшие таблицы, если процесс завершился некорректно.
  • В десятой версии PostgreSQL автовакуум стал более эффективным и не оставляет осиротевших таблиц.

Расчет ресурсов для PostgreSQL

1:18:27
  • Для расчета ресурсов для PostgreSQL можно использовать приблизительные значения: половину подшаренной памяти до терабайта, четверть для кэша операционной системы и остаток разделить на максимальное количество подключений.
  • Важно учитывать, что настройки для планера и бэк-энда могут отличаться, поэтому лучше использовать разные планы для разных процессов.

Обсуждение проблем с PostgreSQL

1:20:56
  • В видео обсуждается проблема с количеством максимальных коннектов в PostgreSQL, которая возникает из-за экспоненциального роста времени ожидания в локах при увеличении количества коннектов.
  • Также обсуждается вопрос о том, как разделить память между двумя кластерами на одной железке, и как это влияет на файловый кэш.

Фейловер кластеринг в PostgreSQL

1:27:32
  • В видео объясняется, что в PostgreSQL нет встроенного механизма для фейловер кластеринга, но существуют некоторые инструменты, такие как триггер файлы и другие, которые могут помочь в решении этой задачи.
  • Обсуждается, как изменение некоторых параметров в PostgreSQL может повлиять на данные и как это может привести к необходимости перекомпиляции бинаря.

Обсуждение индекса и фрагментации

1:27:56
  • В видео обсуждается индексация и фрагментация в PostgreSQL.
  • Рассказывается о том, как PostgreSQL обрабатывает изменения в индексах и как это влияет на производительность.

Примеры использования индекса и фрагментации

1:30:46
  • Приводится пример использования индекса для оптимизации работы с транзакциями.
  • Обсуждается проблема фрагментации индексов и то, как PostgreSQL справляется с ней.

Выбор размера для буфер-пула

1:34:31
  • Рассказывается о том, как выбрать размер для буфер-пула, основываясь на статистике и знании работы с индексами.

Перестройка индексов при изменении данных

1:35:41
  • Объясняется, как PostgreSQL перестраивает индексы при изменении данных, и как это влияет на производительность.
  • Обсуждается, как избежать перестройки индексов, если это возможно.

Обсуждение индексов

1:38:39
  • В видео обсуждается фрагментация индексов и необходимость их регулярной перестройки.
  • Упоминается функция pg_stat_index, которая позволяет получить информацию о фрагментации индекса и количестве живых данных в нем.

Создание и использование индексов

1:40:32
  • В видео рассказывается о создании и использовании индексов в PostgreSQL.
  • Упоминается, что вакуум не умеет транкировать индексы, и после удаления данных из таблицы индекс остается в том же размере.

Блокировка при создании и использовании индексов

1:44:19
  • В видео объясняется, что создание и использование индексов может быть блокирующей операцией.
  • Упоминается, что создание и использование конкарентированных индексов также может быть блокирующей операцией.

Использование индексов в запросах

1:47:29
  • В видео обсуждается использование индексов в запросах и то, что только канкарный индекс может быть использован на бэ три.
  • Упоминается, что если часть запроса покрывается индексом, а остальные колонки из индекса не попадают в индекс, то это может привести к снижению производительности.