paint-brush
Neden Nesne Deposunun Üstüne Dosya Sistemi Koymamalısınız?ile@minio
6,908 okumalar
6,908 okumalar

Neden Nesne Deposunun Üstüne Dosya Sistemi Koymamalısınız?

ile MinIO7m2023/11/14
Read on Terminal Reader

Çok uzun; Okumak

Büyük kuruluşların derin öğrenme, yapay zeka ve diğer yoğun veri kullanım durumları için veri okyanuslarını depolaması ve bunlara erişmesi gerektiğinde, POSIX bu talepleri karşılayacak yeteneğe veya ölçeklenebilirliğe sahip değildir.
featured image - Neden Nesne Deposunun Üstüne Dosya Sistemi Koymamalısınız?
MinIO HackerNoon profile picture
0-item
1-item

Depolama alanı satın alırken genellikle medyaya ağırlık verilir, ancak erişim yöntemlerini de dikkate almak daha da önemli olabilir. Altyapıyı tasarlarken ve tedarik ederken, özellikle de bulutta yerel nesne depolamaya geçmek için eski depolamayı geride bıraktığınızda depolama protokollerini dikkate almanız gerekecektir. Bununla birlikte, nesne depolama, iletişim için S3 API'ye dayanırken eski iş yükleri, uygulamaların Unix işletim sistemleri arasında taşınabilir olmasına izin vermek için 1980'lerde geliştirilen bir dizi standart sağlayan Taşınabilir İşletim Sistemi Arayüzü POSIX'e dayanır. Muhtemelen çoğu işletmenin POSIX üzerinde çalışacak şekilde geliştirilmiş uygulamaları onlarca yıldır hizmettedir. Muhtemelen mühendisler POSIX'in zayıf performansının zaten farkındadır.


Bununla birlikte, yalnızca belirli bir formatta veya belirli bir kaynaktan veri alabilen eski sistemleriniz varsa, seçenekleriniz sınırlı olabilir ve güncel olmayan bir protokolü uygulamaktan veya kodunuzu yeniden yazmaktan başka seçeneğiniz kalmayabilir. Örneğin, ağ üzerinden erişilen RESTful API'lerle değil, yalnızca dosya sistemiyle yerel bir diskten veri alabiliyorsanız, uygulamanızın kullanabilmesi için önce bu verileri diskte kullanılabilir hale getirmeniz gerekir. Bununla birlikte, bir nesne deposunu dosya sistemi olarak kullanmanın performans, uyumluluk, veri bütünlüğü ve güvenlik açısından bir takım ciddi olumsuz etkileri vardır.


Bunu s3fs-fuse adı verilen küçük bir yardımcı programı kullanarak bazı gerçek dünya testleriyle gösterelim. Bu yardımcı program, bir S3 klasörünü yerel dosya sistemi olarak bağlamanıza olanak tanır. S3 (Basit Depolama Hizmeti) Dosya Sistemi - FUSE (Kullanıcı Alanındaki Dosya Sistemi) anlamına gelir. S3'e dosya sistemi benzeri bir arayüz sunmak için FUSE (Kullanıcı Alanındaki Dosya Sistemi) arayüzünü kullanan açık kaynaklı bir projedir.


Bir S3 klasörü s3fs-fuse kullanılarak monte edildiğinde, paketle sanki yerel bir dosya sistemiymiş gibi etkileşim kurabilirsiniz. Bu, paketinizdeki dosyalarda normal dosya işlemlerini (okuma, yazma, taşıma vb.) kullanabileceğiniz anlamına gelir. Bu kulağa inanılmaz derecede kullanışlı geliyor ve uygulama geliştirmeyi kolaylaştırdığını iddia edebiliriz. Ancak doğası gereği nesne depolama ve dosya sistemleri, dosya sistemi olarak monte edilen s3 klasörünü etkileyecek temel farklılıklara sahiptir.


Nesne depolamasını bir dosya sistemi olarak ele almanın neden optimal olmaktan uzak olduğunun gerçek nedenlerini tartışmak için s3fs-fuse yardımcı programından biraz uzaklaşalım. Sorun s3fs-fuse çok daha büyük ve yerel dosya sistemi API çağrılarını S3 nesne API çağrılarına çeviren bir dosya istemcisi olan Amazon S3 için Rust tabanlı Mountpoint gibi diğer yardımcı programları da içeriyor. İlk neden, tüm bu yardımcı programların dosya sistemi işlemleri için POSIX'e bağlı olmasıdır. POSIX verimsizdir ve hiçbir zaman ağ üzerinden çok büyük dosyalarla çalışmak üzere tasarlanmamıştır.


