Quay lại danh sách
Tin tức công nghệ

Triển khai FerretDB trên VPS: Giải pháp thay thế MongoDB hoàn hảo bằng PostgreSQL Backend

29 tháng 5, 2026

Giới thiệu về FerretDB và bài toán thay thế MongoDB

Trong kỷ nguyên ứng dụng hiện đại, cơ sở dữ liệu NoSQL, đặc biệt là MongoDB, đã trở thành sự lựa chọn hàng đầu của các nhà phát triển nhờ vào cấu trúc tài liệu (document-based) linh hoạt, khả năng mở rộng tốt và cú pháp truy vấn trực quan. Tuy nhiên, kể từ khi MongoDB thay đổi giấy phép mã nguồn mở sang Server Side Public License (SSPL) vào năm 2018, nhiều doanh nghiệp và nhà phát triển đã rơi vào thế tiến thoái lưỡng nan về mặt pháp lý và chi phí bản quyền khi muốn thương mại hóa ứng dụng của mình trên quy mô lớn.

Để giải quyết bài toán này mà không phải viết lại toàn bộ mã nguồn của hệ thống (refactoring), FerretDB đã ra đời như một giải pháp cứu cánh hoàn hảo. FerretDB là một proxy mã nguồn mở (open-source proxy) chuyển đổi các giao thức và truy vấn của MongoDB thành ngôn ngữ SQL. Điểm đặc biệt là FerretDB sử dụng PostgreSQL làm backend lưu trữ dữ liệu cốt lõi, nhưng lại cung cấp một giao thức giao tiếp hoàn toàn tương thích với driver và công cụ của MongoDB.

Bài viết này sẽ hướng dẫn chi tiết từ lý thuyết đến thực hành cách triển khai FerretDB trên một máy chủ ảo cá nhân (VPS), giúp bạn sở hữu một hệ thống cơ sở dữ liệu mạnh mẽ, đáng tin cậy của PostgreSQL nhưng vận hành mượt mà bằng cú pháp MongoDB.

Tại sao nên kết hợp FerretDB và PostgreSQL?

Việc kết hợp giữa giao diện lập trình của MongoDB và nền tảng lưu trữ của PostgreSQL mang lại nhiều lợi ích chiến lược cho các dự án phần mềm của doanh nghiệp:

  • Tận dụng hệ sinh thái PostgreSQL vững chắc: PostgreSQL là một trong những hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) mạnh mẽ, an toàn và có lịch sử phát triển lâu đời nhất. Bạn sẽ được hưởng lợi từ các tính năng nâng cao như ACID compliance tuyệt đối, cơ chế backup/restore ổn định và các công cụ quản lý chuyên nghiệp.
  • Giữ nguyên mã nguồn ứng dụng: Do FerretDB hỗ trợ giao thức dây (wire protocol) của MongoDB, các ứng dụng hiện tại đang sử dụng MongoDB driver (Node.js, Python, Java, Go,...) có thể kết nối trực tiếp tới FerretDB chỉ bằng cách thay đổi chuỗi kết nối (Connection String) mà không cần sửa đổi bất kỳ dòng code nào.
  • Giải quyết triệt để vấn đề bản quyền: FerretDB được phát hành dưới giấy phép mã nguồn mở Apache 2.0, hoàn toàn miễn phí và không bị ràng buộc bởi các điều khoản khắt khe của SSPL từ MongoDB.
  • Tối ưu hóa tài nguyên trên VPS: Thay vì phải chạy cả hai hệ thống cơ sở dữ liệu độc lập cho các nhu cầu dữ liệu quan hệ và phi quan hệ khác nhau, bạn có thể hợp nhất tất cả về một backend PostgreSQL duy nhất, giảm thiểu dung lượng RAM và CPU tiêu thụ trên VPS.

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

Mô hình hoạt động của FerretDB tương đối đơn giản nhưng vô cùng hiệu quả. Khi ứng dụng của bạn thực hiện một lệnh truy vấn dạng NoSQL (ví dụ: db.collection.find()), truy vấn này sẽ được gửi tới cổng lắng nghe của FerretDB. Tại đây, FerretDB đóng vai trò như một bộ dịch (translator), phân tích cú pháp lệnh MongoDB và chuyển đổi nó thành các câu lệnh SQL tương đương (chẳng hạn như sử dụng kiểu dữ liệu jsonb của PostgreSQL) rồi thực thi trên cơ sở dữ liệu PostgreSQL backend. Sau khi nhận kết quả từ PostgreSQL, FerretDB định dạng lại dữ liệu thành cấu trúc BSON của MongoDB và phản hồi về cho ứng dụng.

FerretDB không cố gắng bắt chước cấu trúc lưu trữ nội bộ của MongoDB, mà nó tập trung vào việc mô phỏng chính xác hành vi giao tiếp và kết quả trả về của các API MongoDB dựa trên nền tảng lưu trữ siêu việt của PostgreSQL.

Hướng dẫn chi tiết các bước triển khai FerretDB trên VPS

Để triển khai giải pháp này, chúng ta sẽ sử dụng một VPS chạy hệ điều hành Ubuntu (phiên bản 22.04 LTS hoặc mới hơn) và áp dụng phương pháp triển khai thông qua Docker và Docker Compose để đảm bảo tính đóng gói, dễ dàng quản lý và nâng cấp.

Bước 1: Chuẩn bị môi trường trên VPS

Trước tiên, hãy kết nối SSH vào VPS của bạn và cập nhật hệ thống lên phiên bản mới nhất:sudo apt update && sudo apt upgrade -y

Tiếp theo, tiến hành cài đặt Docker và Docker Compose nếu VPS của bạn chưa có sẵn:sudo apt install docker.io docker-compose -y sudo systemctl start docker sudo systemctl enable docker

Bước 2: Cấu hình file Docker Compose

Tạo một thư mục dự án riêng biệt để lưu trữ cấu hình hệ thống FerretDB:mkdir ferret-db-vps && cd ferret-db-vps

Tạo file docker-compose.yml bằng trình chỉnh sửa nano hoặc vim:nano docker-compose.yml

Hãy sao chép và dán đoạn cấu hình chuẩn dưới đây vào file của bạn:version: '3.8' services: postgres: image: postgres:16-alpine container_name: postgres_backend environment: POSTGRES_USER: ferret_admin POSTGRES_PASSWORD: SecurePassword2026 POSTGRES_DB: ferretdb_store volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" networks: - ferret_network ferretdb: image: ghcr.io/ferretdb/ferretdb:latest container_name: ferretdb_proxy restart: always ports: - "27017:27017" environment: - FERRETDB_POSTGRESQL_URL=postgres://ferret_admin:SecurePassword2026@postgres:5432/ferretdb_store networks: - ferret_network depends_on: - postgres volumes: pgdata: networks: ferret_network: driver: bridge

Lưu ý quan trọng bảo mật: Trong môi trường thực tế, hãy thay đổi giá trị SecurePassword2026 thành một mật khẩu mạnh mẽ và phức tạp hơn để bảo vệ cơ sở dữ liệu của bạn khỏi các cuộc tấn công quét cổng.

Bước 3: Khởi chạy hệ thống FerretDB

Sau khi đã lưu file cấu hình, hãy khởi chạy các container bằng lệnh sau:sudo docker-compose up -d

Hệ thống sẽ tự động tải xuống các image của PostgreSQL 16 và FerretDB bản mới nhất, sau đó thiết lập cấu hình kết nối. Bạn có thể kiểm tra trạng thái hoạt động của các dịch vụ bằng lệnh:sudo docker-compose ps

Nếu cả hai container đều hiển thị trạng thái Up, tức là FerretDB đã sẵn sàng đón nhận các kết nối theo chuẩn giao thức MongoDB ở cổng mặc định 27017.

Kiểm tra kết nối bằng MongoDB Shell (mongosh)

Để chứng minh tính tương thích hoàn hảo của FerretDB, chúng ta có thể sử dụng công cụ dòng lệnh chính thức của MongoDB là mongosh để kết nối và thao tác dữ liệu.

Nếu chưa cài đặt mongosh trên VPS, bạn có thể sử dụng trực tiếp môi trường Docker để chạy lệnh kiểm tra nhanh:sudo docker run --rm -it --network ferret-db-vps_ferret_network rtlong/mongosh-client mongosh "mongodb://ferretdb:27017/test_db"

Khi đã vào được giao diện dòng lệnh của MongoDB, bạn hãy thử thực hiện chuỗi thao tác thêm mới và tìm kiếm tài liệu chuẩn NoSQL sau:// 1. Thêm một tài liệu vào collection db.customers.insertOne({ name: "Công ty Công nghệ ABC", sector: "Fintech", active: true }); // 2. Truy vấn tìm kiếm tài liệu vừa thêm db.customers.find({ sector: "Fintech" });

