Stockage objet distribué : installez MinIO via plusieurs serveurs et volumes de stockage
Vos données, éclatées
Notre dossier sur MinIO :
Le 14 octobre 2020 à 06h30
11 min
Logiciel
Logiciel
MinIO est un serveur de stockage objet compatible S3 simple, mais plutôt complet. Il permet notamment de répartir vos données sur plusieurs périphériques de stockage et plusieurs serveurs pour limiter les pannes. Mais il faut pour cela en passer par un peu de configuration. On vous explique comment procéder.
En juin dernier, nous vous présentions un serveur de stockage objet compatible avec l'API S3 d'Amazon Web Services : MinIO. Une solution open source, facile à mettre en place sur différentes plateformes. L'entreprise est aussi à l'origine d'un client disposant des mêmes avantages, nommé sobrement MinIO Client.
Outre sa simplicité de mise en œuvre, son serveur permet différents niveaux de redondances. Tout d'abord multipliant les périphériques de stockage dans un même serveur (scale-in), avec gestion des codes d'effacement (erasure code via Reed-Solomon) et protection contre la dégradation des données (Bit Rot) via HighwayHash.
Mais aussi en multipliant les instances (scale-out) afin de répartir la charge, limiter les risques de perte de données et autres indisponibilités. La procédure est facile à suivre tout en ouvrant la voie à des fonctionnalités avancées pour ceux qui souhaitent aller plus loin ou passer en production.
Dans ce tutoriel, nous vous expliquerons comment installer MinIO sur différents serveurs, différents périphériques de stockage et surtout comment unifier tout cela à travers une unique adresse IP d'accès (et donc un domaine).
- MinIO Client : gérez du stockage compatible S3 en ligne de commandes (ou dans des scripts)
- MinIO : créez simplement votre propre service de stockage objet, compatible S3 et distribué
- Stockage objet distribué : installez MinIO via plusieurs serveurs et volumes de stockage
Installer MinIO sur un premier serveur
Dans la précédente partie de ce dossier, nous vous avions expliqué comment installer MinIO sous Windows 10. Cette fois nous utiliserons des instances Scaleway (DEV1-S) sous Ubuntu 20.04 LTS, dotées de 20 Go de stockage. Il est possible de leur adjoindre des volumes de type Block Storage.
MinIO nécessitant au moins quatre périphériques de stockage pour mettre en place une redondance, nous avons ajouté 4x 25 Go pour un coût total de 0,0219 euro HT de l'heure, soit 0,5256 euro HT par jour et par instance :
Une fois l'instance créée, on s'y connecte via OpenSSH et l'IP publique fournie. On arrive sur le système qu'il faut tout d'abord mettre à jour. Comme l'utilisateur courant est root
, on peut s'éviter la commande sudo
:
apt update && apt full-upgrade -y && apt autoremove -y
On télécharge ensuite MinIO, on le rend exécutable et on le déplace dans le dossier des binaires :
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin
minio
Si tout s'est bien passé, la dernière ligne devrait vous afficher l'aide de MinIO et sa version. On crée ensuite un utilisateur dédié, qui ne pourra pas de connecter à la machine (shell /sbin/nologin
). Il sera uniquement utilisé pour l'accès aux données par MinIO. On lui donne la propriété de l'exécutable que l'on vient de déplacer :
useradd -r minio -s /sbin/nologin
chown minio:minio /usr/local/bin/minio
On créé alors un espace de travail pour tester MinIO. On le place dans le dossier partagé par les utilisateurs du système. Là aussi on transfère la propriété à celui que l'on vient de créer :
mkdir /usr/local/share/minio
chown minio:minio /usr/local/share/minio
Votre serveur MinIO est prêt à être lancé :
minio server /usr/local/share/minio/
Pour y accéder, tapez l'URL suivante dans la barre d'adresse de votre navigateur :
http://IP.de.votre.serveur:9000
Les identifiants par défaut sont minioadmin
/minioadmin
. Si cela ne fonctionne pas, pensez à vérifier que le port 9000 de votre machine est ouvert et accessible depuis l'extérieur (non bloqué par votre hébergeur).
Redondance sur plusieurs volumes de stockage
Passons maintenant à la configuration des 4x 25 Go de stockage accessibles depuis notre serveur. On commence tout d'abord par couper MinIO (CTRL+C) et supprimer le dossier créé pour ce premier essai :
rm -rf /usr/local/share/minio
On liste ensuite les périphériques de stockage liés à notre serveur :
lsblk
Ce qui donne dans notre cas le résultat suivant :
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 23.3G 0 disk
sdb 8:16 0 23.3G 0 disk
sdc 8:32 0 23.3G 0 disk
sdd 8:48 0 23.3G 0 disk
vda 252:0 0 18.6G 0 disk
├─vda1 252:1 0 18.5G 0 part /
├─vda14 252:14 0 4M 0 part
└─vda15 252:15 0 106M 0 part /boot/efi
Les périphériques qui nous intéressent sont nommés sda
, sdb
, sdc
et sdd
. Nous les montons comme /mnt/minio1
à /mnt/minio4
. Une séquence qui sera importante pour la suite puisqu'elle facilitera le lancement de MinIO. On pourrait aussi utiliser le stockage local avec un lien symbolique vers /mnt/minio5
par exemple.
mkdir /mnt/minio{1..4}
mkfs.ext4 /dev/sda
mkfs.ext4 /dev/sdb
mkfs.ext4 /dev/sdc
mkfs.ext4 /dev/sdd
echo "/dev/sda /mnt/minio1 ext4 defaults 0 0" >> /etc/fstab
echo "/dev/sdb /mnt/minio2 ext4 defaults 0 0" >> /etc/fstab
echo "/dev/sdc /mnt/minio3 ext4 defaults 0 0" >> /etc/fstab
echo "/dev/sdd /mnt/minio4 ext4 defaults 0 0" >> /etc/fstab
reboot
La machine redémarre, on s'y reconnecte. Normalement vous devriez disposer de vos quatre dossiers accessibles dans /mnt/
. On change leur propriétaire et on lance le serveur MinIO en les utilisant comme cible de stockage :
chown minio:minio /mnt/minio{1..4}
minio server /mnt/minio{1..4}
Et Voilà ! Vous disposez d'un serveur qui va disséminer ses données à travers quatre volumes de Block Storage. Vous pouvez changer les identifiants de connexion avec les deux commandes suivantes :
export MINIO_ACCESS_KEY=clé_d_accès
export MINIO_SECRET_KEY=clé_secrète
D'autres paramètres sont détaillés par ici. Pour activer un accès HTTPS, c'est par là.
Utilisation de MinIO comme un service
Maintenant que notre serveur fonctionne et peut être démarré manuellement, automatisons le processus à travers un service. Tout d'abord en créant un fichier de configuration des variables d'environnement et en l'éditant :
nano /etc/default/minio
Ajoutez-y les lignes suivantes :
MINIO_ACCESS_KEY="clé_d_accès"
MINIO_SECRET_KEY="clé_secrète"
MINIO_VOLUMES="/mnt/minio{1...4}"
MINIO_OPTS="-C /etc/minio --address IP.privée.du.serveur:9000"
Attention, ici il faut bien mettre l'IP privée du serveur sur son réseau local et non son IP publique (celle par laquelle vous y accédez). L'hébergeur vous communique les deux. Pensez à adapter les différentes valeurs à votre besoin et à utiliser des clés complexes et à les garder en sûreté. Enregistrez et quittez (CTRL+X).
Scaleway détaille les adresses IP de ses instances dans la liste des informations les concernant
On change ensuite le propriétaire du fichier :
chown minio:minio /etc/default/minio
MinIO fournit un fichier type pour déclarer son application comme un service On le modifie pour créer le nôtre :
nano minio.service
On y ajoute le contenu suivant :
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local/
EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
On l'enregistre (CTRL+X), on le déplace dans le dossier de Systemd puis on l'active :
mv minio.service /etc/systemd/system
systemctl daemon-reload
systemctl enable minio
On lance le MinIO et on vérifie que tout se passe bien :
systemctl start minio
systemctl status minio
Si tout est au vert, vous pouvez redémarrer le serveur, tout est opérationnel.
Plusieurs serveurs pour un même pool de données
Nous allons maintenant faire fonctionner plusieurs serveurs MinIO ensemble. Il faut pour cela configurer une seconde instance comme on vient de le faire pour la première. Une fois la procédure terminée, vous avez deux serveurs MinIO qui ne sont pas (encore) capables de communiquer ensemble.
On commence par nettoyer les données de nos essais précédents :
rm -rf /mnt/minio1/.minio.sys
rm -rf /mnt/minio2/.minio.sys
rm -rf /mnt/minio3/.minio.sys
rm -rf /mnt/minio4/.minio.sys
Sans cela, les serveurs refuseraient de se lancer en accès unifié, puisqu'ils contiennent déjà des données issues de la configuration précédente. Il faut ensuite changer la façon de les lancer. Pour cela, vous devez noter les IP privées de chacun de vos serveurs et les ajouter à leur fichier host de manière à ce qu'ils soient accessibles par un nom itératif : minio-server1, minio-server2, etc. :
echo "IP.privée.serveur.1 minio-server1" >> /etc/hosts
echo "IP.privée.serveur.2 minio-server2" >> /etc/hosts
Notez que vous pouvez faire de même sur trois ou quatre serveurs ou plus si vous le désirez. Une fois la procédure terminée, il faut modifier le fichier de configuration pour préciser le nom des différences instances :
nano /etc/default/minio
Remplacez la valeur correspondant à la définition des volumes par la suivante :
MINIO_VOLUMES="http://minio-server{1...2}/mnt/minio{1...4}"
Ici on voit bien l'intérêt de nommer les machines et les volumes d'une manière particulière. Si l'on ne le faisait pas, il faudrait préciser chaque adresse de serveur, chaque nom de volume de manière différente, et donc avoir une liste à maintenir bien plus longue. Autre avantage, si vous remplacez un serveur, il suffit de modifier le fichier host.
Redémarrez les deux machines. Tout devrait fonctionner à merveille.
Bonus : on utilise nginx pour n'utiliser qu'une adresse IP
Désormais, que vous alliez sur la première ou la seconde IP, vous obtiendrez la même interface et les mêmes données. Mais laquelle communiquer à vos visiteurs, ou même pour la redirection d'un nom de domaine ?
Pour éviter ce problème, on utilise un serveur qui se chargera de renvoyer les visiteurs vers l'une ou l'autre des IP. Scaleway propose un répartisseur de charge (load balancer), mais un tel outil n'est pas nécessaire ici. On va se contenter d'une instance avec nginx configurée pour renvoyer aléatoirement sur l'un de nos deux serveurs.
Pour cela on configure une DEV1-S sous Ubuntu 20.04 LTS. On la met à jour et on installe nginx :
apt update && apt full-upgrade -y && apt autoremove -y
apt install nginx -y
systemctl start nginx
systemctl status nginx
Si vous tapez l'adresse IP publique de votre serveur dans un navigateur, la page par défaut devrait s'afficher :
On édite ensuite le fichier de configuration du serveur :
nano /etc/nginx/sites-enabled/default
On remplace son contenu par les lignes suivantes :
upstream minio {
server IP.privée.serveur.1:9000;
server IP.privée.serveur.2:9000;
}
server {
server_name _;
listen 80;
listen [::]:80;
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
location / {
proxy_pass http://minio;
}
}
Attention à bien utiliser là encore les IP privées de vos serveurs et non leurs IP publiques, toutes les machines étant hébergées au sein d'un même service, autant en profiter. Une fois le fichier enregistré et fermé (CTRL+X) on peut redémarrer le serveur nginx. Vous pourrez ensuite utiliser son IP pour accéder à vos instances MinIO :
systemctl restart nginx
Vous pouvez dès lors rediriger votre nom de domaine. Scaleway détaille la procédure à suivre pour activer un accès HTTPS via nginx. Vous pouvez également accéder à vos données via un client compatible S3 comme celui de MinIO, renforcer la sécurité de vos instances, limiter les accès depuis l'extérieur à vos serveurs exécutant MinIO, ajouter des logs, alertes et autres procédures. Pensez également à mettre en place des sauvegardes vers l'extérieur.
Notez enfin que MinIO propose des procédures de déploiement simplifiées via Docker Swarm ou Kubernetes si vous voulez aller un peu plus loin dans l'automatisation de la mise en place d'une architecture distribuée.
Nous avons mis placé les scripts et fichiers de configuration de ce tutoriel dans un Gist public.
Stockage objet distribué : installez MinIO via plusieurs serveurs et volumes de stockage
-
Installer MinIO sur un premier serveur
-
Redondance sur plusieurs volumes de stockage
-
Utilisation de MinIO comme un service
-
Plusieurs serveurs pour un même pool de données
-
Bonus : on utilise nginx pour n'utiliser qu'une adresse IP
Commentaires (14)
Vous devez être abonné pour pouvoir commenter.
Déjà abonné ? Se connecter
Abonnez-vousLe 14/10/2020 à 07h09
Ces articles sur minIO sont intéressant - en ce moment je cherche une solution de sauvegarde multiplateforme (dont windows avec VSS) , et l’une de mes contraintes est que la solution de sauvegarde ne doit pas dépendre d’un serveur “maître”, mais que le stockage externe doit simplement être considéré comme un simple repo.
J’avais choisi rsync, mais sous windows il n’est pas simple de trouver un logiciel de backup incrémentale libre qui supporte le VSS , et qui marche bien (Duplicati remplissait mes critères jusqu’à ce que le service sur les clients ne devienne dingue & prenne 100% du CPU 100% du temps)
Placer minIO sur un serveur de backup et ainsi utiliser les protocoles S3 me parait donc un choix intéressant.
Et pour sauvegarder le serveur lui-même, de ce que j’en comprends il faut “simplement” sauvegarder les dossier /mnt/minio*
Merci en ts cas
Le 14/10/2020 à 07h11
Super article
Pour pinailler, il n’y a pas besoin de changer le propriétaire du programme et du fichier de configuration (en terme de sécurité, sauf cas particulier, c’est une mauvaise idée (ça permet à un utilisateur non privilégié (ici minio) de modifier la configuration ou le programme en cas de faille)).
Le 14/10/2020 à 07h16
Je vais revoir si ça ne pose pas de problème, si c’est le cas je mettrai à jour l’article et les scripts
Le 14/10/2020 à 07h36
Sympa l’article.
Pas besoin de reboot après avoir fait les etrées dans /etc/fstab, un simple mount -a suffit
Le 14/10/2020 à 07h50
En fait il est parfois nécessaire suite aux mises à jour, donc autant le faire là. Et au moins ça permet de vérifier que le mount se fait bien seul au démarrage ;)
PS : et pour ceux qui se poseraient la question, j’ai uploadé 29,5 Go de données sur un serveur avec quatre espaces de stockage comme dans l’article, chacun voyait 16 Go d’occupé à la fin du processus. MinIO permet de modifier les règles de redondances pour pousser ou réduire le curseur selon les cas (notamment avec la notion de classe de redondance de l’API S3).
Le 14/10/2020 à 08h49
La seule contre indication serait de lancer minio en tant que root.
Pour le reste libre à chacun de spécifier un utilisateur dédié (avec des droits / limitations spécifiques si nécessaire).
En revanche je vois que le fichier type de service fournit par minio contient une section [service] avec déjà des entrées pour un utilisateur / groupe.
Autant utiliser cette configuration plutôt que de changer les droits de l’exécutable, non ?
[Service]
User=minio-user
Group=minio-user
En tout cas merci pour l’article, très intéressant et très didactique :)
Le 14/10/2020 à 08h57
Sauf cas particulier, ce n’est pas une bonne idée que le user qui exécute le programme soit propriétaire de celui-ci ainsi que des fichiers de configurations. Il vaut mieux laisser root comme propriétaire
Mais bon c’est HS par rapport à l’article ;)
Le 14/10/2020 à 09h21
Pas forcément HS, mais intéressant en tous cas ;)
Le 14/10/2020 à 09h28
Merci pour la correction, je me mélange les pinceaux entre propriétaire du binaire et exécuteur
C’est vrai que c’est un peu gênant si MinIO ne se lance plus <_<
Le 14/10/2020 à 10h02
Surtout qu’il n’est pas toujours très explicite dans ses messages d’erreur remontés par le service
Le 14/10/2020 à 10h55
Pour ma part j’utilise PIED PIPER pour le stockage distribué.
Le 15/10/2020 à 09h31
J’ai instantanément eu la référence, mais pendant un moment je me suis demander si ils en avaient vraiment fait quelque chose ou si c’était juste un troll
Le 16/10/2020 à 15h41
Dans le même genre, j’avais tenter d’utiliser les object storage (S3 avec swift) du public cloud d’OVH, en utilisant rclone, qui a l’intérêt de chiffrer à la volé, les fichiers envoyé. Mon but est de sauver mes photos perso de façon pérenne et sécurisé.
A un moment, j’ai cru que cela serait simple :/
Le 16/10/2020 à 18h13
L’API S3 (et donc la plupart des clients/serveurs) permet du chiffrement des données. Pas besoin de passer par un rclone pour ça.