POSIX tabanlı sistemlerin hızı, onlara olan talep, özellikle de eş zamanlı talep arttıkça azalır. Büyük kuruluşların derin öğrenme, yapay zeka ve diğer yoğun veri kullanım durumları için veri okyanuslarını depolaması ve bunlara erişmesi gerektiğinde, POSIX bu talepleri karşılayacak yeteneğe veya ölçeklenebilirliğe sahip değildir. Tamamen Flash dizileri POSIX'i oyunda tutarken, ölçeklenebilirlik ve RESTful API'ler (bulutun ayırt edici özellikleri) kriptonit gibidir.


Bu nedenle POSIX'i bir nesne deposunun üzerinde çalıştırmak optimalin altındadır. Bunun bazı nedenlerine bir göz atalım:


  1. Performans: POSIX FS arayüzü doğası gereği IOPS merkezlidir. Konuşkandırlar, pahalıdırlar ve ölçeklenmeleri zordur. RESTful S3 API, IOPS'yi bir üretim sorununa dönüştürerek bu sorunu çözer. Verimin ölçeklendirilmesi daha kolay ve daha ucuzdur. Nesne depolamanın büyük ölçekte yüksek performanslı olmasının nedeni budur. POSIX'in S3 üzerinden katmanlanması ölçeklenmeyecektir çünkü POSIX, HTTP RESTful arayüzü üzerinden gerçekleştirilemeyecek kadar konuşkandır.


  2. Anlambilim: Nesne işlemleri atomik ve değişmez olduğundan tutarlılığın doğruluğunu garanti etmenin bir yolu yoktur. Bu, bir çökme durumunda kaydedilmemiş verileri kaybedebileceğiniz veya paylaşılan montajlar durumunda bozulma sorunlarıyla karşılaşabileceğiniz anlamına gelir.


  3. Veri Bütünlüğü : Bir dosyaya yapılan yazmalar veya herhangi bir mutasyon, dosya taahhüt edilene kadar ad alanında görünmez. Bu, paylaşılan montajlar arasında eşzamanlı erişimin değişiklikleri görmeyeceği anlamına gelir. Paylaşılan erişim için kullanışlı değildir.


  4. Erişim Kontrolü: POSIX izinleri ve ACL'ler ilkeldir ve S3 API'nin kimlik ve erişim yönetimi politikalarını yönetme biçimiyle uyumsuzdur. POSIX erişim yönetimini en iyi S3 API'lerinde güvenli bir şekilde uygulamak mümkün değildir.


POSIX ayrıca geliştiricilerin S3'te sevdiği nesne düzeyinde şifreleme, sürüm oluşturma, değişmezlik gibi işlevselliklerin çoğundan da yoksundur; bunların POSIX dünyasında eşdeğeri yoktur ve hiçbir şey bunları tercüme edemez.

POSIX Ağrı Noktaları

Bu örnekler konuyu ve sonuçlarını göstermektedir. Başlamak için yaklaşık 10GB boyutunda ve 112 satırdan oluşan bu CSV dosyasını kullanacağız.


Not: s3fs-fuse zaten kurulu olduğunu ve nesne deposundaki paketlerden birini dosya sisteminize taktığınızı varsayacağız. Değilse, buradaki talimatları izleyin.


Bu örneklerde, paket adının test-bucket olduğunu ve dosya adının taksi-data.csv olduğunu, /home/user/ dizininde olduğunu ve s3fs-fuse bucket /home/user/test-bucket/ dizinine monte edildiğini varsayacağız.

Kopyalama İşlemi

Önce basit bir şey deneyeceğiz ve CSV dosyasını mc komutlarını kullanarak test paketimize kopyalamayı deneyeceğiz ve geçen süreyi kaydedeceğiz

time mc cp /home/user/taxi-data.csv minio/test-bucket/taxi-data.csv


Bu çok fazla zaman almamalı ve dosya paketimize kopyalanmalıdır. Şimdi aynısını s3fs-fuse ile yapmaya çalışalım

time cp /home/user/taxi-data.csv /home/user/test-bucket/taxi-data.csv


Test sırasında geçen süre


 real 1m36.056s user 0m14.507s sys 0m31.891s


Benim durumumda dosyayı yalnızca kısmen kovaya kopyalayabildim ve işlem aşağıdaki hatayla başarısız oldu


 cp: error writing '/home/user/test-bucket/taxi-data.csv': Input/output error cp: failed to close '/home/user/test-bucket/taxi-data.csv': Input/output error


Birçok denemeden sonra başarılı oldu


 real 5m3.661s user 0m0.053s sys 2m35.234s


Gördüğünüz gibi, yardımcı programın yapması gereken API çağrılarının miktarı ve işlemlerin genel yükü nedeniyle, yardımcı program kararsız hale gelir ve çoğu işlem tamamlanamaz bile.

