Quản trị VPS

Lưu trữ tệp cho cụm Multi-Server: So sánh NFS, MinIO và S3

Đánh giá kỹ thuật giải pháp lưu trữ tệp tải lên cho cụm Multi-Server: phân tích rủi ro treo D-state của NFS, chi phí tự host MinIO và lợi ích của Cloudflare R2.

Lưu trữ tệp tải lên cho cụm Multi-Server so sánh NFS nội bộ MinIO và S3 Object Storage
MỤC LỤC

Khi triển khai cụm nhiều máy chủ Web phía sau bộ cân bằng tải Nginx theo lộ trình chuyển dịch Multi-Server, rào cản lớn nhất ngăn bạn mở rộng thêm máy chủ (Scale-Out) không phải là mã nguồn hay cơ sở dữ liệu, mà là nơi lưu trữ các tệp tải lên do người dùng tạo ra (Media / Uploads).

Trên một máy chủ đơn lẻ (Single-VPS), việc lưu trữ hình ảnh sản phẩm, avatar người dùng hay tệp đính kèm vào thư mục cục bộ (như wp-content/uploads/ trên WordPress hoặc storage/app/public/ trên Laravel) hoạt động ổn định. Nhưng khi đưa Web Node thứ hai vào hoạt động, một tình huống lỗi thường gặp sẽ xuất hiện: Người dùng A tải ảnh sản phẩm lên Web Node 01, nhưng khi người dùng B xem trang, Nginx Load Balancer điều phối họ sang Web Node 02. Do Web Node 02 không có tệp này trên ổ cứng cục bộ, trình duyệt sẽ nhận mã lỗi HTTP 404 Not Found.

Để xử lý triệt để vấn đề này và đưa cụm máy chủ Web về trạng thái phi trạng thái (Stateless), bạn cần tách rời toàn bộ dữ liệu tệp tải lên ra một tầng lưu trữ dùng chung độc lập. Hiện nay, có ba phương án kỹ thuật phổ biến: Network File System (NFS) qua mạng nội bộ, tự host MinIO Object Storage trên VPS riêng, và dịch vụ lưu trữ đối tượng đám mây (Cloudflare R2 / AWS S3).

Bài viết này phân tích bản chất cơ chế I/O, ưu nhược điểm kỹ thuật, nguy cơ lỗi dây chuyền và chi phí thực tế của từng phương án, giúp bạn lựa chọn giải pháp hạ tầng phù hợp và an toàn cho hệ thống.

So sánh 3 giải pháp lưu trữ tệp tin cho cụm Multi-Server

Giải pháp 1: Network File System (NFS v4) qua mạng nội bộ

Nguyên lý hoạt động và tính tương thích POSIX

NFS (Network File System) là giải pháp chia sẻ tệp lâu đời trên các hệ thống Linux. Người vận hành khởi tạo một máy chủ VPS riêng làm NFS Server, sau đó chia sẻ thư mục lưu trữ qua giao thức NFSv4 trên mạng nội bộ (Private Network). Trên mỗi Web Node, thư mục này được gắn kết (mount) trực tiếp vào cây thư mục cục bộ:

bash
# Lệnh mount thư mục NFS trên Web Node
sudo mount -t nfs4 -o proto=tcp,port=2049 10.0.0.40:/srv/shared_uploads /var/www/html/wp-content/uploads

Ưu điểm lớn nhất của NFS là tính tương thích hoàn toàn với chuẩn hệ thống tệp POSIX. Các hàm thao tác tệp tin tiêu chuẩn của ngôn ngữ lập trình (như file_exists(), is_readable(), fopen(), move_uploaded_file() trong PHP) tiếp tục hoạt động bình thường mà không cần sửa đổi mã nguồn, cài thêm plugin hay cấu hình lại SDK ứng dụng.

Rủi ro treo tiến trình ở trạng thái D-state

Dù thuận tiện khi triển khai ban đầu, NFS bộc lộ nhiều điểm nghẽn về độ ổn định khi website tiếp nhận lưu lượng truy cập lớn:

  1. Nghẽn RPC do kiểm tra metadata liên tục:

