Skip to content

File Storage + Object Storage

Mở đầu

User upload avatar, bạn lưu vào folder /uploads server — rồi server đầy disk, hoặc thêm server thứ 2, user thấy avatar lúc có lúc không. File storage tưởng đơn giản, nhưng trong distributed env là vấn đề architecture nghiêm túc. Object storage = giải pháp chuẩn cho Internet era.

Bạn sẽ học:

  • Storage types: block, file, object — khác biệt + scenario
  • Object storage core: Bucket, Object, Key, Pre-signed URL
  • Upload design: client direct vs server transit
  • CDN: tăng tốc static resource global
  • Best practices: naming, permission, lifecycle

0. Toàn cảnh: sao không lưu file ở server local?

Bắt đầu project, lưu file user upload vào folder local là instinctive. Nhưng:

  • Disk có hạn: server disk sẽ đầy, scale phiền
  • Multi-server không share: load balance → request có thể đến server khác, file không thấy
  • No backup: server chết → file mất
  • No CDN: user toàn cầu access server đơn, chậm

Giá trị object storage

Object storage (AWS S3, Cloudflare R2, MinIO) giải hết: capacity vô hạn, global access, auto backup, CDN-friendly native. Là de-facto standard.


1. Storage types: block, file, object

3 cách storage chính:

存储类型对比
点击查看不同存储方式的特点
🧱
块存储
📁
文件存储
☁️
对象存储
对象存储
通过 HTTP API 存取文件(对象),每个对象有唯一 Key。扁平结构,无目录层级。容量几乎无限,成本最低,是互联网应用的首选。
访问方式
HTTP/HTTPS RESTful API(PUT/GET/DELETE)
典型场景
图片、视频、备份、静态网站托管、数据湖
代表产品
AWS S3、阿里云 OSS、MinIO、Cloudflare R2
扩展性
近乎无限扩展,自动分布式存储
DimBlockFileObject
Data unitBlock size cố địnhFile + folderObject (Key-Value)
ProtocoliSCSI/FCNFS/SMBHTTP REST API
PerfCao nhất (ms)TrungThấp hơn (đủ)
ScaleCó hạnTrungGần vô hạn
CostCao nhấtTrungThấp nhất
UseDBShared fileImage/video/backup

Memory đơn giản

  • Block = ổ cứng — cho DB
  • File = network shared folder — share config multi-server
  • Object = cloud storage — cho file user upload (image, video)

2. Object storage core

Data model đơn giản: Bucket = container, Object = file, mỗi object có Key unique.

my-app-bucket/                    ← Bucket
├── avatars/user-123.jpg          ← Object Key
├── avatars/user-456.png          ← Object Key
├── reports/2024/q1-report.pdf    ← Object Key
└── uploads/temp/file.zip         ← Object Key
ConceptNoteVd
BucketContainer, global unique namemy-app-prod
ObjectFile body + metadata1 image, 1 PDF
KeyUnique identifieravatars/user-123.jpg
MetadataInfo kèmContent-Type, custom tag
ACLAccess controlpublic-read, private
Pre-signed URLTemp authorized URL15 min upload/download

Object storage không có "folder" thật

avatars/user-123.jpgavatars/ không phải folder, chỉ là prefix của Key. Object storage là flat structure, mọi object cùng level. Console "folder" chỉ là visual group by prefix.


3. Upload: ai upload?

2 cách: server transit + client direct upload. Đa số scenario, client direct tốt hơn.

文件上传方式对比
点击切换查看两种上传方式的流程差异
1
客户端 → 服务器
用户选择文件,上传到你的后端服务器
大文件会占用服务器带宽和内存
2
服务器接收文件
后端将文件暂存到本地磁盘或内存
可能触发 Nginx 的 body size 限制
3
服务器 → OSS
后端再将文件转发到对象存储
文件传输了两次,效率低
4
OSS 返回 URL
对象存储返回文件的访问地址
5
服务器 → 客户端
后端将文件 URL 返回给前端

Client direct lợi

  1. Tiết kiệm bandwidth server: file không qua server, thẳng OSS
  2. Tránh timeout: file lớn không trigger Nginx/gateway timeout
  3. Giảm load server: server chỉ sign credential, không xử file stream
  4. Resume upload: OSS hỗ trợ multipart upload native

Step: FE request BE lấy Pre-signed URL → FE upload URL đó thẳng OSS → OSS callback notify BE.


4. CDN: tăng tốc global

User toàn cầu → download từ origin chậm. CDN deploy edge node toàn cầu, cache file gần user nhất → giảm latency mạnh.

CDN 加速原理
对比有无 CDN 时的文件访问路径
👤
北京用户
5ms
北京 CDN 节点
缓存命中
缓存未命中时回源
🏢
源站(美西 S3)
首字节时间 (TTFB)
~30ms
下载 1MB 图片
~50ms
ConceptNote
Edge nodeCache server toàn cầu
Origin pullEdge không có cache → request origin
Cache hit rateTỷ lệ request được edge serve, càng cao càng tốt
TTLCache validity, hết phải re-pull
Cache purgeChủ động clear edge cache, file mới có hiệu lực

CDN best practice

  • Filename hash: logo.a3f2b1.png thay logo.png. Update file không cần purge cache.
  • TTL hợp lý: static (JS/CSS/image) TTL dài (1 năm), HTML TTL ngắn (5 phút)
  • Gzip/Brotli: text resource giảm 60-80% size

5. Best practice

PracticeNoteVd
Key namingPrefix có nghĩa{type}/{date}/{uuid}.{ext}
Avoid hot keyĐừng đầu bằng số tăngUUID hoặc hash prefix
Min permissionBucket default privateChỉ public khi cần
LifecycleAuto clean expiredTemp file 7 ngày auto xoá
CORSDirect upload cần configAllow domain bạn PUT/POST
Server-side encryptionFile sensitive bật SSESSE-S3 hoặc SSE-KMS

Tổng kết

  1. 3 type: block (DB), file (shared), object (user file)
  2. Object storage model: Bucket + Key + Object, flat, HTTP API
  3. Client direct upload: Pre-signed URL
  4. CDN: edge cache + hash filename → fast global
  5. Security: min permission, lifecycle, SSE

2026 cho VN dev

  • Cloud option:
    • AWS S3: chuẩn, đắt nhất, ecosystem mạnh
    • Cloudflare R2: zero egress fee (rẻ nhất nếu serve traffic nhiều)
    • Backblaze B2: rẻ + S3-compatible
    • DigitalOcean Spaces: đơn giản, free CDN
    • VN cloud: Viettel Cloud Storage, FPT Object Storage, VNG Cloud
  • Self-host: MinIO (S3-compatible, open-source)
  • Edge upload: Vercel Blob, Cloudflare R2 + Workers
  • VN context: image-heavy site (e-commerce) → CDN VN-friendly (BunnyCDN, Cloudflare APAC)
  • AI use case: lưu image input cho VLM, audio cho ASR

Tài liệu