Hướng dẫn thiết lập và kết nối MongoDB từ xa (Remote MongoDB)
Tác giả: Đoạn Mã Khách
Đăng nhập để đánh giá bài viết

Trong nhiều hệ thống hiện đại—đặc biệt là các kiến trúc microservices—MongoDB thường được sử dụng như một lớp lưu trữ dữ liệu chính. Tuy nhiên, nếu bạn từng triển khai MongoDB trong môi trường production, bạn sẽ nhận ra một điều quan trọng:
Không nên chạy database chung server với ứng dụng.
Bài viết này sẽ giúp bạn đi từ tư duy kiến trúc đến cách triển khai thực tế để thiết lập một MongoDB server từ xa và kết nối tới nó một cách an toàn, ổn định.
Vì sao cần tách MongoDB ra server riêng?
Kể từ phiên bản 3.4, MongoDB sử dụng WiredTiger Storage Engine, vốn tiêu thụ RAM khá đáng kể. Cụ thể:
MongoDB sẽ sử dụng:
50% RAM (sau khi trừ 1GB)
hoặc tối thiểu 256MB
→ lấy giá trị lớn hơn
Điều này có nghĩa là nếu bạn chạy MongoDB cùng server với backend/service, tài nguyên sẽ bị cạnh tranh rất mạnh, dễ gây nghẽn hệ thống.
Giải pháp chuẩn: dùng một server riêng (remote DB server) và để các service kết nối vào.
Tổng quan quy trình thiết lập
Để dựng một MongoDB server từ xa hoàn chỉnh, bạn sẽ đi qua các bước chính:
Tạo server (EC2 hoặc bất kỳ cloud nào)
Tạo user và phân quyền database
Bật cơ chế authentication
Mở port kết nối
Test kết nối từ bên ngoài
1. Tạo server MongoDB
Bạn có thể dùng Amazon Web Services hoặc bất kỳ cloud nào tương tự.
Một số lưu ý quan trọng khi chọn cấu hình:
RAM phụ thuộc vào dung lượng dữ liệu
Một kinh nghiệm thực tế:
16GB data → cần ~1GB RAM cho cache
→ tổng RAM nên ít nhất 2GB
Sau khi tạo server:
SSH vào máy
Cài đặt MongoDB
2. Tạo user và phân quyền
MongoDB hỗ trợ phân quyền rất chi tiết. Bạn nên tách rõ:
User Admin (quyền toàn hệ thống)
use admin;
db.createUser({
user: "admin",
pwd: "yourpassword",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" }
]
});User này có thể:
Tạo user khác
Quản lý toàn bộ database
User cho từng database (khuyến nghị)
db.createUser({
user: "user1",
pwd: "password",
roles: [
{ role: "userAdmin", db: "sampledb" },
{ role: "dbAdmin", db: "sampledb" },
{ role: "readWrite", db: "sampledb" }
]
});Best practice:
Mỗi database nên có user riêng
Tránh dùng admin cho application
3. Bật authentication (bắt buộc trong production)
Mở file config:
sudo vim /etc/mongod.confThêm:
security:
authorization: enabledSau bước này:
MongoDB sẽ bắt buộc login bằng user
Không còn truy cập tự do
4. Cho phép kết nối từ xa
Mặc định MongoDB chỉ cho phép localhost.
Bạn cần sửa:
net:
port: 27017
bindIp: 0.0.0.0Ý nghĩa:
Cho phép kết nối từ mọi IP
Sau đó restart:
sudo service mongod restart5. Mở port trên server
MongoDB dùng port mặc định:
27017
Bạn cần:
Mở port trong Security Group (AWS)
Hoặc dùng iptables:
sudo iptables -A INPUT -p tcp --destination-port 27017 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --source-port 27017 -j ACCEPT6. Test kết nối từ máy local
Từ máy local:
mongo -u user1 -p password <server_ip>/sampledbNếu kết nối thành công → hệ thống đã hoạt động.
Một số lưu ý thực tế (quan trọng)
1. Không mở port public 100%
Tránh
0.0.0.0+ open toàn bộ internet
Nên:whitelist IP backend
hoặc dùng VPN / private network
2. Lỗi kết nối thường gặp
Dù setup đúng, bạn vẫn có thể gặp lỗi từ driver:
Node.js → mongoose
Python → pymongo
Go → mgo
Nguyên nhân thường do:
connection string sai
authSource thiếu
network firewall
3. Production nên làm thêm
TLS / SSL cho MongoDB
Replica Set (HA)
Backup định kỳ
Monitoring (Prometheus / Grafana)
Kết luận
Việc tách MongoDB ra thành một server riêng không chỉ là best practice mà gần như là bắt buộc nếu bạn muốn hệ thống:
ổn định
dễ scaledễ kiểm soát bảo mật
Một khi đã setup đúng từ đầu, bạn sẽ tránh được rất nhiều vấn đề về hiệu năng và vận hành sau này.
