Рецепт 7. Вертикальное масштабирование Postgres со storage. Часть 2

Часть 2: горизонтальное партиционирование таблиц в PostgreSQL и связка с tablespaces для разнесения горячих и холодных данных по разным storage-классам.
Опубликовано:

Продолжение части 1. Тема — горизонтальное партиционирование таблиц в связке с tablespaces.

Зачем партиционировать

Когда таблица растёт, её индексы тоже пухнут — обслуживание (VACUUM, REINDEX) становится медленнее и дороже. Партиционирование делит большую таблицу на управляемые куски по понятному критерию.

В PostgreSQL три метода партиционирования:

Самые ходовые комбинации: range по времени и hash по ID. Можно совмещать (range по месяцу + hash sub-partitioning).

Пример: партиционируем fact-таблицу

Возьмём access_log — таблица с записями access-лога Apache. Изначальная схема:

SQL
CREATE TABLE access_log (
    ts TIMESTAMP NOT NULL,
    host VARCHAR(1024) NOT NULL,
    path VARCHAR(4096) NOT NULL,
    username VARCHAR(4096),
    ip INET,
    code INTEGER,
    size BIGINT,
    agent VARCHAR(4096),
    method VARCHAR(128),
    referer VARCHAR(4096)
);
Нажмите, чтобы развернуть и увидеть больше

Превращаем в партиционированную:

SQL
CREATE TABLE access_log (
    ts TIMESTAMP NOT NULL,
    host VARCHAR(1024) NOT NULL,
) PARTITION BY RANGE (ts);
Нажмите, чтобы развернуть и увидеть больше

Месячная партиция:

SQL
CREATE TABLE access_log_2024_04
(LIKE access_log)
PARTITION OF access_log
FOR VALUES
  FROM ('2024-04-01 00:00:00')
  TO ('2024-05-01 00:00:00');
Нажмите, чтобы развернуть и увидеть больше

Выборки за конкретный месяц теперь — быстрые сканы небольшой таблицы вместо рандомных доступов через большой индекс.

Партиционирование + tablespaces

Tablespaces позволяют разнести горячие (свежие) и холодные (исторические) партиции по разным storage-классам — оптимизация cost vs performance:

YAML
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: access-log-v16
spec:
  instances: 3
  storage:
    size: 100Gi
  walStorage:
    size: 200Gi
  tablespaces:
    - name: cold
      storage:
        storageClass: cheaper-storage-class
        size: 100Gi
    - name: hot
      storage:
        storageClass: super-cool-storage-class
        size: 100Gi
Нажмите, чтобы развернуть и увидеть больше

При создании партиции явно указываем tablespace:

SQL
CREATE TABLE access_log_2024_04
(LIKE access_log)
PARTITION OF access_log
FOR VALUES
  FROM ('2024-04-01 00:00:00')
  TO ('2024-05-01 00:00:00')
TABLESPACE hot;
Нажмите, чтобы развернуть и увидеть больше

Старые партиции потом можно перевести в cold — это часть жизненного цикла данных.

Итог

Декларативное партиционирование — относительно молодая фича PostgreSQL (с версии 10, 2017 год), но активно развивающаяся. В связке с tablespaces она существенно расширяет возможности вертикального масштабирования.

Автор завершает статью посвящением Simon Riggs с его знаменитой фразой:

«Most, if not all, database use cases can be met by Postgres (plus Extensions).»

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша