S3 adalah Teknologi Penyimpanan Berkas, Bukan Sistem Berkas
(calpaterson.com)- Amazon S3 adalah teknologi cloud awal yang muncul pada 2006; kuat untuk penyimpanan berkas, tetapi bukan sistem berkas yang menggantikan Unix file API secara langsung
- Unix file API lebih mirip modul dalam yang menyembunyikan buffering, page cache, izin, dan penjadwalan IO di balik antarmuka sempit seperti
open,read,write,seek,close - S3 terlihat sederhana dengan fokus pada
GetObjectdanPutObject, tetapi hanya memungkinkan pembacaan sebagian melaluiRangedan tidak mendukung penimpaan sebagian - Database seperti Postgres, SQLite, MySQL, MongoDB, dan Elasticsearch bergantung pada penimpaan per halaman, sehingga pendekatan mengunggah berkas SQLite atau DuckDB apa adanya ke S3 sulit cocok kecuali untuk dataset kecil
- Bandwidth baca-tulis yang tinggi dan beban operasional yang rendah adalah keunggulan S3, tetapi batasan seperti tidak adanya rename/move, listing yang lambat, API khusus XML, dan tidak adanya lingkungan pengujian lokal juga perlu dipertimbangkan
S3 menyimpan berkas, tetapi bukan sistem berkas
- S3 adalah teknologi cloud awal yang muncul pada 2006, dan sesuai istilah yang populer saat itu, disebut “object store”
- Dalam praktiknya S3 banyak digunakan sebagai penyimpanan berkas, tetapi memahaminya seperti “Amazon Cloud Filesystem” hanya sebagian benar
- S3 memang bagus untuk menyimpan berkas, tetapi tidak bisa menggantikan perilaku dan ekspektasi sistem berkas tradisional secara langsung
Unix file API dan modul dalam
- Inti Unix file API dapat diringkas menjadi lima panggilan berikut
open(filepath): membuka berkasfile.read(size=100): membaca dari posisi saat ini dan memajukan posisifile.write("hello, world"): menulis di posisi saat ini dan memajukan posisifile.seek(94): memindahkan posisi ke byte tertentufile.close(): menutup berkas
- Panggilan-panggilan ini merupakan inti dari seluruh system call yang sebenarnya, dan mendekati fungsi minimum yang diperlukan untuk membaca dan menulis berkas
- Karena banyak pemrosesan terjadi di balik antarmuka yang sempit, Unix file API dapat dilihat sebagai modul dalam (deep module)
- Buffering dan page cache
- Penanganan fragmentasi
- Manajemen izin
- Penjadwalan IO
- Bahkan fitur seperti wear-levelling pada kartu SD memberi manfaat tanpa pengguna harus memikirkannya langsung
Modul dangkal dan YAML, ORM
- Modul dangkal memiliki permukaan API yang relatif besar dibanding fungsi yang ditanganinya
- Salah satu petunjuk untuk mengenali modul dangkal saat ini adalah ketika antarmukanya berupa YAML
- YAML terlihat seperti bahasa markup, tetapi dalam praktiknya digunakan seperti sintaks yang dapat dipakai ulang untuk menambahkan hampir segala jenis semantik
- Di ranah DevOps, YAML sering berperilaku seperti “bahasa pemrograman”
- Jika mini-language YAML menyediakan struktur perulangan, ada kemungkinan ia Turing-complete
- Modul dangkal tidak selalu buruk
- SQL ORM pada dasarnya adalah abstraksi yang bocor dan sulit digunakan tanpa memahami SQL
- Dalam beberapa kasus, modul dangkal bisa menjadi bentuk terbaik yang mungkin
- Dengan kondisi yang sama, modul yang lebih dalam lebih baik
API S3 sederhana, tetapi berbeda dari file API
- Unix file API terbentuk pada awal 1970-an, dan demi kompatibilitas antarmukanya tetap dipertahankan sementara implementasi internalnya berkali-kali berubah
- Amazon S3 tidak mengimplementasikan ulang API sistem berkas Unix
- Operasi dasar S3 hanya sebagian berpadanan dengan Unix file API
GetObject(Bucket, Key, Range=None): membaca seluruh atau sebagian objekPutObject(Bucket, Key): menulis seluruh objek
- Ada konsep tambahan bernama bucket, tetapi jika hanya melihat rasio antara fungsi dan antarmuka, S3 bisa dianggap lebih sederhana daripada Unix file API
- Perbedaan penentunya adalah tidak adanya penimpaan sebagian
- Argumen
RangepadaGetObjectmemungkinkan pembacaan sebagian objek - Menimpa hanya sebagian objek tidak dimungkinkan
- Penimpaan harus dilakukan pada seluruh berkas
- Argumen
- Karena perbedaan ini, S3 hanya cocok untuk sebagian use case berkas tradisional
Database sulit dipindahkan begitu saja ke S3
- Banyak database menyimpan data dalam berkas di atas sistem berkas
- Postgres mempertahankan 2–3 berkas per tabel serta berbagai berkas manajemen
- SQLite dikenal menyimpan semua data dalam satu berkas
- MySQL, MongoDB, dan Elasticsearch juga menyimpan data dalam berkas
- Masalahnya, database umumnya bergantung pada penimpaan sebagian per halaman
- Data biasanya disimpan dalam halaman seperti 4KB atau 8KB
- Di dalam heap file bisa terdapat ribuan halaman
- Halaman ditimpa sebagian untuk menyimpan data yang diperlukan
- Jika database SQLite ditempatkan di S3, setiap penulisan harus menulis ulang seluruh berkas database
- S3 dapat memproses penulisan besar dengan cepat, tetapi kecuali untuk dataset paling kecil, strategi menimpa seluruh berkas setiap kali sulit ditanggung
- Jika berkas database ditulis ulang setiap saat, integritas transaksi yang dibuat oleh implementor database juga sulit dimanfaatkan
- Di S3, penulisan terakhir yang menang
Hal yang dikuasai dan tidak dikuasai S3
- Keunggulan S3 adalah bandwidth baca dan tulis yang sangat tinggi
- Tidak sulit menemukan contoh di internet yang menulis atau membaca lebih dari 10GB per detik ke/dari S3
- Ada juga pengalaman ketika operasi tulis S3 memenuhi jaringan kantor pelanggan finansial
- Selain tidak adanya penimpaan sebagian, ada batasan lain yang membedakannya dari sistem berkas
- S3 tidak memiliki operasi rename atau move
- Perubahan nama ditangani dengan
CopyObjectlaluDeleteObject CopyObjectmembutuhkan waktu linear yang sebanding dengan ukuran berkas- Menulis banyak berkas ke lokasi yang salah lalu mengembalikannya akan sangat lambat
- Perubahan nama ditangani dengan
- Listing berkas lambat
- Bandwidth baca-tulis sangat tinggi, tetapi operasi mendaftar item yang tersimpan jauh lebih lambat
- Bahkan bisa lebih lambat daripada sistem berkas lokal yang lambat
- Sebaliknya, beban operasional lebih rendah dibanding sistem berkas
- Cukup tentukan bucket dan nama key, sisanya ditangani cloud
- Mengurangi beban pekerjaan berulang seperti backup, replikasi offsite, dan provisioning
- Provisioning berlaku bukan hanya untuk kapasitas, tetapi juga untuk operasi IO
Modul dalam lebih penting pada antarmuka antarorganisasi
- Fakta bahwa S3 adalah API cloud populer pertama terkait dengan keunggulan API yang dalam
- API yang dalam berguna untuk menyembunyikan kompleksitas antar modul di dalam satu sistem, dan menjadi lebih penting dalam hubungan berbiaya tinggi seperti interaksi antara dua perusahaan
- Koneksi sistem komputer antarperusahaan secara tradisional disebut integration, dan diperlakukan seperti sinonim dari penderitaan
- Perangkat lunak enterprise besar seperti SAP bukanlah modul dalam
- Hampir seluruh organisasi harus memahami SAP
- Harus terus disesuaikan dengan cara kerja yang sudah ada
- Proyek integrasi SAP mahal dan besar, dengan kasus kegagalan yang berulang
- Kompleksitas internal S3 bukan berarti jauh lebih kecil daripada instalasi SAP
- Amazon menyebut S3 “Simple Storage Service”, tetapi kompleksitas S3 yang sebenarnya besar
- Mencakup teori antrean, kontensi IO, sharding, dan berbagai masalah yang ditangani sistem berkas
- “Simple” pada S3 lebih dekat pada antarmuka yang dalam daripada kesederhanaan nyata
Pengecualian yang cocok untuk S3 dan batasan yang tersisa
- Ini bukan berarti mengesampingkan masalah bahwa S3 bisa mahal untuk use case tertentu
- Konsep modul dalam dan modul dangkal berasal dari A Philosophy of Software Design karya John Ousterhout
- Ada juga database yang sejak awal dirancang untuk menggunakan API S3 sebagai lapisan penyimpanan
- Snowflake adalah salah satu contohnya
- Namun ini bukan pemindahan transparan, melainkan memerlukan keputusan desain sejak awal
- Snowflake adalah contoh yang mengambil keputusan ini sangat awal, setidaknya hingga 2016
- Bukan hanya database yang mengalami kesulitan di S3
- Banyak format berkas mengasumsikan
seekyang murah - Berkas Zip adalah contoh utama yang performanya lebih baik di disk daripada di S3
- Banyak format berkas mengasumsikan
Hal yang disayangkan dari S3
- API S3 hanya XML
- JSON sudah ada pada 2006, tetapi saat itu XML lebih dominan
- Sayang Amazon tidak merilis versi JSON saat beralih dari SOAP ke REST
- Amazon juga menghentikan pemeliharaan XSD schema
- Salah satu keunggulan utama API XML adalah skema, tetapi dokumen standar saat ini adalah situs web
- Amazon tidak menyediakan lingkungan pengujian lokal
- Di Python, untuk pengujian yang teliti, sebagian orang menggunakan library moto
- Meski moto adalah alat pengujian untuk layanan komersial, ia dikelola oleh para sukarelawan
- Amazon S3 mendukung checksum, tetapi tidak diaktifkan secara default
- Amazon membuat berbagai klaim tentang durabilitas
- Saya belum pernah mendengar adanya masalah nyata, tetapi juga belum melihat contoh klaim semacam itu diuji
- Dahulu S3 memiliki jebakan eventual consistency
- Setelah membaca dan menimpa berkas lalu membacanya lagi, Anda bisa melihat konten yang belum berubah
- Ini sesekali terjadi dalam waktu singkat dan menimbulkan kebingungan
- Implementasi S3 lain tidak meniru karakteristik ini, dan Amazon juga memperbaikinya beberapa tahun lalu dengan strong read-after-write consistency
1 komentar
Pendapat Hacker News
Durabilitas S3 mungkin terlihat dilebih-lebihkan, tetapi dapat dipercaya, dan sulit dibandingkan dengan sistem berkas tradisional
Perbedaannya bukan hanya pada perangkat lunak, tetapi juga mencakup infrastruktur fisik dan budaya keselamatan; isolasi Availability Zone AWS terasa lebih baik dibanding cloud lain
Saat bekerja di S3, sering sekali dibandingkan dari sisi harga dengan GCP Blob Storage, tetapi Google bisa menaruh data di gedung yang sama atau di ruangan berbeda dalam gedung yang sama, sehingga itu bukan perbandingan yang adil dengan pemisahan ala AWS
Seluruh organisasi sangat terobsesi dengan integritas data, memberi checksum pada segala hal, dan juga bersiap menghadapi peristiwa besar seperti bencana alam
Pada skala S3, bahkan bit rot seperti pembalikan bit acak akibat sinar gamma mengenai platter hard disk pun dapat dideteksi, dan mereka mengukur tingkat kegagalan berdasarkan produsen disk serta periode produksi, sehingga menurunkan kemungkinan kehilangan data bahkan jika batch tertentu rusak
Sampai-sampai saya tidak akan menyimpan data penting di tempat lain, dan saya sendiri membangun sistem deployment S3
Penjelasan ini terdengar seperti memuji Cinnabon karena membuat adonannya sendiri; hal-hal yang disebutkan itu biasanya memang dilakukan perusahaan storage
Memberi checksum pada semuanya adalah fitur dasar banyak sistem berkas, dan jika komputer rumahan pun bisa mendeteksi bit rot serta memberi notifikasi, perusahaan storage besar tentu melakukannya
Pelacakan tingkat kegagalan berdasarkan produsen disk juga umum, perusahaan storage bahkan menerbitkan laporan, dan organisasi IT berisi 6 orang pun pernah mengelolanya dengan spreadsheet
Di luar AWS pun, jauh sebelum AWS ada, sudah banyak orang pintar yang bekerja di bidang storage
Akun geo-redundant rsync.net, misalnya, berada di negara bagian atau negara berbeda, seperti storage utama di Fremont dan storage sekunder di Denver
Klaim bahwa S3 dapat mendeteksi bit rot karena skalanya juga tidak tepat; menjalankan ZFS di server pribadi pun dapat mendeteksi bit rot dengan baik pada skala kecil
[1] kantor pusat he.net
Jika kejadian kerusakan seperti ini cukup banyak, tampaknya itu juga bisa dipakai sebagai sinyal untuk “menyembuhkan” sistem dengan memindahkan blok data individual ke mesin lain
Secara umum, hal-hal yang disebutkan cukup lazim dalam sistem storage, dan bukan ciri khas S3 saja
Menurut dokumentasi Google Cloud Storage, data direplikasi ke beberapa zona, dan tiap zona dipetakan ke kluster yang berbeda
https://cloud.google.com/compute/docs/regions-zones/zone-vir...
Saya penasaran apakah ada pihak ketiga netral yang memverifikasi durabilitas, integritas, dan konsistensi S3 seketat Jepsen
Jika seseorang membandingkan berbagai cloud storage yang kompatibel dengan S3 secara ketat, mungkin akan terungkap masalah-masalah besar yang menakutkan, atau mungkin perbandingan semacam itu sudah ada
Menurut saya, yang benar-benar berguna di S3 bukan kecepatan baca/tulis, melainkan listing
Pada bucket tanpa versi atau tanpa delete marker, listing untuk prefix tertentu pada dasarnya berjalan seperti waktu konstan, sehingga bahkan pada bucket berisi 100 miliar objek, kita bisa meminta 1000 key menurut urutan alfabet yang muncul setelah string acak tertentu
Menggunakan
/sebagai delimiter hanyalah nilai default, dan karakter apa pun bisa digunakan untuk mendapatkan kumpulan prefix bersama; direktori sebenarnya tidak ada, hanya tampak seolah dibuat saat dibutuhkanBerkat karakteristik ini, data dapat dipartisi dengan berbagai cara berdasarkan identifier yang dibutuhkan tanpa perlu mengkhawatirkan performa
Jika listing hanya lambat, tidak bisa melakukan pencarian berbasis prefix file, dan melambat sebanding dengan jumlah key seperti sistem berkas Unix tradisional, S3 sama sekali tidak akan berguna
Kemampuan mengambil key di sekitar sebelum dan sesudah sebuah prefix adalah dasar indeks database yang sudah ada sejak 1970-an, jadi tidak terlalu mengesankan
Use case bisa saja berbeda, tetapi sering kali listing bucket lambat dan mengganggu, dan ketika bucket sedikit saja membesar, waktu untuk menampilkan daftar key menjadi lebih lama daripada waktu membacanya
Sepingat saya, listing berada di bawah 1Mbps, tetapi saya tidak punya bucket besar untuk langsung diuji sekarang
Jika ada
dir1/a/000000sampaidir1/a/999999dan adadir1/b, maka pada sistem berkas hierarkis sungguhan,ls dir1/cukup menelusuri dan mengembalikan dua item, yaitu"a"dan"b"Sebaliknya, storage key-value dengan indeks string datar tanpa pemrosesan delimiter harus melewati 1 juta entri direktori dari
"a/00000"hingga"a/999999"sebelum mencapai"b"Jadi hierarki datar sederhana membuat listing isi satu direktori menjadi
O(semua anak rekursif), bukanO(anak langsung)seperti sistem berkas sungguhan, sehingga jauh lebih lambatNamun jika algoritma listing diberi tahu karakter delimiter seperti
/, trie prefix leksikografis dapat melewati subtree secara efisien pada/berikutnyaDokumentasi Amazon S3 juga menyatakan bahwa field
CommonPrefixesmelewati dan merangkum jutaan key yang tersarang di level lebih dalamhttps://docs.aws.amazon.com/AmazonS3/latest/userguide/using-...
Saya belum menguji apakah implementasi nyatanya benar-benar menghemat traversal, atau hanya mengurangi hasil setelah traversal, tetapi saya berharap memang menghemat
Karena itu, kinerjanya tidak melambat sebanding dengan jumlah entri, dan listing berbasis prefix file juga sangat cepat
Rasanya aneh melihat listing prefix sebagai fitur inti
Mendapatkan 1000 key dalam satu panggilan jaringan tidak menjamin apa pun tentang kompleksitas di backend
Baru-baru ini saat mengutak-atik skrip manajemen aset S3, saya kaget dengan kecepatan listing-nya
Seorang rekan bilang perlu cache daftar file dan mengirimkan cache yang sudah dipraisi; awalnya saya pikir itu pasti tidak diperlukan, tetapi setelah mengeceknya sendiri ternyata berbeda
Ada sekitar 100 ribu direktori root untuk aset individual, masing-masing berisi 5–6 direktori dan beberapa file, total file mungkin di bawah 1 juta, dengan kedalaman maksimal sekitar 3 level
Untuk mencantumkan file-file ini secara rekursif, secara harfiah butuh 15 menit
Saya mencoba berbagai saran peningkatan kecepatan dari Stack Overflow dan ChatGPT, tetapi tidak ada hasil yang berarti, dan saya tidak mengerti kenapa selambat ini
Saya tidak tahu kenapa Amazon belum memperbaikinya, dan dari luar kelihatannya cukup menambahkan beberapa B-tree pada tiap bucket
Kalau ini memang masalah yang sulit, alasannya tampaknya menarik, jadi saya ingin mendengarnya
Objek bisa terlihat seperti “direktori” hanya karena filter prefiks; ini bukan file system dan tidak punya konsep direktori
Cara tercepat untuk mencantumkan objek di S3 sama sekali tidak membutuhkan rekursi; cukup cantumkan semua objek di bawah suatu prefiks
Kalau memakai pemisah path untuk berpura-pura bahwa key S3 berbentuk struktur folder lalu melakukan iterasi “per folder”, itu akan jauh lebih lambat
Saat memanggil
ListObjectsV2, jangan kirimdelimiter; jika tidak memakai fitur delimiter, “direktori” dan “level” tidak memengaruhi performaUntuk mencapai total waktu yang diinginkan, satu pekerjaan listing bisa dipecah menjadi listing paralel untuk beberapa prefiks
Bucket yang berisi objek tidak bisa dihapus, dan kita juga tidak bisa sekali perintah meminta S3 menghapus semua objek
Untuk tiap objek, kita harus mengirim permintaan API hapus tersendiri; untuk itu kita juga harus mengirim permintaan listing per 1000 objek, dan panggilan listing ini memakan waktu sekaligus biaya
Artikel ini menjelaskan situasinya dengan baik: https://cloudcasts.io/article/deleting-an-s3-bucket-costs-mo...
Cara tercepat untuk membersihkan bucket S3 pada akhirnya adalah menghapus akun AWS tempat bucket itu berada
Dalam satu permintaan kita bisa mencantumkan 10 ribu objek, dan untuk mendapatkan 10 ribu berikutnya kita membutuhkan hasil permintaan sebelumnya, jadi semuanya serial
Untuk mencantumkan 1 juta file diperlukan 100 permintaan berurutan; kalau round-trip time saja 50 ms, round trip-nya sudah 5 detik, belum termasuk biaya membuat daftar itu sendiri dalam iterasi datar
Biaya listing 10 ribu item mirip dengan biaya write, dan ini sendiri tergolong cukup lambat; tiap listing juga mungkin berupa snapshot dengan konsistensi kuat, sehingga biayanya bertambah
B-tree sepertinya tidak banyak membantu kecuali untuk traversal direktori, dan bahkan dalam kasus itu bottleneck kemungkinan besar ada pada operasi jaringan dan API yang diekspos ke luar
Pada akhirnya, listing daftar file bukanlah use case yang begitu penting; biasanya kita menyerahkan pekerjaan yang diinginkan ke S3 lewat fitur seperti object lifecycle, lalu membiarkannya diproses efisien di lapisan file system internal
Semuanya objek, dan antarmuka web hanya menyajikan prefiks yang dipisahkan slash agar enak dilihat
Tiap objek punya key, dan key itu bisa berisi slash; kita boleh saja dengan nyaman menganggap tiap segmen sebagai direktori
Namun ketika mencoba operasi yang biasanya dilakukan pada direktori, ilusi itu akan runtuh
Orang-orang yang membuat S3 tahu bahwa ini bukan file system, dan menurut saya nama object storage dimaksudkan untuk menjelaskan perbedaan-perbedaan yang ditunjukkan dalam tulisan itu
“Objek sedang populer” merujuk pada objek sebagai komponen perangkat lunak yang menggabungkan kode eksekusi dan state lokal, tetapi contoh awal S3 bukanlah semacam “men-serialisasi objek live lalu men-deserialisasikannya di proses lain”
Contohnya semuanya berupa aset statis situs web dan semacamnya, dan di dunia database waktu itu, makna objek juga dipakai dalam istilah “binary large object” atau “blob”
S3 lebih mirip tempat menyimpan hal-hal yang canggung dimasukkan ke database, dan use case peluncuran saat desain awal mengasumsikan indeks konten berada di tempat lain, sehingga listing yang lambat justru menjelaskan karakter tersebut
https://en.wikipedia.org/wiki/Object_storage
Menurut penjelasan GCP, object storage adalah arsitektur yang membagi data tidak terstruktur menjadi unit objek dan menyimpannya dalam lingkungan data yang secara struktur datar
https://cloud.google.com/learn/what-is-object-storage
Dengan kata lain, hal intinya adalah data tidak terstruktur, susunan datar, serta operasi baca dan tulis pada tingkat item secara utuh
S3 bukan file, apalagi sistem file
Yang diharapkan dari abstraksi file adalah kemampuan untuk diubah: harus bisa mengedit sebagian file, memperbesar, memperkecil, serta membaca dan menulis pada offset sembarang
Setelah memegang sebuah file, seharusnya tidak perlu kembali lagi ke konsep root atau induk; tetapi S3 hanya menyediakan objek yang tidak dapat diubah di atas daftar yang dapat diubah, dan untuk mengubahnya harus menyalin lalu mengunggah ulang
Abstraksi file yang asli adalah mencari sektor-sektor pada disk dan menampilkannya kepada klien seolah-olah sebagai buffer kontinu, sedangkan S3 memecahkan masalah yang berbeda
Banyak orang salah memahami gagasan bagus UNIX “semuanya adalah file” sebagai berarti semuanya harus terlihat seperti buffer virtual kontinu
Inti sebenarnya adalah ada leaf node dasar, entah itu file atau objek lain yang ingin ditampilkan sistem kepada proses, semua hal termasuk direktori dapat dicantumkan di dalam direktori, dan ada pohon rekursif
Yang membuat sesuatu menjadi sistem file bukan tipe leaf node tertentu, melainkan direktori
Menambahkan tipe leaf baru seperti soket atau framebuffer hampir sepele dan tidak merusak gagasan ini, tetapi menambahkan jenis container lain seperti list membuat struktur sistem file menjadi rumit dan merusak konsistensi konseptual
S3 tidak melakukan hal-hal seperti ini, tetapi itu tidak apa-apa
Kita hanya ingin menyimpan hal-hal yang tidak cocok dimasukkan ke database dan berharap tidak terjadi bit rot saat tidak dilihat
Saya pikir dorongan untuk membuat S3 seperti sistem file berasal dari pelanggan yang salah memahami apa yang dikerjakan S3 dengan baik, dan manajemen produk yang menerima kesalahpahaman itu alih-alih mencegahnya
Analogi yang lebih tepat adalah perangkat penyimpanan blok, hanya saja lebih mirip perangkat blok yang sangat aneh dengan ukuran blok sembarang dan bisa diberi key
Sistem file adalah abstraksi yang diletakkan di atas perangkat penyimpanan blok, jadi “sistem file S3” juga seharusnya merupakan abstraksi yang berada di atas S3 dengan S3 diperlakukan seperti penyimpanan blok dasar
Sistem file adalah abstraksi yang dibuat di atas perangkat blok
Perangkat blok menyediakan array byte raksasa dan memungkinkan baca/tulis per blok, misalnya “tulis 300 byte ini di posisi 273041”
Perangkat blok itu sendiri juga merupakan abstraksi yang dibuat di atas hardware nyata, jadi perintah “tulis 300 byte ini” pada kenyataannya berujung pada tindakan seperti “gerakkan jarum pada platter nomor 2 ke posisi nomor 6”
S3 hanyalah abstraksi lain yang dibuat di atas penyimpanan mentah, dan secara ketat merupakan penyimpanan key-object yang datar
Jika membutuhkan fitur sistem file, implementasikan di aplikasi atau gunakan sistem file
Jika hanya butuh append, lacak rantai append dengan database dan simpan chunk di S3; jika tidak cocok, gunakan yang lain
Jika butuh penyalinan, buat referensi baru ke objek yang sama di database; jika tidak cocok, gunakan yang lain
S3 cocok untuk banyak orang, jadi jangan mencoba mengubahnya menjadi sesuatu yang lain
Kita juga harus berhenti mencoba mengubah makna istilah bidang yang sudah mapan; sistem file adalah konsep yang dijelaskan di buku teks, dan S3 tidak pernah mengklaim dirinya sebagai sistem file
Mempelajari sedikit desain sistem operasi juga benar-benar membantu dan menyenangkan
Ada diskusi yang membandingkan API
object_storeApache Arrow dan Apache OpenDAL di https://github.com/apache/arrow-rs/issues/3888Apache OpenDAL adalah library yang menyediakan API mirip sistem file di atas berbagai backend, termasuk S3 dan beberapa penyimpanan cloud
Beberapa sistem database seperti GreptimeDB dan Databend menggunakan OpenDAL sebagai semacam SDK S3 yang lebih baik untuk mengakses data di penyimpanan cloud
Ada juga solusi lain untuk mengelola antarmuka mirip sistem file di atas S3, seperti Alluxio dan JuiceFS, tetapi berbeda dengan Apache OpenDAL, keduanya memerlukan deployment terpisah dan layanan metadata internal khusus
Saat membicarakan S3, Backblaze B2 juga layak disebut
Harganya 3 kali lebih murah daripada S3, jadi saya sangat menyukainya, dan saya bukan orang Backblaze
Ada jendela pemeliharaan 2 jam setiap minggu pukul 11:30–13:30 PST, dan biasanya tidak ada downtime, tetapi kadang terjadi gangguan total tepat di tengah jam kerja AS
Ketika tingkat error naik sampai tidak dapat digunakan, kami harus membuka tiket dukungan, dan dalam beberapa tahun terakhir hal itu terjadi kira-kira setahun sekali
Dukungan hanya mengajukan banyak pertanyaan seolah-olah tidak punya log error atau visibilitas di sisi mereka, dan tidak benar-benar menyelidiki masalahnya
Ada juga false success, yaitu respons mengatakan unggahan berhasil tetapi sebenarnya tersimpan sebagai 0 byte di sistem B2, jadi unggahan tetap harus diverifikasi meskipun mendapat kode sukses
Jika muncul kerentanan dengan tingkat keparahan tinggi seperti CVE Log4j2, gangguan panjang seperti pemadaman 10 jam juga bisa terjadi
Harganya terbaik, tetapi produknya tidak bisa dibandingkan langsung dengan layanan penyimpanan cloud yang lebih matang
Namun menurut saya hal itu bisa ditambal sampai batas tertentu dengan dua lapis backup eksternal
Mengherankan bahwa meski mengiklankan diri sebagai solusi multicloud, situasi ketika biaya NAT gateway dan IPv4 menempel di mana-mana praktis menghilangkan kemungkinan adopsinya
Dengan pola pemakaian yang banyak membaca dan sedikit menulis, kami masih bisa menghemat uang meskipun membayar biaya bandwidth B2, tetapi tidak demikian jika harus melewati gateway NAT64 atau membayar biaya per jam untuk mengakses B2
Artikel yang bagus, dan akan berguna seandainya saya membacanya sebelum memulai perjalanan me-mount penyimpanan cloud sebagai FUSE dengan rclone mount
Setelah beberapa kali iterasi, rclone akhirnya memiliki lapisan VFS yang menyesuaikan penyimpanan seperti S3, Google Cloud Storage, Azure Blob, OpenStack Swift, dan Oracle Object Storage menjadi lapisan sistem berkas yang mirip POSIX, dan kode
rclone mountsebenarnya hanyalah lapisan tipis di atasnyaLapisan VFS memiliki beberapa tingkat kompatibilitas; pada
off, ia hanya melakukan caching direktoriDalam mode ini, seperti yang disebutkan di artikel, Anda tidak bisa membaca dan menulis berkas yang sama secara bersamaan, tidak bisa menulis di tengah berkas, dan berkas hanya bisa ditulis secara berurutan
Mengejutkannya, cukup banyak hal tetap berjalan baik bahkan dengan batasan seperti ini
Tingkat berikutnya,
writes, mendukung sebagian besar fitur POSIX yang diinginkan aplikasi, seperti membaca dan menulis berkas yang sama secara bersamaan serta menulis di tengah berkas, tetapi biayanya adalah membuat salinan lokal berkas dan mengunggahnya secara asinkron saat ditutupDokumentasi mode caching VFS mencerminkan dengan baik batasan yang dibahas dalam artikel: https://rclone.org/commands/rclone_mount/#vfs-file-caching
Pada dasarnya, S3 juga tidak memiliki direktori sungguhan, sehingga tidak bisa memiliki direktori tanpa berkas, dan direktori pun tidak memiliki metadata valid seperti waktu modifikasi
Anda bisa membuat penanda direktori, yaitu berkas 0 byte yang diakhiri dengan
/, dan banyak alat termasuk rclone mendukungnyaKetiadaan direktori kosong biasanya bukan masalah besar, karena lapisan VFS memalsukannya dan sebagian besar aplikasi segera menulis sesuatu ke dalamnya
Pada akhirnya, mengubah sesuatu yang tampak seperti S3 agar terlihat seperti sistem berkas POSIX membutuhkan cukup banyak pekerjaan, dan ada banyak trik di balik perilaku seperti mengganti nama berkas yang sedang terbuka serta berbagai kasus tepi yang rumit
Perintah level rendah rclone seperti
move/sync/copytidak melakukan penanganan seperti itu dan menggunakan API S3 hampir apa adanyaJika ada satu hal yang bisa diubah di API S3, saya ingin ada opsi untuk juga membaca metadata saat melakukan listing
rclone menyimpan waktu modifikasi berkas di metadata objek, tetapi tidak ada cara untuk membacanya secara massal, sehingga harus melakukan
HEADuntuk setiap objekAtau akan bagus juga jika
Last-Modifiedobjek bisa disetel saat mengunggahBatas panjang key adalah 1024, jadi jumlah metadata yang bisa disimpan terbatas, tetapi bahkan dengan memperhitungkan path berkas, itu masih cukup longgar
Anda bisa menggunakan pemisah yang tidak valid pada path yang dinormalisasi, seperti
//, dan menaruhnya seperti/path/to/file.txt//mtime=1710066090Anda tetap bisa mengambil “direktori” dengan prefiks, dan mengambil berkas secara langsung dengan menggunakan
//seperti prefiksNamun format seperti ini tampaknya akan sangat merusak kompatibilitas dengan perangkat lunak lain
Di MinIO, mereka menambahkan parameter “rahasia”
metadata=trueyang menyertakan metadata dan tag dalam listing ketika memiliki izin yang sesuaiKarena ini ekstensi, tidak bisa digunakan secara andal, tetapi rclone selalu bisa mencobanya dan memakainya jika tersedia
Berkas 0 byte yang diakhiri dengan
/juga dimungkinkan, tetapi prefiks bersama dalam listing itu sendiri juga bisa dianggap sebagai direktoriDengan begitu, direktori menjadi tanpa status dan tidak bisa ada jika tidak ada objek di dalamnya; ini punya kelebihan dan kekurangan
Jika
Last-Modifiedbisa disetel saat mengunggah, batasan di sisi klien akan berkurang, tetapi ada juga keuntungan dari menjadikan waktu server sebagai acuanReplikasi atau mirroring di sisi klien juga harus menangani batasan yang sama
Secara pribadi, keluhan terbesar saya adalah tidak adanya
HeadObjectVersionsyang mengembalikan informasi versi untuk satu objekListObjectVersionstidak bisa mengetahui apakah prefiks yang diberikan adalah prefiks sungguhan atau key objek, sehingga selalu berpotensi menjadi operasi di seluruh klasterAWS baru-baru ini menambahkan
GetObjectAttributes, tetapi informasi versi yang sebenarnya cocok dimasukkan di sana tidak disertakan“Simple” dalam S3 bukan berarti “tidak dalam”, melainkan bahwa ia memiliki komponen paling sedikit yang diperlukan untuk mencapai kebutuhannya
Jika Anda membutuhkan penyimpanan objek yang terdistribusi, tersentralisasi, tereplikasi, ber-availability tinggi, berdurabilitas tinggi, ber-bandwidth tinggi, berlatensi rendah, berkonsistensi kuat, sinkron, dapat diskalakan, ditambah HTTP REST API, saya rasa sulit membuatnya lebih sederhana daripada S3
AWS S3 telah ditambahi banyak fitur selama bertahun-tahun, tetapi perilaku dasarnya tetap sama
Menurut 『A Philosophy of Software Design』 karya Ousterhout, sederhana berarti tidak rumit, dan “Simple Made Easy” dari Rich Hickey juga berada dalam konteks yang sama
Sebaliknya, “dalam” berarti menyediakan banyak fungsi yang kompleks secara internal melalui antarmuka kecil, jadi untuk S3 istilah ini lebih cocok daripada “sederhana”
Ini berbeda dari kesederhanaan dalam arti bahwa S3 tidak punya banyak hal
https://www.infoq.com/presentations/Simple-Made-Easy/