paint-brush
MinIO'da Şeffaf Veri Sıkıştırmayı Etkinleştirmeile@minio
6,953 okumalar
6,953 okumalar

MinIO'da Şeffaf Veri Sıkıştırmayı Etkinleştirme

ile MinIO8m2023/11/10
Read on Terminal Reader

Çok uzun; Okumak

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.
featured image - MinIO'da Şeffaf Veri Sıkıştırmayı Etkinleştirme
MinIO HackerNoon profile picture

Ç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.

GÇ Hızında Şeffaf Sıkıştırma

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.

Sıkıştırma Oranları

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.


Sıkıştırma oranı


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:


VM Yedekleme


Veritabanı Yedekleme


CSV

Sıkıştırılamaz Nesneler

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ırılmış Dosyaları Arama

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.

Sıkıştırma + Beklemede Şifreleme

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.

MinIO'da Sıkıştırmayı Yapılandırma

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.

Çözüm

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ı.