S3 bir dosya sistemi değil, dosya depolama teknolojisidir
(calpaterson.com)- Amazon S3, 2006’da ortaya çıkan erken dönem bulut teknolojilerinden biridir; dosya depolamada güçlüdür, ancak Unix dosya API’sinin yerini birebir alan bir dosya sistemi değildir
- Unix dosya API’si,
open,read,write,seek,closegibi dar bir arayüzün arkasında tamponlama, sayfa önbelleği, izinler ve IO zamanlamasını gizleyen bir derin modüle daha yakındır - S3,
GetObjectvePutObjectmerkezli yapısıyla basit görünür; ancakRangeile yalnızca kısmi okuma mümkündür ve kısmi üzerine yazmayı desteklemez - Postgres, SQLite, MySQL, MongoDB ve Elasticsearch gibi veritabanları sayfa düzeyinde üzerine yazmaya dayandığından, SQLite ya da DuckDB dosyalarını olduğu gibi S3’e koyma yaklaşımı küçük veri kümeleri dışında pek uygun değildir
- Yüksek okuma-yazma bant genişliği ve düşük operasyonel yük S3’ün güçlü yanlarıdır; ancak rename/move olmaması, yavaş listeleme, yalnızca XML API’si ve yerel test ortamının bulunmaması gibi kısıtlar da dikkate alınmalıdır
S3 dosya depolar ama dosya sistemi değildir
- S3, 2006’da ortaya çıkan erken dönem bir bulut teknolojisidir ve o dönemde yaygın olan ifadeyle “object store” olarak adlandırılmıştır
- Pratikte yaygın biçimde dosya deposu olarak kullanılır; ancak bunu “Amazon Cloud Filesystem” gibi anlamak yalnızca kısmen doğrudur
- Dosya depolamada iyidir, fakat mevcut dosya sistemlerinin davranışlarını ve beklentilerini birebir karşılayamaz
Unix dosya API’si ve derin modüller
- Unix dosya API’sinin özü şu beş çağrıyla özetlenebilir
open(filepath): dosyayı açarfile.read(size=100): mevcut konumdan okur ve konumu ileri taşırfile.write("hello, world"): mevcut konuma yazar ve konumu ileri taşırfile.seek(94): konumu belirli bir bayta taşırfile.close(): dosyayı kapatır
- Bu çağrılar, gerçek sistem çağrılarının tamamı içinde çekirdeği oluşturur ve dosya okuma-yazma için gerekli asgari işlevlere yakındır
- Dar bir arayüzün arkasında çok fazla işlem gerçekleştiği için Unix dosya API’si bir derin modül (deep module) olarak görülebilir
- Tamponlama ve sayfa önbelleği
- Parçalanma yönetimi
- İzin yönetimi
- IO zamanlaması
- SD kartlardaki wear-levelling gibi özelliklerden de kullanıcının doğrudan ilgilenmesine gerek kalmadan yararlanılır
Sığ modüller ve YAML, ORM
- Sığ modüllerde API yüzeyi, sundukları işleve kıyasla görece büyüktür
- Günümüzde sığ bir modülü tanımaya yarayan ipuçlarından biri, arayüzünün YAML olmasıdır
- YAML bir işaretleme dili gibi görünür, ancak pratikte neredeyse her türlü anlamsallığın üzerine bindirilebildiği yeniden kullanılabilir bir sözdizimi gibi kullanılır
- DevOps alanında YAML çoğu zaman bir “programlama dili” gibi davranır
- Bir YAML mini dili yineleme yapıları sunuyorsa Turing-complete olma ihtimali vardır
- Sığ modüller her zaman kötü değildir
- SQL ORM’ler doğası gereği sızdıran soyutlamalardır ve SQL’i anlamadan kullanmak zordur
- Bazı durumlarda sığ bir modül mümkün olan en iyi biçim olabilir
- Koşullar aynıysa daha derin modül daha iyidir
S3 API’si basittir ama dosya API’sinden farklıdır
- Unix dosya API’si 1970’lerin başında yerleşti; uyumluluk için arayüz korunurken iç uygulama birçok kez değişti
- Amazon S3, Unix dosya sistemi API’sini yeniden uygulamaz
- S3’ün temel işlemleri Unix dosya API’siyle yalnızca kısmen örtüşür
GetObject(Bucket, Key, Range=None): nesnenin tamamını veya bir bölümünü okurPutObject(Bucket, Key): nesnenin tamamını yazar
- Bucket gibi ek bir kavram olsa da işlev/arayüz oranına bakıldığında S3’ün Unix dosya API’sinden daha basit olduğu söylenebilir
- Belirleyici fark kısmi üzerine yazmanın olmamasıdır
GetObject’tekiRangeargümanıyla nesnenin bir bölümünü okumak mümkündür- Nesnenin yalnızca bir bölümünün üzerine yazmak mümkün değildir
- Üzerine yazma, dosyanın tamamı düzeyinde yapılmalıdır
- Bu fark nedeniyle S3, mevcut dosya kullanım senaryolarının yalnızca bir kısmına iyi uyar
Veritabanlarını S3’e olduğu gibi taşımak zordur
- Birçok veritabanı verilerini dosya sistemi üzerindeki dosyalarda saklar
- Postgres, her tablo için 2-3 dosya ve çeşitli yönetim dosyaları tutar
- SQLite’ın tüm verileri tek bir dosyada saklamasıyla bilinir
- MySQL, MongoDB ve Elasticsearch de verileri dosyalarda saklar
- Sorun, veritabanlarının genel olarak sayfa düzeyinde kısmi üzerine yazmaya dayanmasıdır
- Veriler genellikle 4KB veya 8KB gibi sayfalar halinde saklanır
- Bir heap dosyasının içinde binlerce sayfa bulunabilir
- Gerekli verileri saklamak için sayfaların kısmen üzerine yazılır
- SQLite veritabanını S3’e koyarsanız her yazmada tüm veritabanı dosyasını yeniden yazmanız gerekir
- S3 büyük yazmaları hızlı işleyebilir; ancak en küçük veri kümeleri dışında her seferinde tüm dosyanın üzerine yazma stratejisini kaldırmak zordur
- Veritabanı dosyasını her seferinde yeniden yazmak, veritabanı geliştiricisinin inşa ettiği işlem bütünlüğünden yararlanmayı da zorlaştırır
- S3’te son yazan kazanır
S3’ün iyi ve kötü yaptığı şeyler
- S3’ün güçlü yanı, okuma ve yazma bant genişliğinin çok yüksek olmasıdır
- İnternette S3’e saniyede 10GB’den fazla yazma veya S3’ten okuma örneklerini bulmak zor değildir
- S3 yazma işleriyle finans sektöründen bir müşterinin ofis ağını doyuma ulaştırdığım bir deneyim de oldu
- Kısmi üzerine yazmanın olmamasına ek olarak, dosya sistemlerinden farklı başka kısıtlar da vardır
- S3’te rename veya move işlemi yoktur
- Ad değiştirme
CopyObjectardındanDeleteObjectile yapılır CopyObject, dosya boyutuyla orantılı doğrusal zaman alır- Çok sayıda dosyayı yanlış konuma yazdıktan sonra geri almak çok yavaştır
- Ad değiştirme
- Dosya listeleme yavaştır
- Okuma-yazma bant genişliği çok yüksek olsa da saklanan öğeleri listeleme işlemi çok daha yavaştır
- Yavaş bir yerel dosya sisteminden bile daha yavaş olabilir
- Buna karşılık operasyonel yükü dosya sistemlerinden daha düşüktür
- Yalnızca bucket ve key adlarını belirtirsiniz; geri kalanını bulut halleder
- Yedekleme, offsite replikasyon ve provizyonlama gibi tekrarlı işlerin yükünü azaltır
- Provizyonlama yalnızca kapasite için değil, IO işlemleri için de geçerlidir
Kurumlar arası arayüzlerde derin modüller daha önemlidir
- S3’ün ilk popüler bulut API’si olması, derin API’lerin avantajıyla bağlantılıdır
- Derin API’ler, tek bir sistem içindeki modüller arası karmaşıklığı gizlemede yararlıdır; iki şirket arasındaki etkileşim gibi maliyeti yüksek ilişkilerde ise daha da önemlidir
- Şirketler arasında bilgisayar sistemlerini bağlama işi geleneksel olarak integration olarak adlandırılmış ve adeta acının eş anlamlısı gibi görülmüştür
- SAP gibi büyük kurumsal yazılımlar derin modül değildir
- Kurumun neredeyse tamamının SAP’yi anlaması gerekir
- Mevcut iş yapma biçimleriyle sürekli uyumlanması gerekir
- SAP entegrasyon projeleri pahalı ve devasa olur; başarısızlık örnekleri de tekrarlanır
- S3’ün iç karmaşıklığı SAP kurulumundan çok daha az değildir
- Amazon, S3’e “Simple Storage Service” adını verdi; ancak gerçek S3 karmaşıklığı büyüktür
- Kuyruk teorisi, IO çekişmesi, sharding ve dosya sistemlerinin ele aldığı birçok sorunu içerir
- S3’teki “simple”, gerçek basitlikten çok derin arayüze yakındır
S3’e uyan istisnalar ve kalan kısıtlar
- Bu, S3’ün kullanım senaryosuna göre pahalı olabileceği sorununu dışlamaz
- Derin modül ve sığ modül kavramları John Ousterhout’un A Philosophy of Software Design kitabından gelir
- S3 API’sini depolama katmanı olarak kullanmak üzere baştan tasarlanmış veritabanları da vardır
- Snowflake buna bir örnektir
- Ancak bu şeffaf bir taşıma değil, başlangıçta alınması gereken bir tasarım kararıdır
- Snowflake, en azından 2016’ya kadar bu kararı çok erken almış bir örnekti
- S3’te zorlananlar yalnızca veritabanları değildir
- Birçok dosya biçimi ucuz
seekvarsayar - Zip dosyaları, S3’e kıyasla diskte daha iyi performans gösteren başlıca örneklerdendir
- Birçok dosya biçimi ucuz
S3’te eksik bulunan noktalar
- S3 API’si yalnızca XML’dir
- JSON 2006’da da vardı, ancak o dönemde XML baskındı
- Amazon’un SOAP’tan REST’e geçerken JSON sürümü çıkarmamış olması üzücü
- Amazon, XSD schema bakımını da durdurdu
- XML API’nin temel avantajlarından biri şemadır; ancak bugün standart belge web sitesidir
- Amazon yerel bir test ortamı sağlamaz
- Python’da özenli testler için moto kütüphanesi kullanılabiliyor
- moto, ticari bir hizmeti test etmeye yarayan bir araç olmasına rağmen gönüllüler tarafından sürdürülüyor
- Amazon S3 checksum destekler, ancak varsayılan olarak açık değildir
- Amazon dayanıklılık konusunda çeşitli iddialarda bulunur
- Gerçek bir sorun yaşandığına dair bir şey duymadım; ancak bu iddiaların test edildiği bir örnek de görmedim
- Geçmişte S3’te eventual consistency tuzağı vardı
- Bir dosyayı okuyup üzerine yazdıktan sonra tekrar okuduğunuzda hâlâ değişmemiş içeriği görebiliyordunuz
- Kısa süreliğine ara sıra yaşanır ve kafa karışıklığı yaratırdı
- Diğer S3 uygulamaları bu özelliği kopyalamadı; Amazon da birkaç yıl önce strong read-after-write consistency ile bunu düzeltti
1 yorum
Hacker News yorumları
S3 dayanıklılığı abartı gibi görünse de güvenilir ve geleneksel dosya sistemleriyle karşılaştırılması zor görünüyor
Fark yalnızca yazılımda değil, fiziksel altyapı ve güvenlik kültürünü de kapsıyor; AWS’in erişilebilirlik alanı izolasyonu diğer bulutlardan daha iyi gibi geliyor
S3’te çalışırken GCP Blob Storage ile çok fiyat karşılaştırmasına maruz kaldım, ancak Google verileri aynı binaya ya da aynı binanın farklı bir odasına koyabiliyordu; bu yüzden AWS tarzı ayrıştırmayla adil bir karşılaştırma değildi
Tüm organizasyon veri bütünlüğüne aşırı takıntılıydı, her şeye checksum ekliyordu ve doğal afetler gibi büyük olaylara da hazırlanıyordu
S3 ölçeğinde, gama ışınlarının sabit disk plakalarına çarpmasıyla oluşan rastgele bit ters dönmeleri gibi bit rot bile tespit edilebiliyordu; disk üreticisine ve üretim dönemine göre arıza oranları bile ölçülerek belirli bir parti bozulsa da veri kaybı olasılığı azaltılıyordu
Önemli verileri başka yerde tutmayacağımı söyleyecek kadar güveniyorum; S3 yerleştirme sistemini de bizzat geliştirdim
Bu açıklama, Cinnabon’un hamurunu kendi yaptığı için övülmesi gibi geliyor; bahsedilen şeyler bir depolama şirketinin genelde yaptığı işler
Her şeye checksum eklemek pek çok dosya sisteminin temel özelliği; ev bilgisayarında bile bit rot tespit edilip uyarı alınabiliyorsa büyük depolama sağlayıcıları bunu elbette yapar
Disk üreticisine göre arıza oranlarını izlemek de yaygın; depolama şirketleri raporlar bile yayımlar, 6 kişilik bir BT ekibinde bile bunu elektronik tablolarla yönetiyorduk
AWS dışında da, AWS ortaya çıkmadan çok önce depolama alanında çalışan birçok akıllı insan vardı
rsync.net’in coğrafi yedekli hesapları, örneğin Fremont’taki birincil depolama ile Denver’daki ikincil depolama gibi farklı eyaletlerde veya ülkelerde bulunur
S3’ün ölçeği sayesinde bit rot tespit edebildiği iddiası da doğru değil; kişisel bir sunucuda ZFS çalıştırınca da küçük ölçekte bit rot gayet iyi tespit edilir
[1] he.net merkezi
Bu tür bozulma olayları yeterince çoksa, tekil veri bloklarını başka makinelere taşıyarak sistemi “iyileştirmek” için bir sinyal olarak da kullanılabilir
Genel olarak bahsedilenler depolama sistemlerinde oldukça tipik işler; S3’e özgü değil
Google Cloud Storage belgelerine göre veriler birden çok bölgeye kopyalanır ve her bölge farklı kümelere eşlenir
https://cloud.google.com/compute/docs/regions-zones/zone-vir...
S3’ün dayanıklılığını, bütünlüğünü ve tutarlılığını Jepsen kadar sıkı biçimde doğrulamış tarafsız bir üçüncü taraf var mı merak ediyorum
Birileri S3 uyumlu bulut depolama hizmetlerini titizlikle karşılaştırsa korkutucu ve büyük sorunlar ortaya çıkabilir; belki böyle bir karşılaştırma zaten vardır
S3’te gerçekten faydalı olanın okuma/yazma hızından çok listeleme olduğunu düşünüyorum
Sürümsüz bucket’larda ya da silme işaretçisi olmayan bucket’larda belirli bir önekle listeleme pratikte sabit zamanlı gibi çalışır; 100 milyar nesneli bir bucket’ta bile rastgele bir dizgeden sonra gelen alfabetik sıradaki 1000 anahtar istenebilir
Ayraç olarak
/kullanmak sadece varsayılandır; herhangi bir karakter kullanılarak ortak önek kümeleri alınabilir ve dizinler gerçekte var olmaz, yalnızca gerektiğinde yaratılmış gibi görünürBu özellik sayesinde performans kaygısı olmadan verileri gerekli tanımlayıcılara göre birden fazla şekilde bölebilirsiniz
Eğer listeleme sadece yavaş olsaydı, dosya önekine göre sorgulama yapılamasaydı ve anahtar sayısıyla orantılı olarak yavaşlayan geleneksel bir Unix dosya sistemi gibi davransaydı S3 hiç kullanışlı olmazdı
Bir önekin önündeki ve arkasındaki anahtarları çekebilme becerisi, 1970’lerden beri var olan veritabanı indekslerinin temel özelliği; bu yüzden özellikle etkileyici değil
Kullanım senaryoları farklı olabilir ama bucket listelemenin yavaşlığı yüzünden engellendiğim çok oldu; bucket biraz büyüdüğünde bile anahtarları listelemek, okumaktan daha uzun sürüyor
Hatırladığım kadarıyla listeleme 1 Mbps’nin altında bir seviyedeydi, ancak şu anda test edebileceğim büyük bir bucket yok
dir1/a/000000iledir1/a/999999arasında öğeler vedir1/bvarken, gerçek hiyerarşik bir dosya sistemindels dir1/yalnızca"a"ve"b"adlı iki öğeyi dolaşıp döndürmekle yetinirBuna karşılık ayraç işlemesi olmayan düz dizge indeksli bir anahtar-değer deposu,
"b"ye ulaşmadan önce"a/00000"ile"a/999999"arasındaki 1 milyon dizin girdisinin üzerinden geçmek zorundadırBu yüzden basit düz hiyerarşide bir dizinin içeriğini listelemek gerçek bir dosya sistemindeki
O(doğrudan çocuk)değil,O(tüm özyinelemeli çocuklar)olur ve çok daha yavaştırAncak listeleme algoritmasına
/gibi bir ayraç karakteri bildirilirse, sözlüksel önek ağacı bir sonraki/noktasında alt ağacı verimli şekilde atlayabilirAmazon S3 belgeleri de
CommonPrefixesalanının daha derin seviyelerde iç içe geçmiş milyonlarca anahtarı atlayıp özetlediğini açıkça belirtirhttps://docs.aws.amazon.com/AmazonS3/latest/userguide/using-...
Gerçek uygulamanın gerçekten dolaşmayı azaltıp azaltmadığını, yoksa dolaştıktan sonra yalnızca sonucu mu küçülttüğünü test etmedim; ama azaltmasını umarım
Bu nedenle öğe sayısıyla orantılı olarak yavaşlamazlar; dosya önekine göre listeleme de çok hızlıdır
Önekle listelemeyi temel özellik olarak görmek tuhaf hissettiriyor
Tek bir ağ çağrısıyla 1000 anahtar almak, arka uçtaki karmaşıklık hakkında hiçbir garanti vermez
Yakın zamanda S3 varlık yönetimi betiği üzerinde çalışırken listeleme hızına şaşırdım
Bir iş arkadaşım dosya listesi önbelleğine ihtiyaç olduğunu söyleyip önceden doldurulmuş bir önbellek gönderdi; başta bunun gerçekten gerekli olamayacağını düşündüm ama kendim kontrol edince durumun farklı olduğunu gördüm
Tekil varlıklar için yaklaşık 100 bin kök dizin var; her birinde 5-6 dizin ve az sayıda dosya bulunuyor, toplam dosya sayısı muhtemelen 1 milyonun altında ve derinlik en fazla 3 seviye civarında
Bu dosyaları özyinelemeli olarak listelemek kelimenin tam anlamıyla 15 dakika sürdü
Stack Overflow ve ChatGPT’nin hız artırma önerilerinden çeşitli şeyler denedim ama anlamlı bir sonuç alamadım; bunun neden bu kadar yavaş olduğunu anlamıyorum
Amazon’un bunu neden düzeltmediğini bilmiyorum; dışarıdan bakınca tekil bucket’lara birkaç B-tree eklemek yeterli olacakmış gibi görünüyor
Eğer zor bir problemse nedenini duymak ilginç olur
Nesneleri “dizin” gibi görebilmek yalnızca bir önek filtresinden ibarettir; bu bir dosya sistemi değildir ve dizin kavramı da yoktur
S3’te nesneleri en hızlı listeleme yönteminde özyinelemeye hiç gerek yoktur; yalnızca bir önek altındaki tüm nesneleri listelemek yeterlidir
Yol ayırıcı kullanıp S3 anahtarlarını klasör yapısı gibi göstererek “klasör klasör” dolaşırsanız çok daha yavaş olur
ListObjectsV2çağrılırkendelimitergeçirilmemeli; ayırıcı özelliği kullanılmazsa “dizinler” ve “seviyeler” performansı etkilemezİstenen toplam süreye ulaşmak için tek bir listeleme işini birden çok önek için paralel listeleme işlemlerine bölmek gerekir
İçinde nesne olan bir bucket silinemez ve S3’e tek seferde tüm nesneleri silmesini de söyleyemezsiniz
Her nesne için ayrı silme API isteği göndermeniz gerekir; bunun için de nesneleri 1000’er 1000’er listeleyen istekler göndermeniz gerekir ve bu listeleme çağrıları hem zaman alır hem de maliyetlidir
Durumu şu yazı iyi özetliyor: https://cloudcasts.io/article/deleting-an-s3-bucket-costs-mo...
Bir S3 bucket’ını hızla ortadan kaldırmanın en hızlı yolu, sonunda o bucket’ın ait olduğu AWS hesabını silmektir
Tek bir istekte 10 bin nesne listeleyebilirsiniz ve sonraki 10 bin nesneyi almak için önceki isteğin sonucuna ihtiyaç vardır; yani her şey seridir
1 milyon dosyayı listelemek için ardışık 100 istek gerekir; gidiş-dönüş süresi yalnızca 50 ms olsa bile sadece gidiş-dönüşler 5 saniye eder, düz bir yinelemede listenin kendisini oluşturma maliyeti ayrıca vardır
10 bin öğelik listeleme maliyeti yazma maliyetine yakındır ve bu başlı başına epey yavaştır; ayrıca her listelemenin güçlü tutarlılığa sahip bir snapshot olması da muhtemeldir, bu da ek maliyet getirir
B-tree’ler, dizin gezintisi yapmıyorsanız pek yardımcı olacak gibi görünmüyor; o durumda bile darboğazın ağ işlemleri ve dışarıya açılmış API olması muhtemeldir
Sonuçta dosya listesi sorgulamak o kadar önemli bir kullanım senaryosu değildir; genelde nesne yaşam döngüsü gibi özelliklerle istenen iş S3’e bırakılır ve iç dosya sistemi katmanında verimli biçimde işlenmesi sağlanır
Hepsi nesnedir; web arayüzü yalnızca eğik çizgiyle ayrılmış önekleri daha hoş görünecek şekilde sunar
Her nesnenin bir anahtarı vardır ve bu anahtarın içinde eğik çizgi bulunabilir; isterseniz her bölümü dizin olarak düşünerek rahat edebilirsiniz
Ama normalde dizinler üzerinde yaptığınız işlemleri denemeye kalktığınızda bu yanılsama bozulur
S3’ü yapanlar bunun bir dosya sistemi olmadığını biliyordu; nesne deposu adı da yazıda işaret edilen farkları açıklamaya çalışan bir ifadeydi diye düşünüyorum
“Nesnelerin popüler olması”, yürütülebilir kod ile yerel durumu birleştiren yazılım bileşeni anlamındaki nesnelerle ilgilidir; ancak S3’ün ilk örnekleri “canlı nesneyi serileştirip başka bir süreçte deserileştirmek” gibi şeyler değildi
Örneklerin tamamı web sitesi statik varlıkları türündeydi ve o dönemde veritabanı tarafında da “binary large object” veya “blob” terimlerinde nesne anlamı kullanılıyordu
S3, veritabanına koyması zor olan şeyleri saklanan bir yer olmaya daha yakındı; ilk tasarlandığında hedeflenen çıkış kullanım senaryoları içerik indeksinin başka bir yerde olduğunu varsaydığı için listelemenin yavaş olması da tam olarak bu niteliği açıklar
https://en.wikipedia.org/wiki/Object_storage
GCP’nin açıklamasına göre nesne deposu, yapılandırılmamış verileri nesne birimlerine ayırıp yapısal olarak düz bir veri ortamında saklayan bir mimaridir
https://cloud.google.com/learn/what-is-object-storage
Yani yapılandırılmamış veri, düz yapı ve tüm öğe bazında çalışan okuma-yazma işlemleri esastır
S3 ne bir dosyadır ne de hele hele bir dosya sistemi
Dosya soyutlamasından beklenen şey değiştirilebilirliktir; dosyanın bir kısmını düzenleyebilmeli, büyütebilmeli, küçültebilmeli, rastgele ofsetlerden okuyup yazabilmelisiniz.
Bir dosyayı elinize aldıktan sonra tekrar köke ya da üst bir kavrama dönmeniz gerekmemelidir; oysa S3 yalnızca değiştirilebilir bir liste üzerinde değiştirilemez nesneler sunar ve bir şeyi değiştirmek için kopyalayıp yeniden yüklemeniz gerekir.
Asıl dosya soyutlaması, diskteki sektörleri bulup bunları istemciye kesintisiz bir tampon gibi göstermektir; S3 ise başka bir problemi çözer.
Birçok kişi UNIX’in “her şey dosyadır” şeklindeki iyi fikrini, her şeyin kesintisiz bir sanal tampon gibi görünmesi gerektiği anlamına gelecek şekilde yanlış anlıyor.
Asıl önemli nokta, ister dosya olsun ister sistemin süreçlere göstermek istediği başka bir nesne olsun, temel yaprak düğümlerin bulunması; dizinler dâhil her şeyin dizinlerde listelenebilmesi ve özyinelemeli bir ağaç yapısının olmasıdır.
Bir dosya sistemini oluşturan şey, belirli bir yaprak düğümün türü değil dizinlerdir.
Soket ya da framebuffer gibi yeni yaprak türleri eklemek neredeyse önemsizdir ve bu fikre zarar vermez; ancak liste gibi başka türde kapsayıcılar eklemek dosya sistemi yapısını karmaşıklaştırır ve kavramsal tutarlılığı bozar.
S3 bunları yapmaz ama bu sorun değil.
Veritabanına uymayan şeyleri oraya koyup bakmadığınız süre boyunca bit rot oluşmamasını umarsınız sadece.
S3’ü dosya sistemi gibi yapma isteğinin, müşterilerin S3’ün iyi yaptığı işi yanlış anlamasından ve ürün yönetiminin bu yanlış anlamayı engellemek yerine kabul etmesinden kaynaklandığını düşünüyorum.
Daha uygun benzetme blok depolama aygıtıdır; ancak blok boyutunun keyfi olduğu ve anahtar eklenebildiği çok tuhaf bir blok aygıtına daha yakındır.
Dosya sistemi, blok depolama aygıtı üzerine yerleşen bir soyutlama olduğundan, “S3 dosya sistemi” de S3’ü temel blok deposu gibi kullanıp onun üzerinde yer alan bir soyutlama olmalıdır.
Dosya sistemi, blok aygıtı üzerine kurulmuş bir soyutlamadır.
Blok aygıtı devasa bir bayt dizisi sunar ve örneğin “273041 konumuna şu 300 baytı yaz” gibi blok düzeyinde okuma/yazma yapmanıza olanak tanır.
Blok aygıtının kendisi de gerçek donanım üzerine kurulmuş bir soyutlamadır; dolayısıyla “şu 300 baytı yaz” demek, gerçekte “2 numaralı platter’daki kafayı 6 numaralı konuma hareket ettir” gibi işlemlere dönüşür.
S3, ham depolama üzerine kurulmuş başka bir soyutlamadan ibarettir ve katı biçimde düz bir anahtar-nesne deposudur.
Dosya sistemi özelliklerine ihtiyacınız varsa bunları uygulamada hayata geçirirsiniz ya da bir dosya sistemi kullanırsınız.
Yalnızca ekleme gerekiyorsa, ekleme zincirini bir veritabanıyla izleyip parçaları S3’te saklayabilirsiniz; uymuyorsa başka bir şey kullanırsınız.
Kopyalama gerekiyorsa, veritabanında aynı nesneye yeni bir referans oluşturabilirsiniz; uymuyorsa başka bir şey kullanırsınız.
S3 birçok kişiye iyi uyuyor, bu yüzden onu başka bir şeye dönüştürmeye çalışmamak gerekir.
Yerleşik alan terimlerinin anlamını değiştirmeye çalışmayı da bırakmak gerekir; dosya sistemi ders kitaplarında açıklanan bir kavramdır ve S3 hiçbir zaman dosya sistemi olduğunu iddia etmemiştir.
İşletim sistemi tasarımı hakkında biraz çalışmak da gerçekten faydalı ve eğlencelidir.
Apache Arrow’un
object_store’u ile Apache OpenDAL API’sini karşılaştıran bir tartışma https://github.com/apache/arrow-rs/issues/3888 adresinde yapılmıştı.Apache OpenDAL, S3 ve çeşitli bulut depolama hizmetleri dâhil olmak üzere birçok backend üzerinde dosya sistemi benzeri bir API sağlayan bir kütüphanedir.
GreptimeDB ve Databend gibi bazı veritabanı sistemleri, bulut depolamadaki verilere erişmek için OpenDAL’ı daha iyi bir S3 SDK’sı gibi kullanır.
S3 üzerinde dosya sistemi benzeri bir arayüz yönetmeye yönelik başka çözümler olarak Alluxio ve JuiceFS de var; ancak Apache OpenDAL’ın aksine ayrı dağıtım ve kendilerine ait dahili metadata servisi gerektirirler.
S3’ten söz ederken Backblaze B2’den de bahsetmeye değer.
Fiyatı S3’ten 3 kat düşük olduğu için çok hoşuma gidiyor; Backblaze ile bir bağım yok.
Her hafta PST 11:30-13:30 arasında 2 saatlik bir bakım penceresi bulunur; genelde kesinti olmaz ama bazen ABD mesai saatlerinin tam ortasında tüm hizmeti etkileyen arızalar da yaşanır.
Hata oranı kullanılamaz seviyeye çıktığında destek talebi açmamız gerekti; son birkaç yılda kabaca yılda bir kez bunu yaşadık.
Destek ekibi, kendi taraflarında hata günlükleri ya da görünürlük yokmuş gibi sayısız soru soruyor ve sorunu gerçekten incelemiyor.
Yüklemenin başarılı olduğu yanıtını verip gerçekte B2 sisteminde 0 bayt olarak saklanan sahte başarı durumları da var; bu yüzden başarı kodlarında bile yüklemeyi mutlaka doğrulamak gerekir.
Log4j2 CVE’si gibi yüksek önem dereceli açıklar çıktığında, 10 saatlik kesinti gibi uzun arızalar da yaşanabilir.
Fiyatı mükemmel, ancak daha olgun bulut depolama servisleriyle doğrudan karşılaştırılabilecek bir ürün değil.
Yine de iki katmanlı harici yedeklemeyle bunun bir ölçüde telafi edilebileceğini düşünüyorum.
Kendini multicloud çözümü diye pazarlayıp NAT gateway ve IPv4 ücretlerinin her yerde eklendiği bir durumda benimsenebilirliğini fiilen ortadan kaldırması şaşırtıcı.
Okumanın çok, yazmanın az olduğu bir kullanımımız vardı; B2 bant genişliği ücretlerini ödesek bile tasarruf edebiliyorduk, ancak NAT64 gateway’den geçmek ya da B2’ye erişmek için saatlik ücret ödemek gerekirse durum böyle olmuyor.
Güzel bir yazı; bulut depolamayı rclone mount ile FUSE üzerinden bağlama yolculuğuna başlamadan önce okumuş olsaydım faydalı olurdu
Birçok yinelemeden sonra rclone’da S3, Google Cloud Storage, Azure Blob, OpenStack Swift, Oracle Object Storage gibi depolamaları POSIX’e benzeyen bir dosya sistemi katmanına uyduran bir VFS katmanı oluştu; asıl
rclone mountkodu da bunun üzerinde ince bir katmanVFS katmanının çeşitli uyumluluk seviyeleri var;
offdüzeyinde yalnızca dizin önbelleklemesi yapıyorBu modda, yazıda söylendiği gibi aynı dosyayı aynı anda okuyup yazamazsınız, dosyanın ortasına yazamazsınız ve dosyalar yalnızca sıralı olarak yazılabilir
Şaşırtıcı biçimde, bu kısıtlarla bile epey çok şey düzgün çalışıyor
Bir sonraki seviye olan
writes, aynı dosyayı aynı anda okuma-yazma, dosyanın ortasına yazma gibi uygulamaların istediği POSIX özelliklerinin çoğunu destekliyor; ancak dosyanın yerel bir kopyasını oluşturma ve dosya kapatıldığında bunu asenkron olarak yükleme maliyeti getiriyorVFS önbellekleme modu dokümantasyonu, yazıdaki kısıtları iyi yansıtıyor: https://rclone.org/commands/rclone_mount/#vfs-file-caching
Temelde S3’te gerçek dizinler de yok; bu yüzden içinde dosya olmayan bir dizininiz olamıyor ve dizinlerin değişiklik zamanı gibi geçerli metaverileri de bulunmuyor
/ile biten 0 baytlık dosyalar olan dizin işaretçileri oluşturabilirsiniz; rclone dahil birçok araç bunu destekliyorBoş dizinlerin olmaması genelde büyük sorun değil; çünkü VFS katmanı bunları sahte olarak oluşturuyor ve çoğu uygulama kısa süre sonra içine bir şey yazıyor
Sonuçta S3 gibi görünen bir şeyi POSIX dosya sistemi gibi göstermek oldukça fazla iş ve açık bir dosyanın adını değiştirme gibi davranışların ve zorlu uç durumların arkasında çok sayıda hile var
rclone’un düşük seviyeli
move/sync/copykomutları bu tür işlemler yapmıyor ve S3 API’sini neredeyse olduğu gibi kullanıyorS3 API’sinde bir şeyi değiştirebilseydim, listeleme sırasında metaveriyi de okuyan bir seçenek olmasını isterdim
rclone dosya değişiklik zamanını nesne metaverisinde saklıyor, ancak bunu toplu olarak okumanın bir yolu olmadığı için her nesne için
HEADyapmak gerekiyorYa da yükleme sırasında nesnenin
Last-Modifieddeğerini ayarlayabilmek de iyi olurduAnahtar uzunluğu sınırı 1024 olduğu için saklanabilecek metaveri miktarı sınırlı, ama dosya yolunu hesaba katsanız bile oldukça geniş
Normalize edilmiş bir yolda geçersiz olan
//gibi bir ayırıcı kullanıp/path/to/file.txt//mtime=1710066090şeklinde koyabilirsinizYine önekle “dizini” alabilir,
//değerini önek gibi kullanarak dosyayı doğrudan getirebilirsinizAncak böyle bir biçim diğer yazılımlarla uyumluluğu ciddi biçimde bozacak gibi görünüyor
MinIO’da, uygun yetkiler olduğunda listelemeye metaveri ve etiketleri dahil eden
metadata=trueadlı “gizli” bir parametre ekledilerBir genişletme olduğu için güvenilir biçimde kullanılabilecek bir şey değil, ama rclone her zaman deneyip mümkünse kullanabilir
/ile biten 0 baytlık dosyalar da mümkün, ancak listelemedeki paylaşılan öneklerin kendisini dizin olarak da görebilirsinizO zaman dizinlerin durumu olmaz ve içinde nesne yoksa var olamaz; bunun da artıları ve eksileri var
Yükleme sırasında
Last-Modifiedayarlanabilseydi istemci kısıtları azalırdı, ama sunucu zamanının referans alınmasının da bir avantajı varİstemci tarafı çoğaltma veya yansıtma işlemlerinde de aynı kısıtlarla başa çıkmak gerekiyor
Kişisel olarak en büyük şikayetim, tek bir nesnenin sürüm bilgilerini döndüren bir
HeadObjectVersionsolmamasıListObjectVersions, verilen önekin gerçekten bir önek mi yoksa nesne anahtarı mı olduğunu bilemediği için her zaman küme çapında bir işlem olmak zorunda kalıyorAWS yakın zamanda
GetObjectAttributesekledi, ancak ona çok yakışacak sürüm bilgisi bunun içine konmadıS3’teki “Simple”, “derin değil” anlamına değil, gereksinimleri karşılamak için en az sayıda parçaya ihtiyaç duyduğu anlamına geliyor
Dağıtık, merkezi, çoğaltmalı, yüksek erişilebilirlikli, yüksek dayanıklılıklı, yüksek bant genişlikli, düşük gecikmeli, güçlü tutarlılığa sahip, senkron, ölçeklenebilir bir nesne depolamaya ve üstüne HTTP REST API’ye ihtiyacınız varsa, bunu S3’ten daha basit yapmanın zor olduğunu düşünüyorum
AWS S3’e uzun süre içinde birçok özellik eklendi, ancak temel davranış aynı kaldı
Ousterhout’un 『A Philosophy of Software Design』 kitabının ölçütlerine göre basitlik karmaşık olmamak demek; Rich Hickey’nin “Simple Made Easy” konuşması da aynı bağlamda
Buna karşılık “derin”, küçük bir arayüzle içeride karmaşık pek çok işlev sunmak anlamına geliyor; bu yüzden S3 için “basit”ten çok bu ifade daha uygun
Bu, S3’te pek bir şey olmadığı anlamındaki basitlikten farklı
https://www.infoq.com/presentations/Simple-Made-Easy/