Postgresql und ZFS
Warum brauche ich ZFS statt dem eingebauten TOAST?
Für tghub nutze ich einen ziemlich günstigen VPS mit nur 1TB Speicherplatz. Daher muss ich meine Daten komprimieren. Trotz der Tatsache, dass Postgresql die TOAST-Funktion (Technik für übergroße Attributspeicherung) hat, ist sie für mich nicht geeignet. Standardmäßig wird das TOAST-Feature bei Textdaten ab 2 kB aktiviert. Die Nachrichtentabelle meines Projekts tghub hat fast 3 Milliarden Zeilen und wächst weiter, jedoch sind diese Daten in der Regel klein, sodass TOAST für mich nicht funktioniert. Ich habe mich entschieden, die Nachrichtendaten in einem separaten Tablespace zu speichern und auf das ZFS-Dateisystem zu verschieben.
Hochlevel-Schema
Aktuelle Leistung
Ich habe es geschafft, ein gutes Gleichgewicht zwischen den Laufwerken zu erreichen.
- sda -- Standard-Tablespace
- sdb -- ZFS-Tablespace
- sdc -- Index-Tablespace
Während der normalen Arbeitsbelastung ist die Index-Festplatte am meisten ausgelastet, was zu erwarten ist. Die Festplatte hat 2 Indizes, die durch zufällige Einfügungen (~800 Zeilen pro Sekunde) geändert werden. Es ist besser, die Festplatte mit dem Standard-Tablespace nicht zu überlasten, da sie Indizes für die Suche enthält. Wenn viele Benutzer gleichzeitig nach etwas suchen, sollte diese Festplatte Kapazität haben.
Tuning von Postgresql und ZFS
Ich habe einige zusätzliche Konfigurationen für zfs und postgresql vorgenommen:
- TOAST ausschalten, um Daten nicht doppelt zu komprimieren:
ALTER TABLE channel_message
ALTER COLUMN text SET STORAGE EXTERNAL;
- Folgen Sie den zfs-Empfehlungen für Datenbanken und setzen Sie die Sektorgröße auf 32K. Die Standardgröße ist 128K. Das ist zu viel und führt zu unerwünschten Lesevorgängen. Wir können die Sektorgröße sogar auf 8K setzen, aber das verringert das Kompressionsverhältnis. Deshalb ist es wichtig, ein Gleichgewicht zwischen Lesegeschwindigkeit (kleinerer Sektor) und Kompressionsverhältnis (größerer Sektor) zu finden.
sudo zfs set recordsize=32K datapool
- Zeitstempel der Aktualisierung ausschalten, es macht wirklich keinen Sinn:
sudo zfs set atime=off datapool
- Kompression auf zstd setzen, es ist langsamer als lz4, hat aber ein besseres Kompressionsverhältnis (kann bei Textdaten 2x besser sein):
sudo zfs set atime=off datapool
Derzeit belegt meine channel_message-Tabelle mit fast 3 Milliarden Zeilen 1061GB unkomprimiert gegenüber 291GB komprimiert im ZFS-Laufwerk. Das ist mehr als das 3-fache Verhältnis!