Learn OpenStack · reference/decision-guides
Choose an Object Storage Backend
OpenStack object storage can be served by Swift (the native OpenStack object storage service) or by Ceph RADOS Gateway (RadosGW/RGW), which provides S3-compatible and Swift-compatible APIs on top of a Ceph cluster.
Feature Comparison
| Feature | Swift | Ceph RadosGW (RGW) |
|---|---|---|
| S3 API | Partial (via s3api middleware, most S3 operations) |
Full S3 compatibility including ACLs, multipart, versioning |
| Swift API | Native | Compatible (Swift API implemented on top of RGW) |
| Standalone deployment | Yes (no other services needed) | No (requires a running Ceph cluster) |
| Erasure coding | Yes (EC policies) | Yes (per-pool EC) |
| Multi-site replication | Yes (native async replication between regions) | Yes (multi-zone, multi-region with sync agents) |
| Object versioning | Yes (X-Versions-Location) | Yes (S3 versioning API) |
| Object expiration | Yes (X-Delete-At / X-Delete-After) | Yes (lifecycle policies) |
| Static website hosting | Yes | Yes |
| Encryption at rest | Yes (server-side, KMIP/Barbican) | Yes (SSE-S3, SSE-KMS) |
| Access control | Swift ACLs, Keystone integration | S3 ACLs, bucket policies, Keystone integration |
| Performance | Good (scales with nodes) | Good (scales with Ceph OSDs) |
| Minimum nodes | 5 (3 storage + 2 proxy recommended) | Depends on Ceph cluster (min 3 OSD nodes) |
| Operational model | Dedicated Swift cluster | Shared Ceph cluster (RGW is one Ceph component) |
| Monitoring | Swift-specific metrics | Ceph dashboard, Prometheus exporter |
| Complexity | Medium (Swift-specific rings and config) | High if Ceph is new; Low if Ceph already deployed |
| Best when | Dedicated object storage needed, no Ceph, maximum Swift API fidelity | Already running Ceph for block (Cinder RBD) or images (Glance) |
Recommendation by Use Case
No Existing Ceph, Object Storage Only
Use Swift. Swift is purpose-built for object storage, requires no other infrastructure, and has excellent multi-site replication support. It handles very large clusters (petabytes) well with consistent hashing (rings).
Already Running Ceph for Block or Images
Use Ceph RadosGW. Adding RGW to an existing Ceph cluster is low incremental cost — the OSDs are already there. You gain S3 compatibility with a single infrastructure investment.
Strong S3 API Compatibility Required
Use Ceph RadosGW. RGW's S3 compatibility is broad and frequently tested against the S3 test suite. Swift's s3api middleware covers most operations but has gaps, especially around ACL syntax and some multipart edge cases.
OpenStack-Native Swift API Required
Use Swift. Applications using Swift-specific features (DLO, SLO, bulk operations, form POST middleware, Swift container sync) should use Swift natively. RGW's Swift compatibility is good but not identical.
Multi-site Object Storage
Both support multi-site, but the topology models differ:
- Swift: Ring-based consistency, async replication between regions via
container-syncor Global Cluster (separate ring per region with inter-region proxy). - Ceph RGW: Zone/zonegroup model with RGW sync agents. Easier to manage via the
radosgw-adminCLI and Ceph dashboard.
For new multi-site deployments with existing Ceph, prefer RGW. For pure object-storage multi-site without Ceph, prefer Swift.
Swift Architecture Overview
Swift has three storage daemons (account, container, object) and one or more proxy servers:
Clients → Swift Proxy (HAProxy/LB) → Swift Proxy Nodes
→ Account/Container/Object nodes
→ (Ceph, local disks, or EC storage policies)
Key Swift Commands
# Check cluster health
swift-ring-builder /etc/swift/object.builder
swift-ring-builder /etc/swift/container.builder
swift-ring-builder /etc/swift/account.builder
# Check dispersion
swift-dispersion-report
# Check replication status
swift-recon --replication --verbose
swift-recon --diskusage
# List containers and objects
openstack container list
openstack object list <CONTAINER>
openstack object show <CONTAINER> <OBJECT>
# Upload and download
openstack object create <CONTAINER> <LOCAL_FILE>
openstack object save <CONTAINER> <OBJECT> --file <LOCAL_PATH>
Ceph RadosGW Architecture Overview
RGW is a Ceph component that exposes S3 and Swift HTTP APIs backed by RADOS:
Clients → RGW (Beast frontend, multiple instances behind HAProxy)
→ RADOS (shared with RBD/CephFS if present)
→ OSD nodes
Key RGW Commands
# RGW daemon status
systemctl status ceph-radosgw@rgw.<hostname>.*
# List users
radosgw-admin user list
radosgw-admin user info --uid=<USER>
# List buckets
radosgw-admin bucket list
radosgw-admin bucket stats --bucket=<BUCKET>
# Zone/zonegroup status
radosgw-admin zone get
radosgw-admin zonegroup get
radosgw-admin sync status
# Pool usage
rados df | grep "rgw\|default"
# RGW log
journalctl -u ceph-radosgw@rgw.$(hostname).rgw0 --since "10 minutes ago"
Glance with Object Storage Backend
Both Swift and RGW can back Glance image storage:
Swift backend:
# /etc/glance/glance-api.conf
[glance_store]
stores = swift
default_store = swift
swift_store_auth_address = http://<KEYSTONE_HOST>:5000/v3
swift_store_user = service:glance
swift_store_key = <GLANCE_PASSWORD>
swift_store_container = glance
swift_store_create_container_on_put = true
RGW backend (S3 interface):
# /etc/glance/glance-api.conf
[glance_store]
stores = s3
default_store = s3
s3_store_host = http://<RGW_HOST>:7480
s3_store_access_key = <ACCESS_KEY>
s3_store_secret_key = <SECRET_KEY>
s3_store_bucket = glance
s3_store_create_bucket_on_put = true
Operational Checks
# Swift — overall health
swift-recon -a # all checks
swift-recon --md5 # ring file consistency
# Swift — per-node disk usage
swift-recon --diskusage | sort -k5 -rn | head -20
# RGW — S3 API health check
curl -s http://<RGW_HOST>:7480/
# Should return S3 ListAllMyBuckets XML
# RGW — sync status (multi-site)
radosgw-admin sync status
# Look for: "realm", "data is caught up with source", no errors