Trong các ứng dụng web động (như WordPress), để hiển thị một trang, hệ thống thường thực hiện nhiều lệnh kiểm tra thông tin tệp (stat(), lstat()). Trên ổ đĩa NVMe cục bộ, các lệnh này phản hồi trong vài micro-giây. Tuy nhiên trên NFS, mỗi lệnh stat() đều được đóng gói thành lời gọi thủ tục từ xa (RPC) gửi qua mạng nội bộ tới NFS Server. Khi có lượng lớn người dùng đồng thời, hàng đợi RPC trên NFS Server dễ bị ùn ứ, làm tăng độ trễ phản hồi trang (TTFB).

  1. Nguy cơ treo tiến trình ở trạng thái D-state (Uninterruptible Sleep):

Nếu máy chủ NFS khởi động lại, quá tải CPU hoặc mạng nội bộ bị rớt gói tin trong một khoảng thời gian ngắn, các tiến trình PHP-FPM hoặc Nginx trên Web Node đang thực hiện thao tác I/O qua NFS sẽ rơi vào trạng thái D-state (ngủ không thể ngắt của nhân Linux).

Các tiến trình này không thể bị dừng lại ngay cả khi gửi tín hiệu kill -9. Chúng giữ chặt các worker xử lý, khiến tài nguyên của toàn bộ Web Node nhanh chóng cạn kiệt chỉ sau vài phút. Cả hệ thống website có nguy cơ ngừng hoạt động do lỗi dây chuyền bắt nguồn từ máy chủ NFS.

  1. Nguy cơ cạn kiệt Inode do tệp nhỏ:

Như đã phân tích trong bài viết xử lý sự cố VPS bị đầy Inode dù ổ đĩa còn trống, các website sau một thời gian vận hành thường tích lũy hàng triệu bức ảnh nhỏ với nhiều kích thước ảnh thu nhỏ (thumbnails). Việc duy trì số lượng tệp nhỏ quá lớn trên hệ thống tệp ext4 hoặc XFS qua NFS làm suy giảm tốc độ duyệt thư mục và gây khó khăn cho quy trình sao lưu dữ liệu định kỳ.

Giải pháp 2: Tự host MinIO (S3-Compatible Object Storage)

Kiến trúc hoạt động

Để khắc phục nhược điểm khóa tệp và nguy cơ treo tiến trình của NFS, giải pháp tiếp theo là chuyển đổi từ giao thức chia sẻ tệp POSIX sang chuẩn Lưu trữ đối tượng (Object Storage) thông qua việc tự triển khai phần mềm mã nguồn mở MinIO trên máy chủ riêng.

Mọi tệp tải lên được lưu trữ dưới dạng một đối tượng (Object) gồm dữ liệu nhị phân, định danh duy nhất (Key) và siêu dữ liệu (Metadata). Ứng dụng web giao tiếp với MinIO thông qua giao thức HTTP REST API theo chuẩn Amazon S3 (sử dụng AWS SDK cho PHP, Node.js, Python hoặc Go).

Kiến trúc MinIO tự host với Erasure Coding

Ưu điểm so với NFS

  • Loại bỏ cơ chế khóa tệp POSIX: Giúp hạn chế rủi ro treo tiến trình ở trạng thái D-state. Khi dịch vụ MinIO gặp sự cố hoặc quá tải, ứng dụng Web chỉ nhận lại mã lỗi HTTP Timeout (có thể bắt và xử lý qua khối try-catch) thay vì làm tắc nghẽn toàn bộ tiến trình PHP-FPM hay Nginx.
  • Chuẩn hóa giao tiếp theo chuẩn S3 API: Ứng dụng tương tác với tầng lưu trữ qua AWS SDK tiêu chuẩn. Về sau, nếu chuyển dịch sang các dịch vụ lưu trữ đám mây, bạn chỉ cần cập nhật Endpoint và Access Key mà không phải viết lại mã nguồn.
  • Quyền tự chủ dữ liệu: Toàn bộ dữ liệu nằm trên hạ tầng máy chủ của doanh nghiệp, đáp ứng các yêu cầu tuân thủ dữ liệu nội bộ hoặc tiêu chuẩn bảo mật khắt khe của một số ngành đặc thù như tài chính, y tế.

Gánh nặng và chi phí vận hành

