Çoğu veri, uygulamanın kolay birlikte çalışabilmesi için okunması kolay dosya formatlarında saklanır. Görüntü, video ve ses sıkıştırma için yaygın olarak kullanılan formatlar mevcut olsa da diğer verilerin çoğu metin, JSON, CSV veya diğer benzer metin tabanlı formatlarda depolanır.
Parquet, Avro ve ORC gibi formatların isteğe bağlı sıkıştırması vardır, dolayısıyla genellikle bu formatlar depolandığında zaten sıkıştırılır. Video ve görüntüler de genellikle genel formatlardan daha iyi sıkıştırma sunan alana özgü algoritmalarla sıkıştırılır.
Bununla birlikte, özel veriler için, verilerin erişim için bir sıkıştırma açma adımı içermeyen, karmaşık olmayan bir formatta tutulması tercih edilir. Bu verilerin disklerde saklanmadan önce sıkıştırılmasına yönelik bir seçenek sunmak istiyoruz.
MinIO için Sıkıştırma, sistemin genel performansını etkilemeden şeffaf sıkıştırmayı mümkün kılmak için geliştirilmiştir.
MinIO, S2 adı verilen Snappy'ye dayalı bir sıkıştırma yöntemi kullanır. Snappy içeriğiyle uyumludur ancak iki format uzantısına sahiptir. Her şeyden önce, Snappy akışları için izin verilen 64KB bloklardan daha büyük bloklara izin verir. Bu, sıkıştırmayı büyük ölçüde artırır. İkinci olarak, günlük dosyaları, JSON ve CSV gibi esas olarak makine tarafından oluşturulan verilerde sıkıştırma iyileştirmeleri sunan "tekrar ofsetleri" ekler. Ayrıca 64 bayt bayttan uzun eşleşmelerin etkili bir şekilde kodlanmasına da olanak tanır, bu da Snappy için sıkıntılı bir noktadır.
S2 ayrıca giriş tek bir çekirdeğin emebileceğinden daha hızlı olduğunda birden fazla bloğun eşzamanlı sıkıştırılmasına da olanak tanır. Bireysel taleplerin yanıt verme oranını yüksek tutmak için bu önemlidir. 16'dan fazla çekirdekle ilgili sınırlama, etkili bir şekilde bellek hızı olacaktır.
Bazı cihaz satıcıları TB başına maliyeti hesaplarken belirli bir sıkıştırma oranı sözü verir veya hatta bunu varsayar. Sıkıştırmada 1:1'in üzerinde garanti edilen bir oran yoktur. Farklı veri türleri farklı sıkıştırma oranları sağlar ve bize göre herhangi bir ortalama sıkıştırma oranı sağlamanın anlamlı bir yolu yoktur. Sıkıştırma oranları hiçbir zaman bir boşlukta değerlendirilmemelidir; pratik sıkıştırma bu iki faktörün bir değiş tokuşu olduğundan, bunlar her zaman sıkıştırma hızıyla eşleştirilmelidir.
Farklılıkları gözlemlemek için tek bir veri türünü karşılaştıralım. Bu algoritmaların Go uygulamalarını 16 çekirdeğe kadar kullanan bir AMD64 platformunda karşılaştırıyoruz.
Her şeyden önce, yatay eksen kesik bir sıkıştırma oranıdır, sıkıştırılmamış boyuttan elde edilen küçültmedir. Doğru daha iyi. Referans vermek gerekirse, tek iş parçacıklı gzip seviye 5 dahil edilmiştir.
Kompresör | Hız MB/sn | Boyut | Kesinti | Aralık MB/sn |
---|---|---|---|---|
S2 Varsayılanı | 15148 | 1043196283 | %83,37 | 2378 |
S2 Daha İyi | 11551 | 954430842 | %84,79 | 2300 |
S2 En İyisi | 680 | 832855431 | %86,73 | 2572 |
LZ4 En Hızlı | 5645 | 1280414160 | %79,59 | 2680 |
LZ4 En İyisi | 1552 | 1091826460 | %82,60 | 2694 |
Hızlı | 946 | 1525176492 | %75,69 | 1828 |
Gzip L5 | 206 | 942726276 | %84,97 | 557 |
S2 eş zamanlı dekompresyon sunsa da, dekompresyon hızı tek çekirdek kullanıyor.
Bu veriler için Snappy, Gzip referansının yaklaşık %10 gerisinde kalıyor. Azaltma yüzdeleriyle uğraştığımız için bu aynı zamanda Snappy'nin Gzip sıkıştırılmış verilerinin yaklaşık 1,6 katı kadar yer kapladığı anlamına da gelir. Bu, Snappy'nin sıkıştırmasını Gzip'ten yaklaşık 4 kat daha hızlı açtığı gerçeğini göz ardı ediyor.
LZ4 genellikle Snappy'den üstün olarak görülüyor. LZ4'ün birden fazla çekirdek üzerinde sıkıştırmaya izin veren uygulaması da bu noktayı daha açık hale getiriyor. Ancak temel sıkıştırma daha iyidir. Bazen LZ4-HC olarak da anılan LZ4 Best, gzip'e yakın sıkıştırma sunar, ancak açma işlemi hızlı olmasına rağmen sıkıştırma etkileşimli hızlarda değildir.
S2 üç sıkıştırma düzeyi sunar; S2 Default mümkün olan en hızlısıdır ve tek çekirdek kullanımı açısından Snappy'nin doğrudan rakibi olarak görülebilir. Bu veri türüyle, önemli ölçüde daha yüksek verimle herhangi bir LZ4 düzeyinden daha iyi performans gösterir. Bu mod MinIO tarafından montaj uygulamasının mevcut olmadığı platformlar için kullanılır.
S2 Better, daha yüksek sıkıştırma için bir miktar CPU'nun takas edilmesine olanak tanır. Burada sıkıştırma Gzip'e rakip oluyor ancak açma hızı çok daha iyi. Bu mod MinIO tarafından montajın mümkün olduğu platformlarda (şu anda AMD64) kullanılmaktadır.
S2 Best, S2'nin mevcut formatla yapabileceği en iyi sıkıştırmadır. Bu, sıkıştırma hızının/kaynaklarının çok önemli olmadığı ancak hızlı açma işleminin hala gerekli olduğu durumlarda kullanılabilir. Şu anda MinIO bu modu kullanmamaktadır ancak bir süredir değişmeyen nesneler için bunu bir yaşam döngüsü seçeneği olarak uygulayabilir.
Karşılaştırmak için burada diğer veri türlerinin birkaç karşılaştırması verilmiştir:
Modern sıkıştırmanın önemli bir özelliği, önceden sıkıştırılmış verilerle iyi çalışmasıdır. Geleneksel olarak önceden sıkıştırılmış veriler, sıkıştırma algoritmaları için bir sorun olmuştur. Sıkıştırılamaz verilerle karşılaşıldığında kompresörler sıklıkla mantıksız şekilde yavaşlar.
Bu nedenle birçok kişi zaten sıkıştırılmış verileri yeniden sıkıştırmanın kötü olduğunu içgüdüsel olarak biliyor. Bununla birlikte, birçok modern uygulama artık sıkıştırılamaz bölümleri hızlı bir şekilde makul bir dereceye kadar atlayabilmektedir.
Yukarıdaki kompresörler için bunlar 2GiB (2,147,483,647 bayt) sıkıştırılamaz verilerdeki hızlardır:
Kompresör | Hız MB/sn | Boyut | Kesinti |
---|---|---|---|
S2 Varsayılanı | 13045 | 2147487753 | %0,00 |
S2 Daha İyi | 9894 | 2147487753 | %0,00 |
S2 En İyisi | 3938 | 2147487753 | %0,00 |
LZ4 Hızlı | 6400 | 2147485710 | %0,00 |
LZ4 En İyisi | 12488 | 2147745841 | -%0,01 |
Hızlı | 6564 | 2147745801 | -%0,01 |
Gzip (Git) L5 | 63 | 2148139030 | -%0,03 |
Gzip (alt) L5 | 5535 | 2147647512 | -%0,01 |
Burada bu "kötü" davranışın bir temsilcisi olarak Go standart kütüphanesinden gzip'i de dahil ettik. Alternatif bir gzip uygulaması bu sorunu göstermiyor. Diğer tüm durumlarda içerik oldukça hızlı işlenir ve geçiş yapılır.
Bu, MinIO'nun önceden sıkıştırılmış verileri iyi bir şekilde işlemesinin beklenebileceği anlamına gelir.
Sıkıştırmanın tipik bir dezavantajı, bir dosya içinde atlama yeteneğinin kaybolmasıdır. Bunun çözümü, blokları bağımsız olarak sıkıştırmak ve bir dizi sıkıştırılmamış uzaklığı, açma işleminin başlayabileceği sıkıştırılmış uzaklıklara eşleyen bir dizin tutmaktır.
Bağımsız blokların sıkıştırılması sıkıştırmayı biraz azaltacaktır, ancak daha büyük bloklarda daha az olacaktır. Snappy/S2, akışları tasarım gereği bağımsız bloklar halinde sıkıştırır.
MinIO için bu durum geçerlidir, çünkü S3 GetObject istekleri alınacak isteğe bağlı aralıkları içerebilir. Bu, nesnelerin parçalarının alınmasına olanak tanır ve bunun mümkün olduğu kadar verimli olmasını istiyoruz.
RELEASE.2022-07-13T23-29-44Z'den başlayarak artık yüklenen 8 MB'tan büyük her dosya parçası için bir dizin oluşturuyoruz. Daha sonra indeks dahili olarak meta verilere eklenir. Bu, etkili bir şekilde ileri atlamamıza ve nesnenin yalnızca istenen verileri döndürmek için gereken kısmının kodunu çözmemize olanak tanır.
Dizin tipik olarak 16 bayt + veri MB'si başına yaklaşık 3 bayttır. Bu, MinIO'nun sıkıştırılmış bir dosyadaki herhangi bir bayta, ilk baytı alma hızıyla aynı hızda hizmet vermesine olanak tanır.
MinIO'nun diskte şifrelenecek verileri sıkıştırması için varsayılan olarak ekstra bir parametre gereklidir. Bu, bunun sonuçlarının farkında olmanızı sağlamak içindir.
Verileri sıkıştırırken iki sayı elde edersiniz; sıkıştırılmamış ve sıkıştırılmış boyut. Sıkıştırma olmadan verilerinizi alan herkes bunlardan yalnızca birini görebilir: sıkıştırılmamış boyut.
Bu yine de sıkıştırılmış dosya içindeki herhangi bir veriye erişmenizi sağlamasa da, verilerle ilgili bazı ipuçları verir. Size muhtemelen olamayacağı bazı veri türlerini söyleyebilir. %50 oranında sıkıştırılmış bir dosya görürseniz, MP4 sıkıştırılmış video içermesi son derece düşük bir ihtimaldir.
Benzer şekilde, yalnızca birkaç bayta sıkıştırılmış bir dosya muhtemelen çok basit bir tekrarlanan dizi içerecektir. Sıranın ne olduğunu söylemek mümkün değil ama olasılıkları azaltıyor. RELEASE.2022-07-13T23-29-44Z'deki MinIO, sıkıştırılmış çıktıyı 256 baytın katlarına kadar dolduracaktır. Bu dolgu hiçbir yere kaydedilmez. Bunu soruna yönelik tam bir düzeltme olarak görmüyoruz, ancak sızdırılan boyut bilgilerinin rakipler için kullanışlılığını büyük ölçüde azaltıyor.
MinIO'nun sıkıştırılmış boyutlar hakkında istemcilere herhangi bir bilgi döndürmemesinin ana nedeni budur. Bu nedenle bununla ilgili herhangi bir bilgi, arka uç depolamaya veya arka uç ağ iletişimine erişim gerektirecektir.
Bu bilgiler sayesinde artık sıkıştırma ve şifrelemeyi etkinleştirmenin güvenli olup olmadığını belirlemek için yeterli bilgiye sahip olursunuz.
Herhangi bir sıkıştırılmış akışın değiştirilmesine veya eklenmesine izin vermediğimiz için MinIO'da CRIME tarzı saldırılar mümkün değildir. Ayrıca, dosyalar hakkında çok fazla bilginin sızmasına neden olacağından, nesne sürümleri arasında tekilleştirme/sıkıştırma yapmıyoruz.
Varsayılan olarak MinIO'da disk içi sıkıştırma devre dışıdır. Disk üzerinde sıkıştırma herhangi bir zamanda etkinleştirilebilir veya devre dışı bırakılabilir. Disk üzerinde sıkıştırmayı etkinleştirmek için mc admin config set myminio compression enable=on
kullanın.
Bu, önceden belirlenmiş sayıda uzantı ve MIME türü için sıkıştırmayı etkinleştirecektir. Varsayılan olarak bunlar şunları içerecektir:
Uzantılar | Mim Türleri |
---|---|
.txt.log.csv.json.tar.xml.bin | metin/*application/jsonapplication/xmlbinary/octet-stream |
Mevcut ayarları mc admin config get myminio compression
ile inceleyebilirsiniz.
Bu listeyi istediğiniz zaman değiştirerek değiştirebilirsiniz:
mc admin config set myminio compression \ extensions=.txt,.log,.csv,.json,.tar,.xml,.bin \ mime_types=text/*,application/json,application/xml,binary/octet-stream
Varsayılan olarak MinIO, gzip, ses, video, resim dosyaları gibi yaygın olarak sıkıştırılamayan verilerin uzantılarını zorla hariç tutar.
Uzantı listesini ve mime türlerini boş olarak ayarlayarak hariç tutulanlar dışındaki tüm nesneler için sıkıştırmayı etkinleştirmek mümkündür:
mc admin config set myminio compression enable=on extensions= mime_types=
Son ayar, şifrelenecek nesneler için bile sıkıştırmaya izin veren allow_encryption=on
şeklindedir. Bunu yalnızca yukarıdaki bölümü okuyup sonuçlarını anladığınızda ayarlayın.
MinIO, diskteki verilerin tamamen şeffaf bir şekilde sıkıştırılmasına olanak tanıyan sınıfının en iyisi sıkıştırma şemasını sunar. Bu, birçok senaryoda, yalnızca sıkıştırmanın etkinleştirilmesiyle depolama maliyetlerinde azalmaya yol açabilir.
GET ve PUT performansı, sıkıştırma etkinleştirildiğinde her durumda aynı kalmalıdır. Aslında performansın disk okuma hızıyla sınırlı olduğu durumlarda, daha az verinin okunması gerektiğinden sıkıştırma ek performans sunabilir.
Yeni özellikler eklemeye devam edeceğiz. Şu anda paket/önek düzeyi yapılandırma seçeneklerini ve dosyaları belirli bir yaşa ulaştıklarında sıkıştıracak yaşam döngüsü boyunca sıkıştırmayı değerlendiriyoruz.
Bu özellikler ilginizi çekiyorsa MinIO'yu indirin ve kendiniz deneyin. Herhangi bir sorunuz varsa veya MinIO kullanarak oluşturduğunuz harika uygulamalar hakkında bize bilgi vermek istiyorsanız [email protected] adresinden bize mesaj atın, Slack topluluğuna katılın, blogumuzu takip edin veya bültenimize abone olun.
Burada da yayınlandı.