Bạn sẽ thấy kết quả trả về có cấu trúc định dạng JSON kèm theo trường tự động sinh _id hoàn toàn giống hệt như khi bạn đang tương tác với một máy chủ MongoDB thực thụ. Tuy nhiên, trên thực tế, toàn bộ bản ghi này đã được lưu vào một bảng dữ liệu quan hệ trong PostgreSQL dưới dạng trường dữ liệu JSONB.

Kết nối ứng dụng thực tế (Ví dụ với Node.js)

Đối với các lập trình viên, điều tuyệt vời nhất là bạn không cần thay đổi thư viện kết nối. Dưới đây là ví dụ minh họa cách một ứng dụng Node.js sử dụng driver chính thức mongodb kết nối tới cụm FerretDB vừa tạo:const { MongoClient } = require('mongodb'); const url = 'mongodb://ferret_admin:SecurePassword2026@:27017/ferretdb_store?authMechanism=PLAIN'; const client = new MongoClient(url); async function run() { try { await client.connect(); console.log("Kết nối thành công tới FerretDB proxy!"); const database = client.db('enterprise_data'); const movies = database.collection('logs'); const result = await movies.insertOne({ timestamp: new Date(), level: 'INFO', message: 'Hệ thống vận hành ổn định.' }); console.log(`Đã ghi nhận log với id: ${result.insertedId}`); } finally { await client.close(); } } run().catch(console.dir);

Điểm lưu ý duy nhất là cơ chế xác thực của FerretDB hiện tại yêu cầu chỉ định rõ cơ chế qua tham số authMechanism=PLAIN trong chuỗi kết nối tùy thuộc vào phiên bản cấu hình bảo mật của bạn.

Đánh giá hiệu năng và những lưu ý khi vận hành thực tế

Mặc dù FerretDB là một bước đột phá lớn, các kiến trúc sư phần mềm cần lưu ý một số điểm cốt lõi trước khi đưa vào môi trường sản xuất lớn (Production):

  • Hiệu năng dịch truy vấn: Vì phải đi qua một lớp proxy trung gian để chuyển đổi từ cú pháp NoSQL sang SQL, hiệu năng xử lý (thời gian phản hồi truy vấn) có thể sẽ có độ trễ nhẹ (latency) so với việc kết nối trực tiếp vào PostgreSQL bằng SQL thuần hoặc so với MongoDB nguyên bản trong các tác vụ có tần suất đọc/ghi cực lớn (High-throughput).
  • Mức độ hoàn thiện của API: FerretDB đang được phát triển rất tích cực và liên tục cập nhật. Hầu hết các lệnh cơ bản như find, insert, update, delete cũng như hệ thống chỉ mục (indexes) cơ bản đều hoạt động hoàn hảo. Tuy nhiên, một số toán tử phức tạp của framework Aggregation nâng cao của MongoDB có thể chưa được hỗ trợ đầy đủ. Hãy thường xuyên kiểm tra bảng tương thích lệnh trên trang chủ của FerretDB.
  • Chiến lược Backup: Điểm cộng lớn là bạn không cần lo lắng về việc backup dữ liệu MongoDB phức tạp nữa. Hãy tập trung thiết lập các tiến trình sao lưu định kỳ cho PostgreSQL backend bằng công cụ tiêu chuẩn như pg_dump hoặc các giải pháp replication của PostgreSQL. Khi khôi phục PostgreSQL, toàn bộ dữ liệu NoSQL trong giao tiếp MongoDB của bạn cũng tự động được phục hồi nguyên vẹn.

Lời kết

Triển khai FerretDB trên VPS với PostgreSQL làm backend là một giải pháp kiến trúc vô cùng thông minh và kinh tế cho các doanh nghiệp vừa và nhỏ, cũng như các startup công nghệ. Giải pháp này giúp bạn thoát khỏi những rủi ro pháp lý về mặt bản quyền của MongoDB, tận dụng tối đa sức mạnh và độ bền vững của PostgreSQL, trong khi vẫn giữ nguyên được sự linh hoạt và thói quen lập trình tốc độ cao của NoSQL Document Database. Hãy thử nghiệm triển khai ngay hôm nay trên hệ thống VPS của bạn để trải nghiệm sự giao thoa công nghệ tuyệt vời này.

Triển khai FerretDB trên VPS: Giải pháp thay thế MongoDB hoàn hảo bằng PostgreSQL Backend | DPTCloud