Minio
RETOUR D’EXPÉRIENCE
Sébastien Blaisot
 @SebBlaisot
 @work
 Responsable d’ingénieurs légo : Sysadmin, devops, SRE
 Team Lead Infra @ Cozycloud – https://cozy.io
A universal drive,
connected to
devices and
applications
Digital services
at home
Automated
data collections
La promesse
Qu’est-ce que c’est
 Serveur de stockage objet
 Open-source : https://github.com/minio/minio
 Écrit en go
 Haute performance
 Distribué
 Designé pour être utilisé
 à grande échelle
 en environnement virtualisé (VM, docker, …)
Fonctionnalités
 API compatible Amazon S3*
 Protection des données
 Bitrot détection
 Erasure coding (par défaut k=m=n/2)
 Haute dispo (cluster) jusque 16 serveurs
 Read quorum N/2
 Write quorum N/2+1
 Chiffrement coté client ou serveur
 Nombreux backends de stockage
 Disque / FS
 Externe (NAS, GCS, Azure, DC/OS) - Gateway S3
Architectures
1. standalone
Architectures
2. multiple drives – erasure coding
Architectures
3. distributed – erasure coding
Architectures
4. Orchestration
L’enthousiasme
Installation
$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
# That’s it !
Lancer en standalone
$ ./minio server /home/minio/data
Endpoint: http://10.0.2.15:9000 http://127.0.0.1:9000
AccessKey: FN95TCN890ENV2REGU71
SecretKey: jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GOp
Browser Access:
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://10.0.2.15:9000 FN95TCN890ENV2REGU71
jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GOp
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
.NET: https://docs.minio.io/docs/dotnet-client-quickstart-guide
Configurer le client AWS et
lister les buckets
$ aws configure
AWS Access Key ID [None]: FN95TCN890ENV2REGU71
AWS Secret Access Key [None]:
jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GOp
Default region name [None]:
Default output format [None]:
$ aws --endpoint-url http://localhost:9000 s3 ls
2018-12-03 15:52:30 mybucket
2018-12-03 15:55:07 testbucket
Créer un bucket
uploader un fichier
$ aws --endpoint-url http://localhost:9000 s3 mb s3://otherbucket
make_bucket: otherbucket
$ aws --endpoint-url http://localhost:9000 s3 ls
2018-12-03 15:52:30 mybucket
2018-12-03 15:56:46 otherbucket
2018-12-03 15:55:07 testbucket
$ aws --endpoint-url http://localhost:9000 s3 cp test.txt
s3://mybucket
upload: ./test.txt to s3://mybucket/test.txt
$ aws --endpoint-url http://localhost:9000 s3 ls s3://mybucket
2018-12-03 15:57:22 11 test.txt
Supprimer un bucket
minio@xubuntu18:~$ aws --endpoint-url http://localhost:9000 s3
rb s3://mybucket --force
delete: s3://mybucket/test.txt
remove_bucket: mybucket
Cluster
$ export MINIO_ACCESS_KEY=FN95TCN890ENV2REGU71
$ export MINIO_SECRET_KEY=jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GO
$ ./minio server --address 127.0.0.1:9001 
http://127.0.0.1:9001/home/minio/data1 
http://127.0.0.1:9002/home/minio/data2 
http://127.0.0.1:9003/home/minio/data3 
http://127.0.0.1:9004/home/minio/data4
La désillusion
*Amazon S3 compatibility restrictions
 List of Amazon S3 Bucket API's not supported on Minio
 BucketACL (Use bucket policies instead)
 BucketCORS (CORS enabled by default on all buckets for all HTTP verbs)
 BucketLifecycle (Not required for Minio erasure coded backend)
 BucketReplication (Use mc mirror instead)
 BucketVersions, BucketVersioning (Use s3git)
 BucketWebsite (Use caddy or nginx)
 BucketAnalytics, BucketMetrics, BucketLogging (Use bucket notification APIs)
 BucketRequestPayment
 BucketTagging
 List of Amazon S3 Object API's not supported on Minio
 ObjectACL (Use bucket policies instead)
 ObjectTorrent
 ObjectVersions
Quelques limitations – 1/2
 Pas de multi tenant. Si besoin de plusieurs tenants (clients), déployer
plusieurs minio.
 Le chiffrement coté serveur doit être demandé explicitement par le
client qui fournit les clés de chiffrement
 Topologie figée, pas de rebalance
 Quand c’est plein, dommage…
 « Minio is different by design »
Quelques limitations – 2/2
 Pas d’auto-réparation
 Si un serveur est « absent » lors d’un mouvement d’objet, il faut
manuellement lancer une réparation sur l’objet quand le serveur revient
 Recursive healing possible mais très lent
 Bug au remplacement d’un serveur : corrigé
 Rolling upgrades problématiques
 « Rolling upgrade is not possible since minio requires under distributed
setup all servers to be of same version.”
 Un commit recent pour améliorer la situation : semantic versioning
 Mais toujours pas ça… le cluster est splitté en deux, avec 2 versions en
parallèle
Et donc
En résumé
 Parfait pour du prototypage rapide / du dev
 Une bonne solution pour des environnements virtuels orchestrés
