<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MaxHuo</title>
    <description>The latest articles on DEV Community by MaxHuo (@maxhuo).</description>
    <link>https://dev.to/maxhuo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3965826%2F9f3c3df4-e0ba-44d2-a14a-8bd67b449cd6.jpg</url>
      <title>DEV Community: MaxHuo</title>
      <link>https://dev.to/maxhuo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxhuo"/>
    <language>en</language>
    <item>
      <title>Why Object Storage Rewrites Whole Objects (It's Far More Than Just Consensus)</title>
      <dc:creator>MaxHuo</dc:creator>
      <pubDate>Tue, 30 Jun 2026 15:02:00 +0000</pubDate>
      <link>https://dev.to/maxhuo/why-object-storage-rewrites-whole-objects-its-far-more-than-just-consensus-nim</link>
      <guid>https://dev.to/maxhuo/why-object-storage-rewrites-whole-objects-its-far-more-than-just-consensus-nim</guid>
      <description>&lt;p&gt;A junior on my team pulled me aside yesterday with that familiar frustrated look—the kind that screams he's convinced he found a massive, stupid design flaw.&lt;/p&gt;

&lt;p&gt;He pulled up our monitoring dashboard and pointed aggressively. "Look at this. I changed one freaking character in a 5 MB JSON file—only one single byte modified. The system reuploaded the entire file, saturated our network ingress and kicked off a full garbage collection cycle. Why can't it just flip that byte directly on disk, like my laptop's drive does?"&lt;/p&gt;

&lt;p&gt;It's a totally fair question. Consensus and replication do factor into object storage design, but they aren’t the sole driving force. The first constraint lives much lower in the stack: how physical storage hardware performs best under different write patterns. But that’s only half the equation—distributed cluster requirements add another layer of pressure pushing object storage toward immutable write patterns.&lt;/p&gt;

&lt;p&gt;One major foundational bottleneck sits in every storage rack: spinning hard drives, running at 7,200 RPM.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's pop the hood on spinning hard drives
&lt;/h3&gt;

&lt;p&gt;Object storage is built for massive scale. Even in 2026, that scale still relies on spinning rust—HDDs. No team can afford to host multi-exabyte datasets entirely on all-flash arrays without draining the entire cloud budget.&lt;/p&gt;

&lt;p&gt;The core issue comes down to basic hard drive physics: disks hate random access, and they thrive on sequential streaming.&lt;/p&gt;

&lt;p&gt;If you edit a single byte buried in the middle of a 5 MB file on an HDD, the hardware has to execute a full read-modify-write sequence, with three distinct steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull the full 4K (or larger) sector into memory&lt;/li&gt;
&lt;li&gt;Tweak that one tiny byte in RAM&lt;/li&gt;
&lt;li&gt;Wait for the platter to rotate back, then move the read/write head to the exact physical track again&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That mechanical seek operation costs roughly 10 milliseconds.&lt;/p&gt;

&lt;p&gt;Ten milliseconds sounds negligible on its own, until you imagine 10,000 concurrent microservices all patching tiny snippets of data at once. Drive heads flick back and forth across platters nonstop, like a broken metronome having a seizure. IOPS collapse to single digits, and throughput tanks from 200 MB/s down to dial-up levels.&lt;/p&gt;

&lt;p&gt;Object storage isn't optimized for frequent, fine-grained updates. Its strengths are large sequential writes, high durability, and massive scalability. The simplest way to lock in consistent high bandwidth is to avoid random head movement entirely. Instead of mutating existing object data in-place, most object storage implementations generate an entirely separate new object, then flip metadata pointers to mark this new version as live.&lt;/p&gt;

&lt;p&gt;We sacrifice random write flexibility to keep drives performant—and save ourselves endless operational headaches.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hardware explains why sequential writes are efficient.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Distributed systems explain why immutable objects are easier to coordinate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern object storage inherits both ideas. The HDD behavior gave us the mechanical push toward append-only patterns, but the distributed coordination challenges gave us the architectural lock-in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Yeah, but what about NVMe SSDs?
&lt;/h3&gt;

&lt;p&gt;SSDs have no moving heads, but they carry their own critical flaw: write amplification.&lt;/p&gt;

&lt;p&gt;SSD hardware writes data in 4KB pages, but erases data in large 2MB–4MB blocks. If you overwrite that tiny changed byte in-place, the controller has to read the entire block into cache, fully erase the physical block (a destructive operation), then rewrite the whole block just to apply your tiny change.&lt;/p&gt;

&lt;p&gt;This chews through the drive's limited Program/Erase (P/E) cycles at an alarming rate. Frequent small in-place overwrites significantly accelerate SSD wear-out due to write amplification, shortening drive lifespan far faster than sequential workloads would. For most large-scale cloud deployments, the extra storage overhead from immutable full rewrites is a worthwhile tradeoff. This design delivers more stable hardware lifespans, simpler failure recovery logic, and consistent throughput—benefits that outweigh the cost of retaining duplicate object versions until garbage collection cleans them up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fine, but what about the distributed cluster side of things?
&lt;/h3&gt;

&lt;p&gt;Now we get to the topic everyone fixates on: consistency. Consensus challenges are the other half of the story, but they're not where the physical constraints begin.&lt;/p&gt;

&lt;p&gt;That said, supporting in-place updates across three data replicas (Nodes A, B, C) creates an unmanageable pile of edge cases.&lt;/p&gt;

&lt;p&gt;Picture a client sending a tiny patch mid-write, and Node B crashes halfway through the operation. Node A holds the updated data, Node B is left with corrupted partial bytes, and Node C still serves the original file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which version do we serve for the next GET request?&lt;/li&gt;
&lt;li&gt;Do we roll back changes entirely, or risk serving a broken mix of old and new data?&lt;/li&gt;
&lt;li&gt;How do we manage cross-node locks without crushing read throughput?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Immutable objects eliminate this whole mess. We write the complete new object copy to every node first. Once all replicas validate the checksum successfully, the metadata layer swaps one single pointer to mark the new version as live. If the upload fails halfway? The original object stays fully intact and continues serving traffic. There's no partial state to reconcile, no emergency 2 AM incident calls to untangle split-brain data issues.&lt;/p&gt;

&lt;p&gt;An atomic metadata swap is trivial to implement. Safe partial in-place writes across distributed replicas? That's considerably harder to implement safely and reason about.&lt;/p&gt;

&lt;h3&gt;
  
  
  The unadvertised downside vendors skip in marketing docs
&lt;/h3&gt;

&lt;p&gt;This architecture comes with an unavoidable, messy side effect: rampant storage bloat.&lt;/p&gt;

&lt;p&gt;If you repeatedly edit a 10 GB database backup every five minutes (please don't do this), you generate another 10 GB of orphaned stale data every cycle. Object storage quickly turns into a dumping ground unless you carefully tune lifecycle policies and garbage collection cadence.&lt;/p&gt;

&lt;p&gt;Versioning is widely marketed as a user recovery feature, but it's really a natural side effect of immutable storage—one that vendors package as a sellable "one-click rollback" capability.&lt;/p&gt;




&lt;p&gt;If you treat object storage like a local hard drive, you're going to have a bad time.&lt;/p&gt;

&lt;p&gt;It's not built for frequent edits. It's built for &lt;em&gt;publishing&lt;/em&gt;—upload once, leave it untouched, delete only when you're certain. It trades random-write flexibility for raw throughput, accepts slower edits to extend hardware lifespan, and dodges the worst distributed consensus nightmares by simply refusing to play the "modify" game at all.&lt;/p&gt;

&lt;p&gt;Once you frame object storage as an append-first system rather than a mutable local filesystem, every counterintuitive design choice falls into place.&lt;/p&gt;

</description>
      <category>distributedsystems</category>
      <category>storage</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why Listing Objects Is One of the Hardest Operations in Cloud Storage</title>
      <dc:creator>MaxHuo</dc:creator>
      <pubDate>Wed, 24 Jun 2026 14:29:00 +0000</pubDate>
      <link>https://dev.to/maxhuo/why-listing-objects-is-one-of-the-hardest-operations-in-cloud-storage-8kj</link>
      <guid>https://dev.to/maxhuo/why-listing-objects-is-one-of-the-hardest-operations-in-cloud-storage-8kj</guid>
      <description>&lt;p&gt;This is Part 4 of the Object Storage Internals series.&lt;br&gt;
Previous articles covered core mental models, metadata bottlenecks, and consistency tradeoffs.&lt;/p&gt;

&lt;p&gt;When people think about object storage performance, they usually focus on reads and writes.&lt;/p&gt;

&lt;p&gt;That makes sense.&lt;/p&gt;

&lt;p&gt;Uploading an object sounds expensive.&lt;/p&gt;

&lt;p&gt;Downloading an object sounds expensive.&lt;/p&gt;

&lt;p&gt;Listing objects sounds trivial.&lt;/p&gt;

&lt;p&gt;After all, how hard can this be?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /photos/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Return all the objects and move on.&lt;/p&gt;

&lt;p&gt;The first time I started looking at object storage internals, I assumed listing was one of the easier operations.&lt;/p&gt;

&lt;p&gt;I was wrong.&lt;/p&gt;

&lt;p&gt;In many large-scale storage systems, listing objects is significantly more complicated than reading a single object.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading one object is usually straightforward
&lt;/h2&gt;

&lt;p&gt;Suppose a client requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /photos/cat.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The storage system only needs to answer a few questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the object exist?&lt;/li&gt;
&lt;li&gt;Where is it stored?&lt;/li&gt;
&lt;li&gt;Which nodes hold the data?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once metadata provides the answer, the object can be retrieved.&lt;/p&gt;

&lt;p&gt;The operation is targeted.&lt;/p&gt;

&lt;p&gt;The system knows exactly what it is looking for.&lt;/p&gt;




&lt;h2&gt;
  
  
  Listing is a completely different problem
&lt;/h2&gt;

&lt;p&gt;Now consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIST /photos/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request no longer asks for one object.&lt;/p&gt;

&lt;p&gt;It asks for every object matching a prefix.&lt;/p&gt;

&lt;p&gt;In a small system this is easy.&lt;/p&gt;

&lt;p&gt;In a large distributed storage system, it becomes surprisingly expensive.&lt;/p&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 billion objects&lt;/li&gt;
&lt;li&gt;Hundreds of storage nodes&lt;/li&gt;
&lt;li&gt;Metadata distributed across partitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer to a listing request may be spread across dozens of machines.&lt;/p&gt;

&lt;p&gt;No single node necessarily knows the complete answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  The system has to assemble reality
&lt;/h2&gt;

&lt;p&gt;A read operation usually follows a path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Object Name
      ↓
Metadata Lookup
      ↓
Storage Node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A listing operation often looks more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   ↓
Metadata Partition 1
Metadata Partition 2
Metadata Partition 3
Metadata Partition N
   ↓
Merge Results
Sort Results
Remove Duplicates
Return Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system is effectively reconstructing a view of reality from multiple sources.&lt;/p&gt;

&lt;p&gt;That takes work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Consistency makes it harder
&lt;/h2&gt;

&lt;p&gt;Things become more interesting when objects are changing while a listing operation is running.&lt;/p&gt;

&lt;p&gt;Imagine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client A uploads object X
Client B deletes object Y
Client C performs LIST
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What should Client C see?&lt;/p&gt;

&lt;p&gt;The answer depends on the consistency guarantees of the system.&lt;/p&gt;

&lt;p&gt;Some storage systems prioritize a consistent view.&lt;/p&gt;

&lt;p&gt;Others prioritize performance and availability.&lt;/p&gt;

&lt;p&gt;Either way, the metadata layer now has to make decisions.&lt;/p&gt;

&lt;p&gt;This is one reason why listing is often a metadata problem rather than a storage problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The first surprising lesson
&lt;/h2&gt;

&lt;p&gt;Many engineers assume object storage is primarily about moving data.&lt;/p&gt;

&lt;p&gt;In practice, large storage systems spend an enormous amount of effort managing information about data.&lt;/p&gt;

&lt;p&gt;The actual object might be sitting safely on disk.&lt;/p&gt;

&lt;p&gt;The hard part is determining whether that object should appear in a query result right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why S3 listing behavior confused developers for years
&lt;/h2&gt;

&lt;p&gt;Historically, developers occasionally encountered situations where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload succeeds&lt;/li&gt;
&lt;li&gt;Immediate LIST request occurs&lt;/li&gt;
&lt;li&gt;Object does not appear&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The object existed.&lt;/p&gt;

&lt;p&gt;The storage system had accepted the write.&lt;/p&gt;

&lt;p&gt;The issue was that metadata updates had not fully converged.&lt;/p&gt;

&lt;p&gt;From the developer's perspective, it felt like a bug.&lt;/p&gt;

&lt;p&gt;From the storage system's perspective, it was a consequence of the consistency model.&lt;/p&gt;

&lt;p&gt;This is one of the reasons object listing became such an important topic in storage architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scale changes everything
&lt;/h2&gt;

&lt;p&gt;Imagine a bucket containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,000 objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listing is easy.&lt;/p&gt;

&lt;p&gt;Now imagine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 billion objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem changes completely.&lt;/p&gt;

&lt;p&gt;Questions suddenly appear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How should metadata be partitioned?&lt;/li&gt;
&lt;li&gt;How are results sorted?&lt;/li&gt;
&lt;li&gt;How is pagination handled?&lt;/li&gt;
&lt;li&gt;How much memory should listing consume?&lt;/li&gt;
&lt;li&gt;How many metadata servers participate?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The operation that looked simple now touches some of the most important architectural decisions in the entire system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why storage engineers care so much about metadata
&lt;/h2&gt;

&lt;p&gt;After spending time studying object storage systems, one pattern keeps appearing:&lt;/p&gt;

&lt;p&gt;Whenever something becomes difficult, metadata is usually involved.&lt;/p&gt;

&lt;p&gt;Part 2 of this series argued that metadata is the real system.&lt;/p&gt;

&lt;p&gt;Listing operations are a good example.&lt;/p&gt;

&lt;p&gt;The object data itself is often not the challenge.&lt;/p&gt;

&lt;p&gt;The challenge is maintaining an accurate and scalable view of billions of objects while the system is constantly changing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The trade-off nobody sees
&lt;/h2&gt;

&lt;p&gt;Users see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIST /photos/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Storage engineers see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Distributed metadata
Consistency guarantees
Partitioning strategy
Pagination
Failure handling
Concurrency
Scalability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API looks simple because the storage system absorbs the complexity.&lt;/p&gt;

&lt;p&gt;That simplicity is expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;Reading a single object is usually about finding data.&lt;/p&gt;

&lt;p&gt;Listing objects is about understanding the state of the entire system.&lt;/p&gt;

&lt;p&gt;That's why listing often becomes one of the most metadata-intensive operations in cloud storage.&lt;/p&gt;

&lt;p&gt;The bigger the system becomes, the more difficult that problem gets.&lt;/p&gt;




&lt;h3&gt;
  
  
  Next in this series
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Part 5: Why Object Storage Systems Avoid In-Place Updates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If updating a file seems simple on your laptop, why do many object storage systems prefer creating new versions instead of modifying existing data?&lt;/p&gt;

</description>
      <category>storage</category>
      <category>distributedsystems</category>
      <category>cloud</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Strong vs Eventual Consistency in Distributed Storage (Without the Confusion)</title>
      <dc:creator>MaxHuo</dc:creator>
      <pubDate>Mon, 22 Jun 2026 13:51:00 +0000</pubDate>
      <link>https://dev.to/maxhuo/strong-vs-eventual-consistency-in-distributed-storage-without-the-confusion-5d34</link>
      <guid>https://dev.to/maxhuo/strong-vs-eventual-consistency-in-distributed-storage-without-the-confusion-5d34</guid>
      <description>&lt;p&gt;After writing about metadata in object storage systems, I kept coming back to the same question:&lt;/p&gt;

&lt;p&gt;If metadata is distributed across multiple machines, how do those machines agree on what is true?&lt;/p&gt;

&lt;p&gt;This is where consistency enters the picture.&lt;/p&gt;

&lt;p&gt;The problem is that consistency is often explained through CAP theorem diagrams and academic terminology. While those are important, they don't always help when you're trying to understand how a storage system actually behaves.&lt;/p&gt;

&lt;p&gt;A more practical question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I upload an object right now, when should everyone else be able to see it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question sits at the heart of consistency.&lt;/p&gt;




&lt;h2&gt;
  
  
  A storage engineer's version of the problem
&lt;/h2&gt;

&lt;p&gt;Imagine a storage cluster with three metadata nodes.&lt;/p&gt;

&lt;p&gt;A client uploads:&lt;/p&gt;

&lt;p&gt;photos/cats.png&lt;/p&gt;

&lt;p&gt;The upload succeeds.&lt;/p&gt;

&lt;p&gt;One second later, another service asks:&lt;/p&gt;

&lt;p&gt;"Does photos/cats.png exist?"&lt;/p&gt;

&lt;p&gt;Most people expect the answer to be obvious.&lt;/p&gt;

&lt;p&gt;Either the object exists or it doesn't.&lt;/p&gt;

&lt;p&gt;But in a distributed system, different nodes may learn about the write at different times. That's where consistency guarantees start to matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Strong consistency: one answer, everywhere
&lt;/h2&gt;

&lt;p&gt;With strong consistency, once a write is acknowledged, every future read must observe that write.&lt;/p&gt;

&lt;p&gt;From a developer's perspective, life is simple.&lt;/p&gt;

&lt;p&gt;Upload an object:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload object&lt;/li&gt;
&lt;li&gt;Receive success response&lt;/li&gt;
&lt;li&gt;Read object&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If step three doesn't find the object, something is wrong.&lt;/p&gt;

&lt;p&gt;The system behaves as though there is a single source of truth, even if dozens of machines are involved behind the scenes.&lt;/p&gt;

&lt;p&gt;This is one reason developers like strongly consistent systems: they're easier to reason about.&lt;/p&gt;

&lt;p&gt;The complexity stays inside the storage layer rather than leaking into application code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why storage systems historically liked eventual consistency
&lt;/h2&gt;

&lt;p&gt;Eventual consistency often gets treated as a design mistake.&lt;/p&gt;

&lt;p&gt;I don't think that's fair.&lt;/p&gt;

&lt;p&gt;For years, many large-scale storage systems made that trade-off intentionally because coordinating every write across every node can become expensive.&lt;/p&gt;

&lt;p&gt;The goal wasn't to be less correct.&lt;/p&gt;

&lt;p&gt;The goal was to remain responsive and available at scale.&lt;/p&gt;

&lt;p&gt;A classic example involved object listing.&lt;/p&gt;

&lt;p&gt;You upload an object.&lt;/p&gt;

&lt;p&gt;The upload succeeds.&lt;/p&gt;

&lt;p&gt;You immediately perform a LIST operation.&lt;/p&gt;

&lt;p&gt;The object isn't there.&lt;/p&gt;

&lt;p&gt;The first time you see this behavior it feels like a bug.&lt;/p&gt;

&lt;p&gt;In reality, nothing is broken. The metadata simply hasn't converged yet.&lt;/p&gt;

&lt;p&gt;This kind of behavior existed in enough systems that many cloud engineers learned to expect it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The trade-off is where the complexity lives
&lt;/h2&gt;

&lt;p&gt;A lot of discussions frame consistency as:&lt;/p&gt;

&lt;p&gt;Strong consistency = good&lt;/p&gt;

&lt;p&gt;Eventual consistency = bad&lt;/p&gt;

&lt;p&gt;In practice, the decision is rarely that simple.&lt;/p&gt;

&lt;p&gt;Strong consistency often pushes complexity into the storage layer through coordination, consensus, and failure handling.&lt;/p&gt;

&lt;p&gt;Eventual consistency often pushes complexity into application code through retries, stale reads, and edge cases.&lt;/p&gt;

&lt;p&gt;The complexity doesn't disappear.&lt;/p&gt;

&lt;p&gt;It just moves.&lt;/p&gt;

&lt;p&gt;That's why consistency discussions are ultimately engineering discussions, not ideological ones.&lt;/p&gt;

&lt;p&gt;The real question isn't:&lt;/p&gt;

&lt;p&gt;"Which model is better?"&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;p&gt;"Where do we want to pay the cost?"&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;The most useful way I've found to think about consistency is this:&lt;/p&gt;

&lt;p&gt;Consistency determines how quickly a distributed system agrees on the result of a change.&lt;/p&gt;

&lt;p&gt;Strong consistency prioritizes agreement before responding.&lt;/p&gt;

&lt;p&gt;Eventual consistency prioritizes progress and convergence over time.&lt;/p&gt;

&lt;p&gt;Neither approach is free.&lt;/p&gt;

&lt;p&gt;Every storage system chooses a different balance between coordination, performance, availability, and operational complexity.&lt;/p&gt;

</description>
      <category>storage</category>
      <category>devops</category>
      <category>s3</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why Metadata Is the Hardest Part of Object Storage Systems</title>
      <dc:creator>MaxHuo</dc:creator>
      <pubDate>Wed, 17 Jun 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/maxhuo/why-metadata-is-the-hardest-part-of-object-storage-systems-49d3</link>
      <guid>https://dev.to/maxhuo/why-metadata-is-the-hardest-part-of-object-storage-systems-49d3</guid>
      <description>&lt;p&gt;In the previous post, I argued that object storage is best understood as a distributed key-value system rather than a traditional file system.&lt;/p&gt;

&lt;p&gt;That raises an interesting question:&lt;/p&gt;

&lt;p&gt;If storing objects is relatively straightforward, what makes distributed storage systems so difficult to build?&lt;/p&gt;

&lt;p&gt;The answer is usually not the data itself.&lt;/p&gt;

&lt;p&gt;It's the metadata.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is metadata?
&lt;/h2&gt;

&lt;p&gt;When you upload an object, the system stores more than just the object's contents.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Key: photos/cats.png
Size: 4.2 MB
Created: 2026-06-17
Version: v3
Checksum: abc123
Location: Node-7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of this information is metadata.&lt;/p&gt;

&lt;p&gt;Without metadata, the system would have no idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;where the object lives&lt;/li&gt;
&lt;li&gt;whether it exists&lt;/li&gt;
&lt;li&gt;how large it is&lt;/li&gt;
&lt;li&gt;which version is current&lt;/li&gt;
&lt;li&gt;whether the object is healthy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Data is the payload. Metadata is the map.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Storing data is surprisingly easy
&lt;/h2&gt;

&lt;p&gt;Imagine a storage cluster with ten nodes.&lt;/p&gt;

&lt;p&gt;When an object arrives, writing the data is often the simple part:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose a destination&lt;/li&gt;
&lt;li&gt;Write the object&lt;/li&gt;
&lt;li&gt;Replicate or encode it&lt;/li&gt;
&lt;li&gt;Return success&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Modern disks, SSDs, and networks are very good at moving bytes around.&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How does every node agree on where that object is?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a metadata problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hidden database inside every storage system
&lt;/h2&gt;

&lt;p&gt;Many people think object storage is primarily a storage problem.&lt;/p&gt;

&lt;p&gt;In reality, every serious storage system contains a metadata system that behaves a lot like a database.&lt;/p&gt;

&lt;p&gt;It must answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this object exist?&lt;/li&gt;
&lt;li&gt;Which version is current?&lt;/li&gt;
&lt;li&gt;Which nodes store the data?&lt;/li&gt;
&lt;li&gt;Has replication completed?&lt;/li&gt;
&lt;li&gt;Is the object being deleted?&lt;/li&gt;
&lt;li&gt;Has the object become corrupted?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every read and write depends on accurate answers.&lt;/p&gt;

&lt;p&gt;A storage cluster can survive losing a disk.&lt;/p&gt;

&lt;p&gt;It cannot survive losing track of its metadata.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why metadata becomes difficult at scale
&lt;/h2&gt;

&lt;p&gt;Imagine a system storing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 billion objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The object data may be spread across hundreds of servers.&lt;/p&gt;

&lt;p&gt;Metadata now faces several challenges:&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistency
&lt;/h3&gt;

&lt;p&gt;When a client uploads an object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;photos/cats.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every node must eventually agree that the object exists.&lt;/p&gt;

&lt;p&gt;If one node thinks the upload succeeded while another thinks it failed, strange things happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objects disappear&lt;/li&gt;
&lt;li&gt;stale versions appear&lt;/li&gt;
&lt;li&gt;reads become inconsistent&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Concurrency
&lt;/h3&gt;

&lt;p&gt;Two clients may attempt to update the same object simultaneously.&lt;/p&gt;

&lt;p&gt;Which version wins?&lt;/p&gt;

&lt;p&gt;Who decides?&lt;/p&gt;

&lt;p&gt;The metadata layer must coordinate those decisions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Failure Recovery
&lt;/h3&gt;

&lt;p&gt;Nodes fail.&lt;/p&gt;

&lt;p&gt;Disks fail.&lt;/p&gt;

&lt;p&gt;Networks fail.&lt;/p&gt;

&lt;p&gt;During failures, metadata must remain correct.&lt;/p&gt;

&lt;p&gt;Incorrect metadata is often worse than missing data because the system may confidently return the wrong answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why listing objects is so expensive
&lt;/h2&gt;

&lt;p&gt;Many developers assume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List all objects in /photos/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;should be simple.&lt;/p&gt;

&lt;p&gt;In distributed storage, it often isn't.&lt;/p&gt;

&lt;p&gt;The system may need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;query multiple metadata partitions&lt;/li&gt;
&lt;li&gt;aggregate results&lt;/li&gt;
&lt;li&gt;sort keys&lt;/li&gt;
&lt;li&gt;remove duplicates&lt;/li&gt;
&lt;li&gt;handle concurrent updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The actual object data may never be touched.&lt;/p&gt;

&lt;p&gt;The entire operation is mostly metadata work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The trade-off every storage system faces
&lt;/h2&gt;

&lt;p&gt;Storage systems constantly balance three goals:&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;Fast reads and writes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistency
&lt;/h3&gt;

&lt;p&gt;Every client sees the same truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Availability
&lt;/h3&gt;

&lt;p&gt;The system continues operating during failures.&lt;/p&gt;

&lt;p&gt;Improving one often impacts another.&lt;/p&gt;

&lt;p&gt;Many architectural decisions ultimately become metadata decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why metadata often determines system architecture
&lt;/h2&gt;

&lt;p&gt;When engineers discuss storage systems, conversations frequently focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSDs&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;replication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those things matter.&lt;/p&gt;

&lt;p&gt;But in many systems, the metadata architecture determines whether the entire platform succeeds.&lt;/p&gt;

&lt;p&gt;Questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;centralized or distributed metadata?&lt;/li&gt;
&lt;li&gt;strong or eventual consistency?&lt;/li&gt;
&lt;li&gt;database-backed or custom metadata engine?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can have a larger impact than raw storage performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where systems like RustFS fit
&lt;/h2&gt;

&lt;p&gt;While exploring object storage architectures, one lesson has become increasingly clear:&lt;/p&gt;

&lt;p&gt;The most interesting engineering problems are often not about storing data.&lt;/p&gt;

&lt;p&gt;They are about coordinating information about data.&lt;/p&gt;

&lt;p&gt;Systems like RustFS, MinIO, Ceph, and others all solve the fundamental challenge differently:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we maintain an accurate view of billions of objects across many machines while failures are constantly happening?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question sits at the heart of modern storage engineering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;When people think about object storage, they usually focus on where the data lives.&lt;/p&gt;

&lt;p&gt;Experienced storage engineers often focus on something else:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Metadata is the real system. The stored objects are just the payload.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you understand that idea, many storage architecture decisions start to make much more sense.&lt;/p&gt;




&lt;h3&gt;
  
  
  Next in this series
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Part 3: Strong vs Eventual Consistency in Distributed Storage (Without the Confusion)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We'll look at why two healthy nodes can sometimes disagree, and how storage systems decide what "truth" actually means.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>architecture</category>
      <category>distributedsystems</category>
      <category>metadata</category>
    </item>
    <item>
      <title>Most People Misunderstand Object Storage (Here’s the Mental Model That Actually Helps)</title>
      <dc:creator>MaxHuo</dc:creator>
      <pubDate>Tue, 16 Jun 2026 12:42:00 +0000</pubDate>
      <link>https://dev.to/maxhuo/most-people-misunderstand-object-storage-heres-the-mental-model-that-actually-helps-1gjk</link>
      <guid>https://dev.to/maxhuo/most-people-misunderstand-object-storage-heres-the-mental-model-that-actually-helps-1gjk</guid>
      <description>&lt;p&gt;If you’ve used S3, MinIO, or any cloud storage API, it’s easy to assume object storage is just a “cloud folder system.”&lt;/p&gt;

&lt;p&gt;That assumption is wrong — and it leads to confusion when you start working with distributed systems.&lt;/p&gt;

&lt;p&gt;Object storage is not a file system.&lt;/p&gt;

&lt;p&gt;It’s closer to a &lt;strong&gt;distributed key-value system with strong durability guarantees and a very specific access model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you understand that shift, a lot of cloud infrastructure starts to make more sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  The mental model most people start with
&lt;/h2&gt;

&lt;p&gt;When people first see object storage, they imagine something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/photos/cats.png
/photos/dogs.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A hierarchical file system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;folders&lt;/li&gt;
&lt;li&gt;subfolders&lt;/li&gt;
&lt;li&gt;files inside directories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is how traditional systems like ext4 or NTFS work.&lt;/p&gt;

&lt;p&gt;But object storage doesn’t actually work this way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actual model: key → object
&lt;/h2&gt;

&lt;p&gt;Object storage is much simpler at its core:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key → value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;photos/cats.png&lt;/span&gt;
&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;binary data&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are no real folders.&lt;/p&gt;

&lt;p&gt;“folders” are just &lt;strong&gt;string prefixes&lt;/strong&gt; used for organization.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this design exists
&lt;/h2&gt;

&lt;p&gt;This model isn’t accidental. It solves real distributed system problems.&lt;/p&gt;

&lt;p&gt;Traditional file systems struggle when you try to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scale across many machines&lt;/li&gt;
&lt;li&gt;replicate data reliably&lt;/li&gt;
&lt;li&gt;handle partial failures&lt;/li&gt;
&lt;li&gt;coordinate metadata changes at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Object storage avoids many of these problems by simplifying the model.&lt;/p&gt;

&lt;p&gt;Instead of supporting complex file operations, it focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store object&lt;/li&gt;
&lt;li&gt;retrieve object&lt;/li&gt;
&lt;li&gt;delete object&lt;/li&gt;
&lt;li&gt;list objects by prefix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing more.&lt;/p&gt;




&lt;h2&gt;
  
  
  The most important design choice: immutability
&lt;/h2&gt;

&lt;p&gt;In most object storage systems:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Objects are not modified in place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you “update” a file, what actually happens is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;upload a new object&lt;/li&gt;
&lt;li&gt;replace the key pointer&lt;/li&gt;
&lt;li&gt;old object becomes orphaned (eventually cleaned up)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a huge shift from file systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters
&lt;/h3&gt;

&lt;p&gt;Immutability makes distributed systems easier because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no concurrent write conflicts on the same object&lt;/li&gt;
&lt;li&gt;replication becomes simpler&lt;/li&gt;
&lt;li&gt;caching becomes safer&lt;/li&gt;
&lt;li&gt;failure recovery is easier to reason about&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What object storage optimizes for
&lt;/h2&gt;

&lt;p&gt;Object storage is not trying to be fast at small operations.&lt;/p&gt;

&lt;p&gt;It is optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high durability (data should not be lost)&lt;/li&gt;
&lt;li&gt;horizontal scalability&lt;/li&gt;
&lt;li&gt;large objects (MBs → TBs)&lt;/li&gt;
&lt;li&gt;simple access patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why it works well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backups&lt;/li&gt;
&lt;li&gt;media storage&lt;/li&gt;
&lt;li&gt;data lakes&lt;/li&gt;
&lt;li&gt;AI datasets&lt;/li&gt;
&lt;li&gt;logs and archives&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why listing objects feels “expensive”
&lt;/h2&gt;

&lt;p&gt;One confusing thing for newcomers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why is listing objects slower than expected?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because there is no real directory structure.&lt;/p&gt;

&lt;p&gt;To list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;photos/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system actually has to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scan keys&lt;/li&gt;
&lt;li&gt;match prefixes&lt;/li&gt;
&lt;li&gt;aggregate results across storage nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a &lt;strong&gt;distributed query problem&lt;/strong&gt;, not a simple filesystem lookup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where systems like RustFS fit in
&lt;/h2&gt;

&lt;p&gt;While studying object storage systems, I’ve been looking at designs like RustFS, an open-source distributed object storage system built in Rust.&lt;/p&gt;

&lt;p&gt;It becomes easier to understand such systems once you realize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;metadata is the hardest part, not storage&lt;/li&gt;
&lt;li&gt;consistency decisions matter more than raw throughput&lt;/li&gt;
&lt;li&gt;failure handling defines system behavior more than normal execution paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll go deeper into these ideas in the next parts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;If you remember just one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Object storage is not a folder system. It is a distributed key-value system optimized for durability and scale, not navigation and mutation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Next in this series
&lt;/h2&gt;

&lt;p&gt;In Part 2, I’ll break down:&lt;br&gt;
&lt;strong&gt;“Why distributed storage systems need metadata engines (and why they are the hardest part)”&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>rust</category>
      <category>distributedsystems</category>
      <category>s3</category>
    </item>
  </channel>
</rss>
