Postgresql et ZFS
Pourquoi ai-je besoin de ZFS au lieu de TOAST intégré ?
Pour tghub, j’utilise un VPS assez bon marché avec seulement 1 To de stockage. Donc, j'ai besoin de compresser mes données. Bien que Postgresql possède la fonctionnalité TOAST (The Oversized-Attribute Storage Technique), cela ne me convient pas. Par défaut, TOAST s'active pour les données texte de taille 2 kB. La table des messages de mon projet tghub contient presque 3 milliards de lignes et continue de croître, mais elles sont généralement petites, donc TOAST ne fonctionnera pas pour moi. J'ai décidé d'essayer de stocker les données des messages dans un espace de table séparé et de les déplacer vers le système de fichiers ZFS.
Schéma de haut niveau
Performance actuelle
J'ai réussi à obtenir un bon équilibre entre les disques.
- sda -- Espace par défaut
- sdb -- Espace ZFS
- sdc -- Espace d'index
Lors d'une charge de travail normale, le disque d'index est le plus sollicité, ce qui est attendu. Le disque a 2 index qui sont modifiés par des insertions aléatoires (~800 lignes par seconde). Il vaut mieux ne pas surcharger le disque avec l'espace par défaut, car il a des index pour la recherche. Quand beaucoup d'utilisateurs décident de chercher quelque chose en même temps, ce disque devrait avoir la capacité.
Configuration de Postgresql et ZFS
J'ai fait quelques configurations supplémentaires pour zfs et postgresql :
- Désactiver TOAST, pour ne pas compresser les données deux fois :
ALTER TABLE channel_message
ALTER COLUMN text SET STORAGE EXTERNAL;
- Suivre les recommandations de zfs pour les bases de données et définir la taille des secteurs à 32 Ko. La taille par défaut est 128 Ko. C'est trop et entraîne des lectures non souhaitées. Nous pouvons même définir la taille des secteurs à 8 Ko, mais cela diminue le taux de compression. Il est donc important de trouver un équilibre entre la vitesse de lecture (secteur plus petit) et le taux de compression (secteur plus grand).
sudo zfs set recordsize=32K datapool
- Désactiver le temps de mise à jour, cela n’a vraiment pas de sens :
sudo zfs set atime=off datapool
- Définir la compression sur zstd, c'est plus lent que lz4 mais a un meilleur taux de compression (cela pourrait être x2 pour les données texte) :
sudo zfs set compress=zstd datapool
Actuellement, ma table channel_message avec presque 3 milliards de lignes occupe 1061 Go non compressés contre 291 Go compressés dans le disque ZFS. C’est un rapport de plus de 3x !