Dù là giải pháp lưu trữ đối tượng mã nguồn mở mạnh mẽ, việc tự vận hành MinIO trên môi trường sản xuất (Production) đòi hỏi nhiều công sức bảo trì và quản trị hạ tầng:

  • Ràng buộc cấu hình cho cơ chế Erasure Coding: Để đảm bảo an toàn dữ liệu khi xảy ra sự cố phần cứng ổ đĩa, MinIO khuyến nghị triển khai ở chế độ phân tán (Distributed Mode) với tối thiểu 4 ổ đĩa độc lập hoặc cụm 4 máy chủ. Việc chỉ chạy MinIO trên một ổ đĩa ảo duy nhất của VPS tiềm ẩn nguy cơ mất dữ liệu khi ổ đĩa bị lỗi.
  • Trách nhiệm bảo trì và sao lưu định kỳ: Quản trị viên cần tự thiết lập quy trình sao lưu dữ liệu theo các nguyên tắc sao lưu dữ liệu container, quản lý vòng đời nâng cấp phiên bản, giám sát dung lượng đĩa, thiết lập chứng chỉ SSL nội bộ và phân quyền truy cập chi tiết qua Bucket Policies.
  • Áp lực băng thông khi phân phối tệp: Nếu không cấu hình thêm tầng bộ đệm (cache) hoặc Nginx Reverse Proxy phía trước MinIO, mọi yêu cầu tải ảnh từ người dùng vẫn tiêu tốn băng thông mạng và tài nguyên I/O của hạ tầng máy chủ.

Giải pháp 3: Managed Object Storage (Cloudflare R2 / AWS S3)

Nguyên lý kiến trúc phân phối tệp hiện đại

Thay vì tự xây dựng và bảo trì hạ tầng lưu trữ tệp trên cụm máy chủ, mô hình được áp dụng rộng rãi cho hầu hết các website hiện đại là sử dụng dịch vụ lưu trữ đối tượng được quản lý (Managed Object Storage), tiêu biểu là Cloudflare R2 hoặc Amazon S3.

Trong kiến trúc này:

  1. Khi người dùng tải ảnh lên, Web Server tiếp nhận tệp và đẩy thẳng lên bucket của Cloudflare R2 thông qua S3 API.
  2. Đường dẫn tệp lưu trong cơ sở dữ liệu sẽ trỏ trực tiếp về một tên miền tĩnh chuyên trách (ví dụ: https://media.example.com/uploads/2026/10/product-01.jpg).
  3. Khi người dùng truy cập website xem ảnh, trình duyệt sẽ tải trực tiếp tệp từ mạng phân phối nội dung (CDN) của Cloudflare. Dữ liệu hình ảnh hoàn toàn không đi qua máy chủ Web Node.
Người dùng tải ảnh:
Client ──> Web Server ──(S3 API)──> Cloudflare R2 Bucket

Người dùng xem ảnh:
Client ──(HTTPS)──> Cloudflare Edge CDN ──> Cloudflare R2 Bucket
                         │
                         └─> (Tải tệp từ bộ nhớ đệm biên, 0% tải lên Web Node)

Ưu điểm của Cloudflare R2 về chi phí băng thông

Bên cạnh Amazon S3 vốn là dịch vụ phổ biến lâu năm, Cloudflare R2 đang là lựa chọn phù hợp cho nhiều hệ thống vừa và nhỏ nhờ chính sách chi phí dữ liệu tải ra:

  1. Miễn cước băng thông tải ra (Zero Egress Fees):

Trên Amazon S3 hoặc Google Cloud Storage, khoản chi phí cần lưu tâm lớn nhất thường không nằm ở dung lượng lưu trữ mà là cước dữ liệu tải ra ngoài (Data Egress), dao động từ 0.08 USD đến 0.09 USD cho mỗi GB. Nếu website phân phối 5 TB hình ảnh mỗi tháng, chi phí băng thông phát sinh có thể lên tới 400 – 450 USD. Cloudflare R2 giải quyết bài toán này nhờ chính sách miễn phí cước băng thông tải ra.

  1. Độ bền dữ liệu cao (Durability 99.999999999%):

Dữ liệu được nhân bản tự động trên hạ tầng của Cloudflare với cam kết độ bền 11 số 9 (99.999999999%). Cơ chế này giúp giảm thiểu tối đa rủi ro mất mát dữ liệu do sự cố phần cứng so với việc tự vận hành ổ đĩa đơn lẻ, đồng thời loại bỏ các thao tác quản trị phức tạp như cấu hình RAID hay xử lý lỗi phân vùng.

  1. Giảm tải cho cụm máy chủ web:

Toàn bộ hình ảnh và tệp tĩnh được CDN phân phối trực tiếp từ các máy chủ biên (Edge Nodes) đặt gần người dùng nhất. Máy chủ Web Node chỉ cần tập trung xử lý các request tạo HTML và dữ liệu động (JSON). Nhờ đó, khả năng phục vụ của cụm máy chủ web tăng lên rõ rệt mà chưa cần nâng cấp thêm vCPU hay RAM.

Ma trận so sánh 3 giải pháp lưu trữ

Bảng đối chiếu kỹ thuật dưới đây tổng hợp các đặc tính vận hành giữa 3 phương án để bạn dễ cân nhắc:

Tiêu chíNFS nội bộMinIO tự hostCloudflare R2 / S3
Tính tương thích mã nguồnThuận lợi (Native POSIX)Cần tích hợp S3 SDKCần tích hợp S3 SDK
Hiệu năng khi nhiều tệp nhỏKém (Nghẽn do RPC stat)TốtRất tốt (CDN Edge Cache)
Rủi ro lỗi dây chuyền (Cascade Failure)Cao (Nguy cơ treo D-state)Thấp (Có cơ chế API Timeout)Không có (Cô lập hoàn toàn)
Khả năng mở rộng dung lượngGiới hạn theo ổ cứng VPSCần mở rộng ổ cứng/nodeTự động mở rộng
Độ bền dữ liệu (Data Durability)Phụ thuộc vào Snapshot/RAIDPhụ thuộc Erasure CodingRất cao (11 số 9 - 99.999999999%)
Tải băng thông của Web ServerChịu cả tải lên và tải xuốngChịu cả tải lên và tải xuốngKhông tốn băng thông tải xuống (CDN xử lý)
Công sức vận hành và bảo trìTrung bình đến caoCaoRất thấp
Mức chi phí hạ tầng ước tính15 – 25 USD/tháng (1 VPS)40 – 80 USD/tháng (Cụm đĩa)0.015 USD/GB/tháng (Zero Egress)

Tiêu chí ra quyết định

Để lựa chọn giải pháp phù hợp với hệ thống thực tế, bạn có thể tham chiếu sơ đồ luồng kỹ thuật sau:

Cây quyết định lựa chọn giải pháp lưu trữ cho cụm máy chủ

1. Khi nào nên dùng NFS v4 nội bộ?

  • Phù hợp khi bạn đang duy trì hệ thống phần mềm cũ (Legacy ERP, ứng dụng đóng gói sẵn không có mã nguồn để sửa đổi) và không thể can thiệp vào tầng I/O đọc ghi tệp.
  • Dung lượng tệp tải lên ở mức vừa phải (dưới vài chục GB) và lượng truy cập đồng thời không quá lớn.

2. Khi nào nên tự host MinIO?

  • Khi tổ chức có chính sách bảo mật nội bộ nghiêm ngặt, yêu cầu dữ liệu phải lưu trữ hoàn toàn trong mạng riêng (On-Premise hoặc Private Cloud) và không được chuyển ra ngoài dịch vụ bên thứ ba.
  • Đội ngũ kỹ thuật có nhân sự am hiểu về lưu trữ phân tán, cơ chế Erasure Coding và có quy trình giám sát hệ thống liên tục.

3. Khi nào nên dùng Cloudflare R2 / AWS S3?

  • Phù hợp cho phần lớn các ứng dụng web hiện đại (WordPress, WooCommerce, Laravel, Node.js, Django).
  • Khi bạn muốn chuyển cụm máy chủ web sang trạng thái hoàn toàn phi trạng thái (stateless), không phải quản lý phân vùng ổ đĩa hay lo ngại tình trạng đầy đĩa cục bộ.
  • Mang lại hiệu quả chi phí tốt nhờ cắt giảm công sức vận hành hạ tầng lưu trữ, tạo điều kiện thuận lợi để mở rộng cụm máy chủ từ hai máy lên nhiều máy mà không làm phức tạp hóa tầng lưu trữ tệp.

Sau khi đã hoàn tất việc phi trạng thái hóa tệp tin tải lên và phân tách cơ sở dữ liệu, cụm máy chủ Web của bạn đã sẵn sàng cho quy trình phát hành phần mềm chuyên nghiệp. Hãy tiếp tục tìm hiểu kỹ thuật triển khai Zero-Downtime Deployment với Docker Blue/Green để cập nhật phiên bản mới mà không làm rớt bất kỳ kết nối nào của người dùng, hoặc rà soát toàn bộ các rủi ro kỹ thuật tại checklist an toàn trước khi chuyển đổi sang Multi-Server.

Nội dung hướng dẫn này có hữu ích với hệ thống của bạn không?

Chia sẻ bài viết hữu ích

Gửi bài viết này cho đồng nghiệp

Đọc tiếp

Bài nên đọc tiếp

Xem tất cả bài về Quản trị VPS