Pandalar Örneği

Size basit bir cp örneği gösterdik, bu ikna edici olabilir veya olmayabilir, çünkü kabul edelim, time cp oldukça basit olduğunu düşünebilirsiniz.


Daha fazla ampirik kanıta ihtiyaç duyanlar için bunu test etmek amacıyla bir Python pasajı yazalım. Hem s3fs-fuse hem de python s3fs paketiyle basit bir Panda örneği yapacağız ve performans etkisini göreceğiz


 import timeit import os import fsspec import s3fs import pandas as pd # Write a dummy CSV file to test-bucket df = pd.DataFrame({"column1": ["new_value1"], "column2": ["new_value2"]}) df.to_csv("s3://test-bucket/data/test-data.csv", index=False) def process_s3(): # add fsspec for pandas to use `s3://` path style and access S3 buckets directly fsspec.config.conf = { "s3": { "key": os.getenv("AWS_ACCESS_KEY_ID", "minioadmin"), "secret": os.getenv("AWS_SECRET_ACCESS_KEY", "minioadmin"), "client_kwargs": { "endpoint_url": os.getenv("S3_ENDPOINT", "https://play.min.io") } } } s3 = s3fs.S3FileSystem() for i in range(100): # Read the existing data print(i) df = pd.read_csv('s3://test-bucket/data/test-data.csv') # Append a new row new_df = pd.concat([df, pd.DataFrame([{"column1": f"value{i}", "column2": f"value{i}"}])], ignore_index=True) # Write the data back to the file new_df.to_csv('s3://test-bucket/data/test-data.csv', index=False) execution_time = timeit.timeit(process_s3, number=1) print(f"Execution time: {execution_time:.2f} seconds")


Test sırasında geçen süre

 Execution time: 8.54 seconds


Şimdi aynısını s3fs-fuse için deneyelim


 import timeit import pandas as pd # Write a dummy CSV file to test-bucket df = pd.DataFrame({"column1": ["new_value1"], "column2": ["new_value2"]}) df.to_csv("s3://test-bucket/data/test-data.csv", index=False) def process_s3fs(): for i in range(100): # Read the existing data print(i) df = pd.read_csv('/home/user/test-bucket/data/test-data.csv') # Append a new row new_df = pd.concat([df, pd.DataFrame([{"column1": f"value{i}", "column2": f"value{i}"}])], ignore_index=True) # Write the data back to the file new_df.to_csv('/home/user/test-bucket/data/test-data.csv', index=False) execution_time = timeit.timeit(process_s3fs, number=1) print(f"Execution time: {execution_time:.2f} seconds")



Test sırasında geçen süre

 Execution time: 9.59 seconds


Bu örnekler S3 dosyalarındaki sürekli okuma ve yazma işlemlerini göstermektedir. Bunun birden fazla istemci tarafından aynı anda gerçekleştirildiğini düşünün; gecikme önemli ölçüde artıyor.

Tepegöz'ü kaldırın!

Gördüğünüz gibi, nesneleri dosya olarak işlemek için POSIX çevirisini kullanmak ile nesnelerle çalışmak için doğrudan API'yi kullanmak arasındaki fark gece ve gündüzdür. Güvenlik, performans, veri bütünlüğü ve uyumluluk söz konusu olduğunda hiçbir karşılaştırma olamaz. MinIO'nun neredeyse tüm popüler programlama dilleriyle entegre edilebilecek SDK'ları vardır ve Kubernetes, yalın donanım Linux, Docker kapsayıcıları ve çok daha fazlası gibi neredeyse tüm platformlarda çalışabilir.


MinIO, veri bütünlüğünü korumak için erişimi düzenlemek ve kodlamayı silmek için PBAC ile birlikte beklemede ve aktarım sırasında şifrelemeyle nesneleri korur . MinIO'yu nerede çalıştırdığınıza bakılmaksızın mümkün olan en iyi performansı elde edeceksiniz çünkü MinIO, mümkün olan en yüksek performansı sağlamak için temel donanımdan yararlanır (bkz . MinIO Kurulumunuz için En İyi Donanımı Seçmek ). MinIO'yu yalnızca 32 kullanıma hazır NVMe SSD düğümüyle GET'lerde 325 GiB/s (349 GB/s) ve PUT'larda 165 GiB/s (177 GB/s) olarak karşılaştırdık .


MinIO'nun ve uygulamanızın ortasında bir dosya sistemi yardımcı programına gerek yoktur! Eski uygulamaların alabileceği herhangi bir avantaj, POSIX'in acısıyla telafi edilecektir.


Başvurunuz için POSIX çevirisini kullanmayla ilgili sorularınız varsa bizimle Slack üzerinden iletişime geçmeyi unutmayın!


Burada da yayınlandı.