Was ist JuiceFS?
In einem anderen Post hatte ich bereits von JuiceFS berichtet. Das ist ein Dateisystem, was einen Object Storage mit einer Datenbank verbindet, um so möglichst Posix-Compliant zu sein. Das heißt also, dass die Dateiinhalte in einem S3-Bucket landen, die Metadaten und Verzeichnisstrukturen liegen dann in z.B. einer MariaDB.
Das hatte ich erst für Nextcloud getestet, was auch soweit funktioniert hat. Zu dem Zeitpunkt war mir das ganze aber nicht geheuer, weshalb ich es produktiv dafür nicht einsetzen wollte und auch weiterhin nicht vor habe.
Die Kombination
Im Proxmox-Forum und bei Reddit findet man Beiträge dazu, wie Leute Proxmox Backup Server (PBS) mittels rclone mit einem S3-Speicher verbunden haben, um die Backups eben in S3 zu lagern. Das hat allerdings nur so lange funktioniert, wie leere Verzeichnisse im Cache von rclone waren, da S3 prinzipbedingt nicht mit leeren Verzeichnissen umgehen kann. JuiceFS dürfte diese Lücke füllen, da durch die Trennung von Inhalts- und Metadaten die Unterstützung für alle relevanten Attribute und co wiederhergestellt wird.
Das Setup
Benötigt wird ein Debian-Server mit folgenden installierten Komponenten:
- Proxmox Backup Server (entweder von der ISO installieren oder zusätzlich installieren, siehe hier: https://pbs.proxmox.com/docs/installation.html)
- MariaDB-Datenbank (in meinem Test lokal installierter Server)
- JuiceFS (Installation siehe hier: https://juicefs.com/docs/community/getting-started/installation/)
- Ein S3-Bucket (in meinem Test MinIO, aber es geht natürlich auch alles andere)
JuiceFS-Storage anlegen
Ich habe also die Datenbank und ein S3-Bucket angelegt und dann mit folgendem Command den JuiceFS-Store angelegt:
# diese Variable nutze ich, um die Zugangsdaten und Pfade zur Datenbank nicht jedes Mal neu angeben zu müssen
# Diese Zeile muss pro SSH-Session, in der mit JuiceFS gearbeitet werden soll, neu ausgeführt werden.
export METAURL=mysql://[user]:[passwort]@([datenbankserver]:3306)/[datenbankname]
# bei mir:
# export METAURL=mysql://juicefs:pbspbspbs@(localhost:3306)/juicefs
juicefs format \
--storage s3 \
--bucket [bucket-url] \
--access-key [access-key] \
--secret-key [access-secret] \
$METAURL \
pbsfs --trash-days=0
# bei mir:
#juicefs format \
# --storage s3 \
# --bucket http://s3.homelab.local:9000/pbs \
# --access-key pbs \
# --secret-key pbspbspbs \
# $METAURL \
# pbsfs --trash-days=0
Output:
2024/10/20 10:14:59.175588 juicefs[15366] <INFO>: Meta address: mysql://juicefs:****@(localhost:3306)/juicefs [interface.go:504]
2024/10/20 10:14:59.177822 juicefs[15366] <INFO>: Data use s3://pbs/pbsfs/ [format.go:484]
2024/10/20 10:14:59.372276 juicefs[15366] <INFO>: Volume is formatted as {
"Name": "pbsfs",
"UUID": "97f66daa-c003-4b5b-b1ed-af4788cfbb06",
"Storage": "s3",
"Bucket": "http://s3.homelab.local:9000/pbs",
"AccessKey": "pbs",
"SecretKey": "removed",
"BlockSize": 4096,
"Compression": "none",
"EncryptAlgo": "aes256gcm-rsa",
"KeyEncrypted": true,
"TrashDays": 0,
"MetaVersion": 1,
"MinClientVersion": "1.1.0-A",
"DirStats": true,
"EnableACL": false
} [format.go:521]
Damit wird nun also ein JuiceFS-Store angelegt. Die Daten für das S3-Bucket werden dabei mit im Metadaten-Speicher (also der MariaDB-Datenbank) abgelegt und müssen nicht noch mal eingegeben werden.
JuiceFS mounten
Mittels
mkdir /mnt/jfs
juicefs mount --update-fstab --background $METAURL /mnt/jfs
können wir nun das JuiceFS unter /mnt/jfs
mounten, der Parameter --update-fstab
sorgt dafür, dass direkt auch eine neue Zeile in der fstab
angelgt und das JuiceFS beim Systemstart mit gemountet wird.
Mit
juicefs config $METAURL --capacity 100
lässt sich auch ein Quota festlegen, hier 100GB. Ansonsten hat ein JuiceFS theoretisch unbegrenzte Kapazität bzw. legt kein Limit fest.
Storage in PBS einrichten
In PBS können wir nun einen neuen Datastore hinzufügen und /mnt/jfs
als Pfad angeben. Das Anlegen eines Storages wird allerdings eine ganze Zeit dauern, da hierbei einige Tausend Verzeichnisse erzeugt werden. In meinem Fall hat das etwa 20 Minuten gedauert, lokal ging das immer sehr viel schneller. Danach lässt sich der Storage normal in einem Proxmox VE Server einbinden und nutzen.
Performance
Meine Werte sind leider nur semi-aussagekräftig, da der Minio-Server, der hier als S3-Storage dient, wirklich langsam ist. Ich habe hierbei grob 5 MB/s bei Backups erreicht zeitweise auch 40 MB/s. Ich gehe davon aus, dass mit passend schnellem S3-Storage die reale Leistung eher bei den 40 MB/s liegt, sicher sagen kann ich das aber nicht.
Fazit
Da die Performance soweit okay ist, kann ich mir gut vorstellen, das auf einem vServer im Rechenzentrum mit einem Backblaze B2 Bucket als Storage tatsächlich zu verwenden bzw. dem ganzen so zumindest einem Langzeittest auszusetzen. Ich habe bislang mit JuiceFS auch außerhalb von solchen kurzen Tests wenig Erfahrung. Wenn es gut funktioniert, wäre es aber eine wirklich coole Möglichkeit, um günstig viel Speicher für Proxmox zu bekommen. Ich habe bisher allerdings auch keine Werte bzgl. Trafficnutzung und auch Anzahl der API-Calls, die beim S3-Storage entstehen, das kann schnell zu Kosten führen.
Update
Kleines Update: Ich habe das so temporär auf einem vServer mit Backblaze als Backend in Betrieb und werde in ein paar Tagen (oder so) noch ein Update dazu posten.