Оригинал: CloudNativePG Recipe 7: Postgres Vertical Scaling with Storage in Kubernetes — part 2 — 16 апреля 2024.
Продолжение части 1. Тема — горизонтальное партиционирование таблиц в связке с tablespaces.
Зачем партиционировать
Когда таблица растёт, её индексы тоже пухнут — обслуживание (VACUUM, REINDEX) становится медленнее и дороже. Партиционирование делит большую таблицу на управляемые куски по понятному критерию.
В PostgreSQL три метода партиционирования:
- Range — по диапазону, обычно по времени (например, помесячно).
- Hash — по хешу столбца (user ID, store ID).
- List — по дискретным известным значениям.
Самые ходовые комбинации: range по времени и hash по ID. Можно совмещать (range по месяцу + hash sub-partitioning).
Пример: партиционируем fact-таблицу
Возьмём access_log — таблица с записями access-лога Apache. Изначальная схема:
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)
);Превращаем в партиционированную:
CREATE TABLE access_log (
ts TIMESTAMP NOT NULL,
host VARCHAR(1024) NOT NULL,
) PARTITION BY RANGE (ts);Месячная партиция:
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:
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:
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).»