Déploiement d'un cluster SeaweedFS sur NixOS :
Ce guide explique comment déployer un cluster SeaweedFS sur 3 nodes NixOS.
Prérequis :
- 3 machines sous NixOS
- Réseau configuré entre les machines
- Le module SeaweedFS installé sur chaque machine
Architecture du cluster :
Node 1 (192.168.0.185):
- Master
- Volume
- Filer
Node 2 (192.168.0.186):
- Master
- Volume
- Filer
Node 3 (192.168.0.187):
- Master
- Volume
- Filer
Configuration :
Configuration du Node 1 (192.168.0.185)
sudo nano /etc/nixos/configuration.nix
services.seaweedfs = {
# Configuration master
master = {
enable = true;
ip = "192.168.0.185";
ipBind = "0.0.0.0";
port = 9333;
peers = [
"192.168.0.185:9333"
"192.168.0.186:9333"
"192.168.0.187:9333"
];
};
# Configuration volume
volume = {
enable = true;
ip = "192.168.0.185";
ipBind = "0.0.0.0";
port = 8080;
master = [
"192.168.0.185:9333"
"192.168.0.186:9333"
"192.168.0.187:9333"
];
# Options optionnelles recommandées
index = "leveldb"; # Plus stable que "memory" pour la production
readMode = "proxy";
minFreeSpace = "10"; # 10% d'espace libre minimum
};
# Configuration filer
filer = {
enable = true;
ip = "192.168.0.185";
ipBind = "0.0.0.0";
port = 8888;
master = [
"192.168.0.185:9333"
"192.168.0.186:9333"
"192.168.0.187:9333"
];
};
};
# Ouverture des ports dans le pare-feu
networking.firewall.allowedTCPPorts = [
9333 19333 # Master HTTP et gRPC
8080 18080 # Volume HTTP et gRPC
8888 18888 # Filer HTTP et gRPC
];
Configuration du Node 2 (192.168.0.186)
# Même configuration que Node 1 mais avec l'IP 192.168.0.186
services.seaweedfs = {
master.ip = "192.168.0.186";
volume.ip = "192.168.0.186";
filer.ip = "192.168.0.186";
# Reste de la configuration identique
};
Configuration du Node 3 (192.168.0.187)
# Même configuration que Node 1 mais avec l'IP 192.168.0.187
services.seaweedfs = {
master.ip = "192.168.0.187";
volume.ip = "192.168.0.187";
filer.ip = "192.168.0.187";
# Reste de la configuration identique
};
Déploiement :
Sur chaque nœud, appliquez la configuration :
sudo nixos-rebuild switch
Vérifiez que les services sont démarrés :
systemctl status seaweedfs-master
systemctl status seaweedfs-volume
systemctl status seaweedfs-filer
Vérifiez les logs :
journalctl -fu seaweedfs-master
journalctl -fu seaweedfs-volume
journalctl -fu seaweedfs-filer
Vérification du cluster :
Vérifiez le statut du cluster master :
curl http://192.168.0.185:9333/cluster/status
Vérifiez l'état des volumes :
curl http://192.168.0.185:8080/status
curl http://192.168.0.186:8080/status
curl http://192.168.0.187:8080/status
Testez les filers :
curl http://192.168.0.185:8888
curl http://192.168.0.186:8888
curl http://192.168.0.187:8888
Montage du système de fichiers : (Optionnel)
Pour monter SeaweedFS sur un client :
# Mount Seaweedfs
systemd.services.mount-seaweedfs = {
description = "Mount SeaweedFS";
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
serviceConfig = {
Type = "simple";
ExecStartPre = ''
${pkgs.coreutils}/bin/mkdir -p /mnt/seaweedfs
${pkgs.coreutils}/bin/mkdir -p /var/cache/weedfs-cache
'';
ExecStart = ''
${pkgs.seaweedfs}/bin/weed mount \
-filer=192.168.0.185:8888,192.168.0.186:8888,192.168.0.187:8888 \
-dir=/mnt/seaweedfs \
-allowOthers \
-cacheDir=/var/cache/weedfs-cache \
-cacheCapacityMB=1000
'';
ExecStop = "${pkgs.fuse}/bin/fusermount -u /mnt/seaweedfs";
Restart = "always";
RestartSec = "10s";
User = "root";
};
};
Utilisation : (Optionnel)
Une fois monté, le système de fichiers est accessible comme un système de fichiers normal :
# Test d'écriture
echo "test" > /mnt/seaweedfs/test.txt
**Test de lecture** : (Optionnel)
cat /mnt/seaweedfs/test.txt
**Création de dossier** :
mkdir -p /mnt/seaweedfs/test-dir
Surveillance : (Optionnel)
Pour surveiller le cluster, vous pouvez :
Utiliser l'interface web du filer :
Surveiller les métriques :
Dépannage : (Optionnel)
Problèmes de démarrage :
journalctl -xeu seaweedfs-master
journalctl -xeu seaweedfs-volume
journalctl -xeu seaweedfs-filer
Problèmes de montage :
journalctl -xeu mnt-seaweedfs
Vérification des permissions :
ls -la /var/lib/seaweedfs
ls -la /mnt/seaweedfs
C'est surtout le filer qui peut poser problème.
rm /tmp/seaweedfs-filer-8888.sock
chown -R seaweedfs:seaweedfs /var/lib/seaweedfs
systemctl restart seaweedfs-filer.service
journalctl -u seaweedfs-filer -xe
Liens Intéréssant :
https://github.com/seaweedfs/seaweedfs
https://github.com/seaweedfs/seaweedfs/wiki
https://github.com/seaweedfs/seaweedfs-csi-driver