Postgresql y ZFS
¿Por qué necesito ZFS en lugar de TOAST incorporado?
Para tghub utilizo un VPS bastante económico con solo 1TB de almacenamiento. Así que necesito comprimir mis datos. A pesar de que Postgresql tiene la característica TOAST (The Oversized-Attribute Storage Technique), no es adecuada para mí. Por defecto, TOAST se activa para datos de texto con un tamaño de 2 kB. La tabla de mensajes de mi proyecto tghub tiene casi 3 mil millones de filas y sigue creciendo, pero suelen ser pequeñas, por lo que TOAST no funcionará para mí. Decidí intentar almacenar los datos de mensajes en un tablespace separado y moverlo al sistema de archivos ZFS.
Esquema de alto nivel
Rendimiento actual
Logré alcanzar un buen equilibrio entre los discos.
- sda -- Tablespace Predeterminado
- sdb -- Tablespace ZFS
- sdc -- Tablespace de Índices
Durante la carga de trabajo normal, el disco de índices es el más ocupado, lo cual es esperado. El disco tiene 2 índices, que se modifican mediante inserciones aleatorias (~800 filas por segundo). Es mejor no sobrecargar el disco con el tablespace predeterminado, porque tiene índices para búsqueda. Cuando muchos usuarios deciden buscar algo al mismo tiempo, este disco debe tener capacidad.
Ajustes de Postgresql y ZFS
Hice algunas configuraciones adicionales para zfs y postgresql:
- Desactivar TOAST, para no comprimir los datos dos veces:
ALTER TABLE channel_message
ALTER COLUMN text SET STORAGE EXTERNAL;
- Seguir la recomendación de zfs para bases de datos y establecer el tamaño del sector a 32K. El tamaño predeterminado es 128K. Es demasiado y provoca lecturas no deseadas. Incluso podemos establecer el tamaño del sector a 8K, pero disminuye la tasa de compresión. Así que es importante encontrar un equilibrio entre la velocidad de lectura (sector más pequeño) y la tasa de compresión (sector más grande).
sudo zfs set recordsize=32K datapool
- Desactivar el tiempo de actualización, realmente no tiene sentido:
sudo zfs set atime=off datapool
- Configurar la compresión a zstd, es más lento que lz4 pero tiene una mejor tasa de compresión (podría ser x2 para datos de texto):
sudo zfs set atime=off datapool
Actualmente, mi tabla channel_message con casi 3 mil millones de filas ocupa 1061GB sin comprimir vs 291GB comprimidos en la unidad ZFS. ¡Es más de una proporción de 3x!