Scality Blog | Object storage, AI data infrastructure & cyber resilience

On-premises object storage: Where teams run into trouble

Written by Joshua Silvia | Sep 14, 2026, 12:42:07 PM

Most on-premises object storage deployments do not fail at installation. They fail a year later, when the first rebuild saturates the network, when an application that "supports S3" depends on one unsupported call, or when the cluster fills with tiny objects the sizing spreadsheet never anticipated. The technology works; the trouble comes from carrying file-storage habits into a system built on different assumptions.

Object storage is now the default landing zone for backup, archives, media, analytics and AI data, and running it on-premises is attractive for cost predictability and sovereignty. But its operational model differs from block and NAS in ways that are easy to underestimate. This field guide covers the mistakes that recur in on-prem projects, each with symptom and fix, plus a summary table and a checklist.

What does on-premises object storage actually commit a team to?

Object storage stores data as immutable objects in flat buckets, addressed by key rather than path, and accessed over an HTTP API (in practice, the S3 API). Objects are written whole, replaced whole, and protected by replication or erasure coding across many nodes. There is no hierarchy, no locking, and no in-place modification.

The naive view is that this is "a big shared drive with a different protocol." It is not. Scale-out object storage is a distributed system, and the team inherits its responsibilities: metadata capacity, east-west traffic, failure domains, rebuild behavior and access policy. Nearly every pitfall below is one of those left to default.

Where do sizing and hardware assumptions go wrong?

Undersizing for small-object metadata overhead

Symptom: raw capacity is plentiful, yet latency climbs, listings crawl, and the metadata tier runs out of flash long before the data disks fill.

Fix: size on object count, not just terabytes. Every object carries metadata, and erasure coding a 4 KB object across a wide stripe creates per-fragment overhead that can exceed the payload. Suppose an organization plans 2 PB for a backup application writing 1 MB chunks: that is roughly two billion objects, and the metadata tier must be planned for that number. Profile real object sizes, ask whether small objects can be packed, and size the metadata flash accordingly.

Not planning for hardware refresh and mixed-generation nodes

Symptom: three years in, the original nodes are end of life, and adding denser nodes is blocked by a homogeneity requirement, forcing a forklift migration.

Fix: treat refresh as a day-one design input. Choose a platform that supports heterogeneous node generations and rebalances as capacity is added and retired, so an old generation drains out in a rolling operation.

Why does treating object storage like a NAS cause problems?

Carrying POSIX expectations into an object world

Symptom: behind an S3-to-file gateway, renaming a large "directory" takes minutes, two clients overwrite each other with no lock error, and appends silently rewrite whole objects.

Fix: know which POSIX semantics object storage does not provide: no byte-range writes, no append, no locking, and rename is a copy plus delete because keys are not paths. Applications that depend on these behaviors need object-native patterns (multipart upload, conditional writes, versioning) or should stay on a file system. If the platform offers both, use the file interface where it is genuinely needed.

What network and data-protection decisions surface after go-live?

Ignoring east-west traffic and rebuild bandwidth

Symptom: client throughput collapses the first time a node fails, because rebuild traffic competes with clients on the same links.

Fix: design for internal traffic, not just client ingress. Erasure-coded writes fan out to every node in the stripe, and a rebuild pulls fragments from many nodes at once. Reserve capacity for the back-end network, size uplinks for rebuild plus client load, and confirm the platform can throttle rebuilds.

Choosing erasure coding without understanding rebuild time and failure domains

Symptom: the scheme was picked for efficiency, but a rack power event takes more fragments offline than it tolerates, or a node rebuild takes days and the cluster runs degraded longer than the risk model assumed.

Fix: select erasure coding parameters against three questions: which failure domain must be survivable (drive, node, rack, site), how long the largest rebuild takes at realistic network speed, and how much efficiency is worth trading for shorter exposure. Place fragments across independent domains and test by pulling a node before production.

Running a single site with no geo-protection

Symptom: a site-level event (fire, cooling failure, ransomware reaching the management plane) would take every copy offline together.

