Apprendre à utiliser Minio

Minio Cloud Storage
Store photos, videos, VMs, containers, log files, or any blob of data as objects.

Son déploiement est très simple car il suffit de choisir un groupe de machines (cluster) et les espaces de stockages pour que ça fonctionne. L'avantage qu'il soit écrit en Go est qu'il n'a pas besoin de dépendances. Tout est déjà prêt dans un seul logiciel.

Contexte et pré-requis

Nous souhaitons mettre en place un espace de stockage redondant et hautement disponible. Si une machine est indisponible, le cluster de donnée sera toujours disponible. voici le schéma d'infrastructure :

Rien de compliqué car nous avons 4 serveurs qui se communiquent dans le même réseau logique. Nous avons également une machine client qui pourra consulter ses données exporté au préalable sur le cluster.

Installons quelques paquets optionnels qui peuvent bien nous faciliter la tâche :

apt-get install libnss-mdns

Installer Minio

Toutes les commandes sont identiques sur chacune des machines.

On choisira le dossier /mnt qui contiendra nos données. Celui-ci peut très bien être un point de montage d'une partition si l'on souhaite dédier un disque au stockage.

Téléchargeons ensuite le logiciel serveur :

wget https://dl.minio.io/server/minio/release/linux-amd64/minio && chmod +x minio

Définissons les accès sécurisé

export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123

Puis lançons le serveur :

./minio server http://minio1/mnt http://minio2/mnt http://minio3/mnt http://minio4/mnt

Vous devez avoir ce type de réponse sur chacune des machines :

[01/04] http://minio1:9000/mnt - 9.2 GiB online  
[02/04] http://minio2:9000/mnt - 9.2 GiB online
[03/04] http://minio3:9000/mnt - 9.2 GiB online
[04/04] http://minio4:9000/mnt - 9.2 GiB online

Endpoint:  http://192.168.1.231:9000  http://10.0.2.15:9000  http://127.0.0.1:9000
AccessKey: minio
SecretKey: minio123
Region:    us-east-1
SQS ARNs:  <none>

Browser Access:
http://192.168.1.231:9000  http://10.0.2.15:9000  http://127.0.0.1:9000

Command-line Access: https://docs.minio.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://192.168.1.231:9000 minio minio123

Object API (Amazon S3 compatible):
   Go:         https://docs.minio.io/docs/golang-client-quickstart-guide 
   Java:       https://docs.minio.io/docs/java-client-quickstart-guide 
   Python:     https://docs.minio.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide

Drive Capacity: 16 GiB Free, 18 GiB Total 
Status:         4 Online, 0 Offline. We can withstand [2] more drive failure(s). 

Minio embarque une interface web accessible sur chacune des machines. L’adresse d'accès est indiqué dans le message plus haut à la ligne “Browser Access:” :

Côté client

Pour notre poste, client faisant tourner un système Unix sur sa machine, il aura besoin du logiciel nommé “mc”. Il est disponible à l'adresse suivante et on le rend exécutable par la suite :

wget https://dl.minio.io/client/mc/release/linux-amd64/mc && chmod +x mc

Enregistrer l'accès du cluster créer précédemment :

./mc config host add cluster http://minio1:9000 minio minio123

On obtient pour ce premier enregistrement, ceci :

mc: Configuration written to ‘/home/client/.mc/config.json’. Please update your access credentials.
mc: Successfully created ‘/home/client/.mc/share’.
mc: Initialized share uploads ‘/home/client/.mc/share/uploads.json’ file.
mc: Initialized share downloads ‘/home/client/.mc/share/downloads.json’ file.
Added ‘cluster’ successfully.

Après l’initialisation du cluster, il faut créer au moins un “bucket” pour enregistrer des données :

./mc mb cluster/nginx
Bucket created successfully ‘cluster/nginx’.

Exporter un fichier dans le cluster :

./mc cp fichier.txt cluster/nginx
index.html:   7 B / 7 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃

Lister le contenu d'un dossier :

./mc ls cluster/nginx
[2017-03-02 13:58:47 GMT] 484KiB index.html

D'autres commandes

Le logiciel client peut faire pas mal de chose comme enregistrer d'autres points d'entrées d'un cluster, lire des fichiers, obtenir une URL de partage, etc… Toutes les commandes actuelles sont décrites à cette page.

Point de montage avec Docker

Requis au minimum : Docker 1.13+

Minio devient très intéressant lorsqu'il s'agit de le fusionner avec des instances créées à l'aide de Docker Swarm. En effet, en quelques commandes on peut obtenir des applications qui stockeront leur données volatiles directement dans le cluster. Admettons que nous utilisons le Dockerfile suivant :

dockerfile.yml
version: '2'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - mon-cluster:/usr/share/nginx/html
    deploy:
      replicas: 3

volumes:
  mon-cluster:
    driver: minio/minfs
    driver_opts:
      endpoint: http://minio1:9000
      access-key: minio
      secret-key: minio123
      bucket: nginx

Ci-dessous, je demande d'abord la création de 3 conteneurs web puis je déclare un volume qui sera créé pour faire office de point de montage. Il faut bien sur renseigner les informations relatives à la connexion au cluster. Avant de les lancer, on a besoin du driver “minfs” :

docker plugin install minio/minfs

Enfin on peut les lancer :

docker stack deploy -c docker-compose.yml mon-projet