(docker / kubernetes)
 Des vrais risques d’exploitabilité à long terme
 Pas adapté pour du massive-scale on-prem

Retour d'expérience Minio

  • 1.
  • 2.
    Sébastien Blaisot  @SebBlaisot @work  Responsable d’ingénieurs légo : Sysadmin, devops, SRE  Team Lead Infra @ Cozycloud – https://cozy.io A universal drive, connected to devices and applications Digital services at home Automated data collections
  • 3.
  • 4.
    Qu’est-ce que c’est Serveur de stockage objet  Open-source : https://github.com/minio/minio  Écrit en go  Haute performance  Distribué  Designé pour être utilisé  à grande échelle  en environnement virtualisé (VM, docker, …)
  • 5.
    Fonctionnalités  API compatibleAmazon S3*  Protection des données  Bitrot détection  Erasure coding (par défaut k=m=n/2)  Haute dispo (cluster) jusque 16 serveurs  Read quorum N/2  Write quorum N/2+1  Chiffrement coté client ou serveur  Nombreux backends de stockage  Disque / FS  Externe (NAS, GCS, Azure, DC/OS) - Gateway S3
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 13.
    Lancer en standalone $./minio server /home/minio/data Endpoint: http://10.0.2.15:9000 http://127.0.0.1:9000 AccessKey: FN95TCN890ENV2REGU71 SecretKey: jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GOp Browser Access: 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://10.0.2.15:9000 FN95TCN890ENV2REGU71 jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GOp 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 .NET: https://docs.minio.io/docs/dotnet-client-quickstart-guide
  • 14.
    Configurer le clientAWS et lister les buckets $ aws configure AWS Access Key ID [None]: FN95TCN890ENV2REGU71 AWS Secret Access Key [None]: jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GOp Default region name [None]: Default output format [None]: $ aws --endpoint-url http://localhost:9000 s3 ls 2018-12-03 15:52:30 mybucket 2018-12-03 15:55:07 testbucket
  • 15.
    Créer un bucket uploaderun fichier $ aws --endpoint-url http://localhost:9000 s3 mb s3://otherbucket make_bucket: otherbucket $ aws --endpoint-url http://localhost:9000 s3 ls 2018-12-03 15:52:30 mybucket 2018-12-03 15:56:46 otherbucket 2018-12-03 15:55:07 testbucket $ aws --endpoint-url http://localhost:9000 s3 cp test.txt s3://mybucket upload: ./test.txt to s3://mybucket/test.txt $ aws --endpoint-url http://localhost:9000 s3 ls s3://mybucket 2018-12-03 15:57:22 11 test.txt
  • 16.
    Supprimer un bucket minio@xubuntu18:~$aws --endpoint-url http://localhost:9000 s3 rb s3://mybucket --force delete: s3://mybucket/test.txt remove_bucket: mybucket
  • 17.
    Cluster $ export MINIO_ACCESS_KEY=FN95TCN890ENV2REGU71 $export MINIO_SECRET_KEY=jVWpecwAeqnzk4tFM8CfOUJ9iJKxlgGtADOE+GO $ ./minio server --address 127.0.0.1:9001 http://127.0.0.1:9001/home/minio/data1 http://127.0.0.1:9002/home/minio/data2 http://127.0.0.1:9003/home/minio/data3 http://127.0.0.1:9004/home/minio/data4
  • 18.
  • 19.
    *Amazon S3 compatibilityrestrictions  List of Amazon S3 Bucket API's not supported on Minio  BucketACL (Use bucket policies instead)  BucketCORS (CORS enabled by default on all buckets for all HTTP verbs)  BucketLifecycle (Not required for Minio erasure coded backend)  BucketReplication (Use mc mirror instead)  BucketVersions, BucketVersioning (Use s3git)  BucketWebsite (Use caddy or nginx)  BucketAnalytics, BucketMetrics, BucketLogging (Use bucket notification APIs)  BucketRequestPayment  BucketTagging  List of Amazon S3 Object API's not supported on Minio  ObjectACL (Use bucket policies instead)  ObjectTorrent  ObjectVersions
  • 20.
    Quelques limitations –1/2  Pas de multi tenant. Si besoin de plusieurs tenants (clients), déployer plusieurs minio.  Le chiffrement coté serveur doit être demandé explicitement par le client qui fournit les clés de chiffrement  Topologie figée, pas de rebalance  Quand c’est plein, dommage…  « Minio is different by design »
  • 21.
    Quelques limitations –2/2  Pas d’auto-réparation  Si un serveur est « absent » lors d’un mouvement d’objet, il faut manuellement lancer une réparation sur l’objet quand le serveur revient  Recursive healing possible mais très lent  Bug au remplacement d’un serveur : corrigé  Rolling upgrades problématiques  « Rolling upgrade is not possible since minio requires under distributed setup all servers to be of same version.”  Un commit recent pour améliorer la situation : semantic versioning  Mais toujours pas ça… le cluster est splitté en deux, avec 2 versions en parallèle
  • 22.
  • 23.
    En résumé  Parfaitpour du prototypage rapide / du dev  Une bonne solution pour des environnements virtuels orchestrés (docker / kubernetes)  Des vrais risques d’exploitabilité à long terme  Pas adapté pour du massive-scale on-prem