Fix: decide explicitly how much geographic protection each data class requires, from asynchronous replication to a second site through to stretched erasure coding across three sites that survives the loss of one. Match the choice to recovery objectives and bandwidth; geo-protection is not a substitute for immutability.

Which policy and access decisions get skipped?

Skipping lifecycle and bucket policy design

Symptom: buckets grow without bound, stale versions and expired backups consume capacity, and nobody can say what is safe to delete.

Fix: define lifecycle policies per bucket before data arrives: expiration for transient data, cleanup of incomplete multipart uploads, noncurrent version expiry, and object lock retention modes where immutability is required. These are far easier to set on an empty bucket than to retrofit on a full one.

Weak identity and access management

Symptom: one root key sits in every application config, never rotated, and a single compromised host can delete every bucket.

Fix: treat S3 credentials as privileged identities. Create per-application identities with least-privilege bucket policies scoped to prefixes and actions, rotate on a schedule, and integrate with a central identity provider. Enable object lock on backup buckets so a stolen key cannot erase recovery data.

Why does S3 compatibility need testing with the real applications?

Assuming "S3-compatible" means compatible with your application

Symptom: the platform passes a generic conformance suite, but the backup application fails on object lock, or a multipart edge case appears only under load.

Fix: the S3 API is large and implemented in subsets. Run the actual applications at representative scale in a proof of concept, prefer platforms validated by the application vendors that matter, and confirm the specific features in use: versioning, object lock modes, tagging and notifications.

Pitfalls at a glance

PitfallSymptomFix
Undersizing for small objectsMetadata tier exhausted while raw capacity is freeSize on object count; flash for metadata
Treating it like a NASLocking, rename and append misbehaveObject-native patterns, or keep the workload on file
Ignoring network designThroughput collapses during rebuildsDedicated back-end network sized for rebuild plus clients
Erasure coding chosen by efficiency aloneLong degraded windows; a rack event exceeds toleranceChoose by failure domain and rebuild time; test it
Single-site deploymentAll copies share one site-level riskReplication or stretched erasure coding across sites
No lifecycle or bucket policiesUnbounded growth; unclear what can be deletedDefine retention, expiry and object lock before go-live
Shared root keysOne compromised host can delete everythingPer-application identities, least privilege, rotation
Untested S3 compatibilityApplication fails on a specific API behavior in productionProof of concept with real applications; vendor validation

When is object storage the wrong tool?

Some pitfalls are placement mistakes. Object storage trades per-operation latency and in-place modification for throughput, capacity and durability. It is the wrong primary tier for:

  • Transactional databases issuing small random writes with millisecond commit expectations. Live data belongs on block; backups belong on object.
  • Latency-sensitive block workloads such as virtual machine volumes or anything that performs partial overwrites of large files.
  • Applications built around POSIX locking or shared-write semantics, including many legacy collaboration tools.

A pre-deployment checklist

  • Do we know the object count and size distribution, not just the capacity?
  • Which applications depend on locking, rename or append, and where will they live?
  • Is the back-end network sized for rebuild traffic alongside client traffic?
  • Which failure domain must erasure coding survive, and how long is the largest rebuild?
  • Are lifecycle and object lock rules defined per bucket before data arrives?
  • Does every application have its own least-privilege identity?
  • How will nodes be refreshed in year four without a migration project?

How Scality RING and ARTESCA address these pitfalls

Scality RING is software-defined, scale-out object and file storage used at petabyte to exabyte scale. Its data protection can be placed across independent failure domains, including stretched multi-site configurations that survive the loss of a full site, and it supports mixed hardware generations so refresh is a rolling operation rather than a migration. Native file access alongside S3 gives POSIX-dependent workloads a place to live.

Scality ARTESCA is S3 object storage built for backup, with object lock immutability and validation with major backup applications. That validation speaks directly to the compatibility pitfall, and immutability protects recovery data when a credential is compromised. Both support multi-site deployment within Scality's cyber resilience approach.

The practical takeaway: before the first node is racked, write down the object count, the failure domain, the rebuild time and the bucket policies, and treat any blank on that list as the first problem to solve.