1. MongoDB là gì ?
MongoDB là một hệ quản trị cơ sở dữ liệu NoSQL hướng tài liệu (document-oriented) được phát triển bởi MongoDB Inc. Nó sử dụng cấu trúc dữ liệu JSON hoặc BSON để lưu trữ và truy xuất thông tin. MongoDB khác biệt với các hệ cơ sở dữ liệu quan hệ truyền thống (SQL) ở chỗ nó không sử dụng bảng và hàng mà sử dụng các tài liệu (documents) và các bộ sưu tập (collections). Mô hình này cho phép nó linh hoạt và dễ mở rộng hơn trong các hệ thống yêu cầu tính năng này.
2. Kiến trúc MongoDB
Kiến trúc của MongoDB được thiết kế nhằm cung cấp khả năng mở rộng, tính khả dụng cao và hiệu suất tốt trong việc quản lý dữ liệu phi cấu trúc hoặc bán cấu trúc. MongoDB là một cơ sở dữ liệu NoSQL dạng document (tài liệu) lưu trữ dữ liệu dưới dạng các bản ghi BSON (Binary JSON) có cấu trúc linh hoạt.
Sơ đồ cấu trúc MongoDB
MongoDB Server └── Database (e.g., customerDB) └── Collection (e.g., customers) ├── Document 1 │ ├── _id: ObjectId("507f1f77bcf86cd799439011") │ ├── name: "Tây Java" │ ├── email: "tayjava@example.com" │ └── address: {...} └── Document 2 ├── _id: ObjectId("507f191e810c19729de860ea") ├── name: "Dâu Tây" └── email: "daytay@example.com"
2.1 Documents và Collections
- Documents (Tài liệu): Là đơn vị dữ liệu cơ bản trong MongoDB tương tự như một hàng trong cơ sở dữ liệu quan hệ. Mỗi
document
được lưu trữ ở định dạng BSON (Binary JSON), hỗ trợ dữ liệu phi cấu trúc với khả năng lưu trữ nhiều loại dữ liệu khác nhau (chuỗi, số, mảng, đối tượng lồng nhau, v.v.). - Collections (Tập hợp): Là tập hợp của các documents tương tự như bảng trong cơ sở dữ liệu quan hệ. Không giống như bảng, các
documents
trong cùng mộtcollection
có thể có cấu trúc khác nhau.
{ "_id": ObjectId("507f1f77bcf86cd799439011"), "name": "Tây Java", "email": "tayjava@example.com", "age": 37, "address": { "street": "Pham Van Dong", "city": "Hanoi", "zip": "100000" }, "hobbies": ["reading", "travelling"] }
2.2 Sharding (Phân mảnh dữ liệu)
- MongoDB hỗ trợ sharding là cơ chế phân phối dữ liệu trên nhiều server (hay còn gọi là shard) để đảm bảo khả năng mở rộng theo chiều ngang (horizontal scaling). Mỗi shard chứa một phần nhỏ của dữ liệu và hệ thống sử dụng mongos để điều phối truy cập và thực hiện truy vấn dữ liệu từ các shards.
- Sharding key: Là khóa được sử dụng để quyết định cách phân phối dữ liệu trên các shard.
2.3 Replica Set (Bản sao dữ liệu)
- Replica Set là nhóm các node MongoDB hoạt động như các bản sao (replicas) của nhau nhằm đảm bảo tính sẵn sàng và khả năng phục hồi của dữ liệu.
- Primary node: Node chính chịu trách nhiệm xử lý các yêu cầu ghi và đọc dữ liệu.
- Secondary nodes: Các node phụ chứa bản sao dữ liệu từ
primary
và có thể dùng để xử lý các yêu cầu đọc hoặc để thay thế primary trong trường hợp primary bị lỗi (cơ chế failover).
2.4 Mongos và Config Servers
- Mongos: Là thành phần đóng vai trò như một router trong kiến trúc sharding của MongoDB. Nó định tuyến các truy vấn đến shard tương ứng dựa trên sharding key.
- Config Servers: Là các server lưu trữ metadata về cấu trúc của sharded cluster bao gồm thông tin về sharding key và vị trí của các shard.
2.5 Indexing (Chỉ mục)
- MongoDB hỗ trợ nhiều loại chỉ mục bao gồm chỉ mục đơn, chỉ mục phức hợp (compound), chỉ mục toàn văn (text index) và chỉ mục địa lý (geospatial index), giúp tối ưu hóa hiệu suất truy vấn.
2.6 Aggregation Framework (Khung phân tích dữ liệu)
- MongoDB cung cấp aggregation framework để xử lý các truy vấn phức tạp bao gồm tính toán, nhóm dữ liệu và biến đổi dữ liệu. Framework này tương tự như các phép GROUP BY trong SQL nhưng mạnh mẽ hơn nhờ khả năng làm việc với dữ liệu phi cấu trúc.
2.7 Transactions (Giao dịch)
- Từ phiên bản MongoDB 4.0 trở đi MongoDB hỗ trợ multi-document transactions cho phép thực hiện nhiều thao tác ghi trong một giao dịch đảm bảo tính nguyên tử (ACID). Tuy nhiên trong các trường hợp yêu cầu giao dịch phức tạp MongoDB có thể không phải là lựa chọn tốt nhất so với các hệ quản trị cơ sở dữ liệu quan hệ như MySQL, PostgreSQL.
2.8 Storage Engine (Cơ chế lưu trữ)
- WiredTiger là cơ chế lưu trữ mặc định trong MongoDB, cung cấp hỗ trợ cho nén dữ liệu, lưu trữ đồng thời (concurrency) và quản lý bộ nhớ hiệu quả. MongoDB cũng có thể hỗ trợ nhiều cơ chế lưu trữ khác nhưng WiredTiger là lựa chọn phổ biến nhất.
2.9 Các cơ chế mở rộng và tối ưu khác
- Cơ chế caching: MongoDB có bộ nhớ đệm (cache) mạnh mẽ để tối ưu hóa truy cập dữ liệu.
- Data Replication: Nhân bản dữ liệu giữa các nodes để đảm bảo dữ liệu luôn sẵn sàng và dự phòng trong trường hợp xảy ra sự cố.
- Load balancing: MongoDB hỗ trợ cân bằng tải, phân phối các yêu cầu đọc và ghi đến các nodes khác nhau để tối ưu hóa hiệu suất.
3. Ưu nhược & điểm của MongoDB
3.1 Ưu điểm của MongoDB
- Tính linh hoạt cao: Cho phép lưu trữ dữ liệu không đồng nhất và dễ dàng thay đổi cấu trúc dữ liệu.
- Hiệu suất cao và khả năng mở rộng tốt: Đặc biệt hiệu quả với các hệ thống yêu cầu mở rộng theo chiều ngang và có khối lượng dữ liệu lớn.
- Hỗ trợ nhiều tính năng mạnh mẽ: Sharding, replication, aggregation, và giao dịch ACID, đáp ứng được các yêu cầu phức tạp về lưu trữ và xử lý dữ liệu.
- Ngôn ngữ truy vấn gần gũi với lập trình viên: Ngôn ngữ truy vấn JSON/BSON dễ hiểu và dễ sử dụng đối với lập trình viên đặc biệt là những người làm việc với JavaScript.
3.2 Nhược điểm của MongoDB
- Quản lý giao dịch chưa tối ưu: Mặc dù hỗ trợ ACID, nhưng quản lý giao dịch phức tạp vẫn không mạnh như các hệ quản trị cơ sở dữ liệu quan hệ.
- Không phù hợp cho mọi trường hợp: MongoDB thích hợp hơn cho các hệ thống yêu cầu tính linh hoạt về cấu trúc dữ liệu và khả năng mở rộng hơn là các hệ thống giao dịch đòi hỏi tính nhất quán cao.
- Sử dụng bộ nhớ lớn: Do dữ liệu được lưu trữ dưới dạng BSON, MongoDB có thể yêu cầu nhiều bộ nhớ hơn so với các hệ quản trị cơ sở dữ liệu quan hệ, đặc biệt khi sử dụng chỉ mục phức tạp.
4. Khi nào nên dùng MongoDB ?
MongoDB thích hợp cho các dự án có đặc điểm sau:
- Dữ liệu phi cấu trúc hoặc cấu trúc thay đổi thường xuyên.
- Khả năng mở rộng cao và cần xử lý dữ liệu lớn (big data).
- Ứng dụng web hoặc mobile có nhu cầu lưu trữ dữ liệu linh hoạt và hiệu suất truy cập cao.
- Các hệ thống thời gian thực, phân tích dữ liệu lớn hoặc IoT.