Skip to content

Lưu trữ tệp và Lưu trữ đối tượng

Lời mở đầu

Người dùng tải lên một ảnh đại diện, bạn lưu nó vào thư mục /uploads trên máy chủ — rồi ổ đĩa máy chủ đầy, hoặc bạn thêm máy chủ thứ hai, người dùng phát hiện ảnh đại diện lúc có lúc không. Lưu trữ tệp tưởng chừng đơn giản, nhưng trong môi trường phân tán lại là một vấn đề kiến trúc cần được xem xét nghiêm túc. Lưu trữ đối tượng chính là câu trả lời tiêu chuẩn cho vấn đề này trong thời đại Internet.

Bài viết này sẽ dạy bạn điều gì?

Sau khi học xong chương này, bạn sẽ có được:

  • Nhận thức về loại hình lưu trữ: Hiểu sự khác biệt và tình huống áp dụng của lưu trữ khối, lưu trữ tệp và lưu trữ đối tượng
  • Khái niệm cốt lõi về lưu trữ đối tượng: Nắm vững các khái niệm cốt lõi như Bucket, Object, Key, Pre-signed URL
  • Thiết kế giải pháp tải lên: Học cách lựa chọn giữa tải lên trực tiếp từ client và tải lên qua máy chủ trung gian
  • Nguyên lý tăng tốc CDN: Hiểu cách CDN tăng tốc phân phối tài nguyên tĩnh toàn cầu
  • Thực tiễn tốt nhất: Nắm vững các kỹ thuật thực chiến như đặt tên tệp, kiểm soát quyền, quản lý vòng đời
ChươngNội dungKhái niệm cốt lõi
Chương 1So sánh các loại hình lưu trữLưu trữ khối, lưu trữ tệp, lưu trữ đối tượng
Chương 2Khái niệm cốt lõi về lưu trữ đối tượngBucket, Object, Key, metadata
Chương 3Giải pháp tải tệp lênTải lên trực tiếp từ client, Pre-signed URL
Chương 4Tăng tốc CDNNode biên, chiến lược cache, truy xuất nguồn gốc
Chương 5Thực tiễn tốt nhấtQuy ước đặt tên, quyền hạn, vòng đời

0. Toàn cảnh: Tại sao không thể lưu tệp cục bộ trên máy chủ?

Khi mới bắt đầu làm dự án, việc lưu tệp người dùng tải lên vào thư mục cục bộ của máy chủ là cách làm trực quan nhất. Nhưng khi dự án phát triển, bạn sẽ gặp một loạt vấn đề:

  • Không gian ổ đĩa có hạn: Ổ đĩa máy chủ sẽ đầy, việc mở rộng rất phiền phức
  • Nhiều máy chủ không chia sẻ: Sau khi cân bằng tải, yêu cầu của người dùng có thể đến các máy chủ khác nhau, tệp không tìm thấy
  • Không có sao lưu: Máy chủ hỏng, tệp mất luôn
  • Không có CDN: Người dùng toàn cầu truy cập cùng một máy chủ, tốc độ chậm

Giá trị cốt lõi của lưu trữ đối tượng

Lưu trữ đối tượng (như AWS S3, Alibaba Cloud OSS) giải quyết tất cả những vấn đề này: dung lượng không giới hạn, có thể truy cập toàn cầu, tự động sao lưu, hỗ trợ CDN tự nhiên. Nó đã trở thành tiêu chuẩn thực tế cho việc lưu trữ tệp trong ứng dụng Internet.


1. So sánh các loại hình lưu trữ: Khối, Tệp, Đối tượng

Trong thế giới máy tính có ba cách lưu trữ chính, chúng giải quyết các vấn đề ở các cấp độ khác nhau.

