Muchos sistemas tienen un patrón de acumulación constante de datos a lo largo del tiempo. Además, la mayoría de ellos nunca vuelven a cambiar, es decir, están escritos en modo de solo adición .
Estos no son solo varios tipos de registros y métricas de equipos, sino también cosas aparentemente no relacionadas como la correspondencia entre los usuarios o los comentarios sobre las noticias.
Hace aproximadamente un año, ya escribí sobre el modelo para organizar la partición de dichos datos y los cambios en cascada en la estructura de la base de datos causados por esto. Y hoy, usando el ejemplo de nuestro servicio para analizar los registros del servidor PostgreSQL, analizaremos las características de las bases de datos de servicio organizadas de esta manera, y cómo un enfoque competente (y un poco de trabajo nocturno) puede reducir los costos de infraestructura significativamente .
Algo que estamos cargando mucho en el disco ...
Toda la base de nuestro servicio se "corta" en secciones diarias y se reorganiza para obtener el máximo rendimiento. Puede leer más sobre esto en los artículos "Escribir en PostgreSQL en la subluz: 1 host, 1 día, 1TB" y "Ahorrar un centavo en grandes volúmenes en PostgreSQL" .
(. " PostgreSQL"), "" - 100% , , :
" - , - !" ?
, 200MB/s:
... .
- ?.. , ! - !
? , ? 18 maintenance-? VACUUM, ANALYZE, CREATE INDEX ..
PostgreSQL, " PostgreSQL — , ".
" ! - "
-, autoVACUUM/autoANALYZE:
, autovacuum (to prevent wraparound) - - "" , ! , "" , 150GB… .
" , - , ."
, autoANALYZE?..
ANALYZE- append-only ! , PK.
, " " - autoanalyze. :
ALTER SYSTEM SET autovacuum_analyze_scale_factor = 1;
-- , (x2)
ALTER SYSTEM SET autovacuum_analyze_threshold = 100000;
-- ... 100K
"" . , - , .
:
INSERT ... ON CONFLICT UPDATE
- append-only ""
pg_repack
MVCC, "-". .
"" , , cron-, 00:15, " " pg_repack, "" :
pgrepack — Postgres Pro Standard, . CLUSTER
VACUUM FULL
, « », . pgrepack , ,CLUSTER
.
VACUUM FREEZE
(append-only) - VACUUM FREEZE
, "" :
VACUUM FREEZE rawdata_20190419; VACUUM FREEZE rawplan_20190419; ...
!
20 , (disk busy) ~60%: