paint-brush
Comment activer la compression transparente des données sur MinIOpar@minio
7,108 lectures
7,108 lectures

Comment activer la compression transparente des données sur MinIO

par MinIO8m2023/11/10
Read on Terminal Reader

Trop long; Pour lire

La compression pour MinIO a été développée pour permettre une compression transparente sans affecter les performances globales du système.
featured image - Comment activer la compression transparente des données sur MinIO
MinIO HackerNoon profile picture

La plupart des données sont stockées dans des formats de fichiers faciles à lire pour faciliter l'interopérabilité des applications. Bien qu'il existe des formats largement utilisés pour la compression d'images, de vidéos et de sons, la plupart des autres données sont stockées sous forme de texte, au format JSON, CSV ou d'autres formats textuels similaires.


Les formats tels que Parquet, Avro et ORC ont une compression facultative, donc généralement ces formats sont déjà compressés lorsqu'ils sont stockés. Les vidéos et les images sont également généralement compressées avec des algorithmes spécifiques à un domaine qui offrent une meilleure compression que les formats génériques.


Cependant, pour les données personnalisées, il est préférable de conserver les données dans un format simple qui n'inclut pas d'étape de décompression pour y accéder. Nous souhaitons offrir la possibilité de compresser ces données avant de les stocker sur des disques.

Compression transparente à la vitesse d'E/S

La compression pour MinIO a été développée pour permettre une compression transparente sans affecter les performances globales du système.


MinIO utilise une méthode de compression basée sur Snappy appelée S2. Il est compatible avec le contenu Snappy, mais possède deux extensions de format . Tout d’abord, il autorise des blocs plus gros que les blocs de 64 Ko autorisés pour les flux Snappy. Cela améliore considérablement la compression. Deuxièmement, il ajoute des « décalages de répétition », qui offrent des améliorations de compression principalement aux données générées par la machine, telles que les fichiers journaux, JSON et CSV. Il permet également de coder efficacement les correspondances de plus de 64 octets, ce qui constitue un problème pour Snappy.


S2 permet également la compression simultanée de plusieurs blocs lorsque l'entrée est plus rapide que ce qu'un seul cœur peut absorber. Ceci est important pour maintenir la réactivité des demandes individuelles. En fait, la limitation avec plus de 16 cœurs sera la vitesse de la mémoire.

Taux de compression

Certains fournisseurs d'appliances promettent, voire supposent, un taux de compression donné lors du calcul du coût par To. Avec la compression, il n’y a pas de ratio garanti supérieur à 1:1. Différents types de données génèrent différents taux de compression et, à notre avis, il n'existe aucun moyen significatif de fournir un taux de compression moyen. Les taux de compression ne doivent jamais être évalués dans le vide ; ils doivent toujours être associés à la vitesse de compression, car la compression pratique est un compromis entre ces deux facteurs.


Comparons un seul type de données pour observer les différences. Nous comparons les implémentations Go de ces algorithmes sur une plateforme AMD64, utilisant jusqu'à 16 cœurs.


Ratio de compression


Tout d’abord, l’axe horizontal est un taux de compression tronqué, réduction obtenue par rapport à la taille non compressée. La droite, c'est mieux. Pour donner une référence, le niveau 5 de gzip monothread a été inclus.


Compresseur

Vitesse Mo/s

Taille

Réduction

décembre Mo/s

S2 par défaut

15148

1043196283

83,37%

2378

S2 Mieux

11551

954430842

84,79%

2300

S2 Meilleur

680

832855431

86,73%

2572

LZ4 le plus rapide

5645

1280414160

79,59%

2680

LZ4 Meilleur

1552

1091826460

82,60%

2694

Vif

946

1525176492

75,69%

1828

Gzip L5

206

942726276

84,97%

557


La vitesse de décompression utilise un seul cœur, même si S2 propose une décompression simultanée.


Pour ces données, Snappy est environ 10 % inférieur à la référence Gzip. Puisque nous avons affaire à des pourcentages de réduction, cela signifie également que Snappy occupe environ 1,6 fois l'espace des données compressées Gzip. Cela ignore le fait que Snappy décompresse environ 4 fois plus vite que Gzip.


LZ4 est généralement considéré comme supérieur à Snappy. Une implémentation de LZ4 qui permet la compression sur plusieurs cœurs rend également ce point plus clair. Mais la compression de base est meilleure. Le LZ4 Best, également parfois appelé LZ4-HC, offre une compression proche de gzip, mais même si la décompression est rapide, la compression n'est pas à des vitesses interactives.


S2 propose trois niveaux de compression ; S2 Default est le plus rapide possible et peut être considéré comme un concurrent direct de Snappy en ce qui concerne l'utilisation d'un seul cœur. Avec ce type de données, il fonctionne mieux que n'importe quel niveau LZ4 avec un débit nettement plus élevé. Ce mode est utilisé par MinIO pour les plates-formes sur lesquelles une implémentation d'assembly n'est pas disponible.


S2 Better permet d'échanger un peu de CPU contre une compression plus élevée. Ici, la compression rivalise avec Gzip, mais la vitesse de décompression est bien meilleure. Ce mode est utilisé par MinIO sur les plates-formes où l'assemblage est disponible – actuellement AMD64.


S2 Best est la meilleure compression que S2 puisse faire avec le format actuel. Cela peut être utilisé dans des situations où la vitesse/les ressources de compression ne sont pas les plus importantes, mais où une décompression rapide est toujours nécessaire. Actuellement, MinIO n'utilise pas ce mode, mais peut l'implémenter comme option de cycle de vie pour les objets qui n'ont pas changé depuis un certain temps.


Pour comparer, voici quelques comparaisons d’autres types de données :


Sauvegarde de machine virtuelle


Sauvegarde de base de données


CSV

Objets incompressibles

Une caractéristique importante de la compression moderne est qu’elle se comporte bien avec les données pré-compressées. Traditionnellement, les données précompressées constituent un problème pour les algorithmes de compression. Souvent, les compresseurs ralentissaient de manière déraisonnable lorsqu’ils étaient confrontés à des données incompressibles.


Beaucoup de gens savent donc instinctivement qu’il n’est pas bon de recompresser des données déjà compressées. Cependant, de nombreuses implémentations modernes sont désormais capables, dans une mesure raisonnable, de sauter rapidement des sections incompressibles.


Pour les compresseurs ci-dessus, voici les vitesses sur 2 Gio (2 147 483 647 octets) de données incompressibles :


Compresseur

Vitesse Mo/s

Taille

Réduction

S2 par défaut

13045

2147487753

0,00%

S2 Mieux

9894

2147487753

0,00%

S2 Meilleur

3938

2147487753

0,00%

LZ4 Rapide

6400

2147485710

0,00%

LZ4 Meilleur

12488

2147745841

-0,01%

Vif

6564

2147745801

-0,01%

Gzip (Aller) L5

63

2148139030

-0,03%

Gzip (alt)L5

5535

2147647512

-0,01%


Ici, nous avons également inclus gzip de la bibliothèque standard Go comme représentant de ce « mauvais » comportement. Une implémentation alternative de gzip ne montre pas ce problème. Dans tous les autres cas, le contenu est traité assez rapidement et ils obtiennent un laissez-passer.


Cela signifie que MinIO peut bien gérer les données pré-compressées.

Recherche de fichiers compressés

Un inconvénient typique de la compression est que la possibilité de sauter dans un fichier est perdue. La solution consiste à compresser les blocs indépendamment et à conserver un index qui mappe un certain nombre de décalages non compressés aux décalages compressés où la décompression peut commencer.


La compression de blocs indépendants réduira légèrement la compression, mais moins avec des blocs plus gros. Snappy/S2 compresse les flux sous forme de blocs indépendants, de par leur conception.


Pour MinIO, cela est pertinent puisque les requêtes S3 GetObject peuvent inclure des plages facultatives à récupérer. Cela permet de récupérer des parties d'objets, et nous voulons que cela soit le plus efficace possible.


À partir de la RELEASE.2022-07-13T23-29-44Z , nous générons désormais un index pour chaque partie de fichier téléchargée qui dépasse 8 Mo. L'index est ensuite attaché en interne aux métadonnées. Cela nous permet d'avancer efficacement et de décoder uniquement la partie de l'objet nécessaire pour renvoyer les données demandées.


L'index fait généralement 16 octets + environ 3 octets par Mo de données. Cela permet à MinIO de servir n'importe quel octet à partir d'un fichier compressé à la même vitesse que la récupération du premier octet.

Compression + Chiffrement au repos

Par défaut, un paramètre supplémentaire est requis pour que MinIO compresse les données à chiffrer sur le disque. Ceci afin de garantir que vous êtes conscient des implications de cela.


Lors de la compression des données, vous obtenez deux nombres ; la taille non compressée et la taille compressée. Sans compression, toute personne obtenant vos données ne peut voir qu'un seul d'entre eux : la taille non compressée.


Bien que cela ne vous donne toujours pas accès aux données contenues dans le fichier compressé, cela donne quelques indications sur les données. Il peut vous indiquer certains types de données qui ne peuvent pas exister. Si vous voyez un fichier compressé à 50 %, il est extrêmement peu probable qu'il contienne une vidéo compressée MP4.


De même, un fichier compressé à quelques octets seulement contiendra probablement une séquence répétée très simple. Il n’est pas possible de déterminer quelle est la séquence, mais cela réduit les possibilités. MinIO de RELEASE.2022-07-13T23-29-44Z complétera la sortie compressée à un multiple de 256 octets. Ce remplissage n’est enregistré nulle part. Nous ne considérons pas cela comme une solution complète au problème, mais cela réduit considérablement l’utilité des informations divulguées sur la taille pour les adversaires.


C'est la principale raison pour laquelle MinIO ne renvoie aucune information sur les tailles compressées aux clients. Par conséquent, toute information à ce sujet nécessiterait un accès au stockage back-end ou à la communication réseau back-end.


Avec ces informations, vous disposez désormais de suffisamment de connaissances pour déterminer si vous jugez qu’il est sûr d’activer la compression et le cryptage.


Les attaques de style CRIME ne sont pas possibles sur MinIO, car nous n'autorisons pas la modification ou l'ajout à un flux compressé. Nous ne dédupliquons/compressons pas non plus les versions d'objet, car cela entraînerait une fuite trop importante d'informations sur les fichiers.

Configuration de la compression dans MinIO

Par défaut, la compression sur disque est désactivée dans MinIO. La compression sur disque peut être activée ou désactivée à tout moment. Pour activer la compression sur disque, utilisez mc admin config set myminio compression enable=on .


Cela permettra la compression pour un nombre prédéfini d'extensions et de types MIME. Par défaut, ceux-ci incluront :


Rallonges

Types de mimes

.txt.log.csv.json.tar.xml.bin

texte/*application/jsonapplication/xmlbinary/octet-stream


Vous pouvez inspecter les paramètres actuels avec mc admin config get myminio compression .


Vous pouvez modifier cette liste à tout moment en modifiant :

 mc admin config set myminio compression \ extensions=.txt,.log,.csv,.json,.tar,.xml,.bin \ mime_types=text/*,application/json,application/xml,binary/octet-stream


Par défaut, MinIO exclut de force les extensions de données généralement incompressibles, telles que les fichiers gzip, audio, vidéo et image.


Il est possible d'activer la compression pour tous les objets, à l'exception de ceux exclus, en définissant la liste des extensions et les types MIME sur vides :


 mc admin config set myminio compression enable=on extensions= mime_types=


Le paramètre final est allow_encryption=on , qui permet la compression même pour les objets qui seront chiffrés. Ne définissez cette option que lorsque vous avez lu la section ci-dessus et compris les implications.

Conclusion

MinIO offre le meilleur schéma de compression de sa catégorie qui permet une compression totalement transparente des données sur disque. Dans de nombreux scénarios, cela peut conduire à une réduction des coûts de stockage, simplement en activant la compression.


Les performances GET et PUT doivent dans tous les cas rester proches des mêmes lorsque la compression est activée. En fait, dans les situations où les performances sont limitées par la vitesse de lecture du disque, la compression peut offrir des performances supplémentaires puisque moins de données doivent être lues.


Nous continuerons d'ajouter de nouvelles fonctionnalités. Nous évaluons actuellement les options de configuration au niveau du compartiment/préfixe ainsi que la compression via le cycle de vie qui compressera les fichiers lorsqu'ils atteignent un certain âge.


Si ces fonctionnalités vous intéressent, téléchargez MinIO et essayez-le par vous-même. Si vous avez des questions ou souhaitez nous parler des excellentes applications que vous créez à l'aide de MinIO, envoyez-nous un ping à [email protected] , rejoignez la communauté Slack , suivez notre blog ou abonnez-vous à notre newsletter.


Également publié ici .