Storage Type Comparison
Click to inspect the characteristics of each storage model
🧱
Block storage
📁
File storage
☁️
Object storage
Object storage
Stores files as objects through HTTP APIs. Each object has a unique key. It has a flat structure, nearly unlimited capacity, and low cost, making it a common choice for internet applications.
Access method
HTTP/HTTPS RESTful API (PUT/GET/DELETE)
Typical scenarios
Images, videos, backups, static site hosting, data lakes
Representative products
AWS S3, Alibaba Cloud OSS, MinIO, Cloudflare R2
Scalability
Nearly unlimited scaling with automatic distributed storage
Khía cạnhLưu trữ khốiLưu trữ tệpLưu trữ đối tượng
Đơn vị dữ liệuKhối có kích thước cố địnhTệp + thư mụcĐối tượng (Key-Value)
Giao thức truy cậpiSCSI/FCNFS/SMBHTTP REST API
Hiệu năngCao nhất (mili giây)Trung bìnhThấp hơn (nhưng đủ dùng)
Khả năng mở rộngHạn chếTrung bìnhGần như không giới hạn
Chi phíCao nhấtTrung bìnhThấp nhất
Tình huống điển hìnhCơ sở dữ liệuTệp chia sẻẢnh/video/sao lưu

Ghi nhớ đơn giản

  • Lưu trữ khối giống ổ cứng — dùng cho cơ sở dữ liệu
  • Lưu trữ tệp giống thư mục chia sẻ mạng — dùng để chia sẻ cấu hình giữa nhiều máy chủ
  • Lưu trữ đối tượng giống ổ đĩa mạng — dùng cho ảnh, video người dùng tải lên

2. Khái niệm cốt lõi về lưu trữ đối tượng

Mô hình dữ liệu của lưu trữ đối tượng rất đơn giản: Bucket (thùng chứa) là container, Object (đối tượng) là tệp, mỗi đối tượng được xác định bằng một Key (khóa) duy nhất.

my-app-bucket/                    ← Bucket (thùng chứa)
├── avatars/user-123.jpg          ← Object Key
├── avatars/user-456.png          ← Object Key
├── reports/2024/q1-report.pdf    ← Object Key ("thư mục" chỉ là tiền tố của Key)
└── uploads/temp/file.zip         ← Object Key
Khái niệmMô tảVí dụ
BucketContainer lưu trữ, tên duy nhất toàn cụcmy-app-prod, company-assets
ObjectTệp được lưu trữ + metadataMột bức ảnh, một tệp PDF
KeyĐịnh danh duy nhất của đối tượngavatars/user-123.jpg
MetadataThông tin bổ sung của đối tượngContent-Type, nhãn tùy chỉnh
ACLDanh sách kiểm soát truy cậppublic-read, private
Pre-signed URLLiên kết ủy quyền truy cập tạm thờiLiên kết tải lên/tải xuống có hiệu lực 15 phút

Lưu trữ đối tượng không có "thư mục" thực sự

avatars/user-123.jpg trong đó avatars/ không phải là thư mục, chỉ là tiền tố của Key. Lưu trữ đối tượng có cấu trúc phẳng, tất cả đối tượng ở cùng một cấp. "Thư mục" hiển thị trên bảng điều khiển chỉ là hiệu ứng trực quan khi nhóm theo tiền tố.


3. Giải pháp tải tệp lên: Ai tải tệp?

Có hai giải pháp tải tệp lên chính: tải qua máy chủ trung gian và tải trực tiếp từ client. Đối với hầu hết tình huống, tải trực tiếp từ client là lựa chọn tốt hơn.

File Upload Method Comparison
Switch between upload modes to compare their flow
1
Client → Server
The user selects a file and uploads it to your backend server
Large files consume server bandwidth and memory
2
Server receives file
The backend temporarily stores the file on local disk or in memory
May hit Nginx body size limits
3
Server → OSS
The backend forwards the file to object storage
The file is transferred twice, which is inefficient
4
OSS returns URL
Object storage returns the file access URL
5
Server → Client
The backend returns the file URL to the frontend

Ưu điểm của tải trực tiếp từ client

  1. Tiết kiệm băng thông máy chủ: Tệp không đi qua máy chủ của bạn, trực tiếp đến OSS
  2. Tránh timeout: Tệp lớn sẽ không kích hoạt giới hạn timeout của Nginx/gateway
  3. Giảm tải máy chủ: Máy chủ chỉ cần cấp chứng chỉ, không cần xử lý luồng tệp
  4. Hỗ trợ tải lên tiếp tục: OSS hỗ trợ tải lên phân mảnh tự nhiên, frontend có thể triển khai tải lên tiếp tục

Các bước triển khai: Frontend yêu cầu backend lấy Pre-signed URL → Frontend dùng URL này tải trực tiếp lên OSS → OSS callback thông báo cho backend


4. Tăng tốc CDN: Làm cho người dùng toàn cầu đều nhanh

Khi người dùng của bạn phân bố toàn cầu, việc tải tệp từ một máy chủ nguồn duy nhất sẽ rất chậm. CDN (Content Delivery Network) bằng cách triển khai các node biên trên toàn cầu, lưu tệp vào bộ nhớ đệm ở node gần người dùng nhất, giảm đáng kể độ trễ truy cập.

How CDN Acceleration Works
Compare file access paths with and without CDN
👤
Beijing user
5ms
Beijing CDN node
Cache hit
Return to origin on cache miss
🏢
Origin (US West S3)
Time to first byte (TTFB)
~30ms
Download 1MB image
~50ms
Khái niệm CDNMô tả
Node biênMáy chủ cache phân bố trên toàn cầu
Truy xuất nguồn gốcKhi node biên không có cache, yêu cầu tệp từ máy chủ nguồn
Tỷ lệ cache hitTỷ lệ yêu cầu được node biên phản hồi trực tiếp, càng cao càng tốt
TTLThời gian hiệu lực của cache, hết hạn cần truy xuất nguồn gốc lại
Làm mới cacheChủ động xóa cache của node biên, để tệp mới có hiệu lực

Thực tiễn tốt nhất với CDN

  • Tên tệp thêm hash: logo.a3f2b1.png thay vì logo.png, như vậy khi cập nhật tệp không cần làm mới cache
  • Đặt TTL hợp lý: Tài nguyên tĩnh (JS/CSS/ảnh) đặt TTL dài (1 năm), HTML đặt TTL ngắn (5 phút)
  • Bật nén Gzip/Brotli: Tài nguyên dạng văn bản sau khi nén giảm 60-80% dung lượng

5. Thực tiễn tốt nhất

Thực tiễnMô tảVí dụ
Quy ước đặt tên KeyDùng tiền tố có ý nghĩa để tổ chức tệp{type}/{date}/{uuid}.{ext}
Tránh Key hotspotKhông dùng số tăng dần ở đầuDùng UUID hoặc tiền tố hash
Quyền tối thiểuBucket mặc định privateChỉ đặt public-read cho tệp cần công khai
Quy tắc vòng đờiTự động dọn dẹp tệp hết hạnTệp tạm thời tự động xóa sau 7 ngày
Cấu hình CORSFrontend tải trực tiếp cần cấu hình CORSCho phép PUT/POST từ tên miền của bạn
Mã hóa phía máy chủTệp nhạy cảm bật SSESSE-S3 hoặc SSE-KMS

Tổng kết

Lưu trữ tệp là vấn đề cơ bản mà mọi ứng dụng Web đều gặp phải. Lưu trữ đối tượng với đặc tính dung lượng không giới hạn, chi phí thấp, độ sẵn sàng cao, đã trở thành lựa chọn tiêu chuẩn cho ứng dụng Internet.

Ôn lại các điểm chính của chương này:

  1. Ba loại hình lưu trữ: Lưu trữ khối cho cơ sở dữ liệu, lưu trữ tệp cho chia sẻ, lưu trữ đối tượng cho tệp người dùng
  2. Mô hình lưu trữ đối tượng: Bucket + Key + Object, cấu trúc phẳng, truy cập qua HTTP API
  3. Tải trực tiếp từ client: Giải pháp Pre-signed URL, tệp không qua máy chủ, hiệu quả và tiết kiệm tài nguyên
  4. Tăng tốc CDN: Cache node biên + hash tên tệp, làm cho người dùng toàn cầu đều nhanh
  5. Bảo mật và quản lý: Quyền tối thiểu, quy tắc vòng đời, mã hóa phía máy chủ

Đọc thêm