MongoDB là gì?
MongoDB là một cơ sở dữ liệu NoSQL rất phổ biến vì tính đơn giản và dễ sử dụng của nó. Hiệu năng cũng tương đối ổn.
Các khái niệm và thành phần trong MongoDB
BSON Types
Kiểu dữ liệu JSON nhưng không ở dạng text mà ở dạng binary nhằm tối ưu kích thước cho việc lưu trữ và tốc độ
Documents
Một bản ghi dữ liệu. Có thể coi một document tương đương một hàng bản ghi trong SQL
Collections
Một tập hợp các documents. Có thể coi một collection tương đương một bảng trong SQL
Capped Collections
Một loại collection với kích thước cố định. Khi kích thước đạt ngưỡng, dữ liệu cũ nhất sẽ được tự động xóa khi dữ liệu mới được insert vào
Database
Một tập hợp các collections. Tương đương với một database trong SQL
CRUD Operations
Các hành động tương tác với MongoDB bao gồm : Thêm mới, Đọc, Cập nhật, Xóa. Khi dùng nên chú ý tối ưu dùng các hàm kiểu bulk mà MongoDB hỗ trợ
Storage Engines
Cách MongoDB tổ chức lưu dữ liệu trên disk. Mặc định dùng WiredTiger
Indexes
Là một phần quan trọng trong MongoDB. Khi đánh index cho các collections, ta phải chú ý đến thứ tự các trường. Thứ tự này phụ thuộc vào câu truy vấn dữ liệu. Một số gợi ý cho việc đánh index
- Đánh index đơn giản (số lượng các trường hợp lý) và index này hỗ trợ đa dạng phổ biến các truy vấn tới dữ liệu. Tránh lạm dụng việc đánh index trên quá nhiều trường, việc này vừa tốn bộ nhớ, không mang lại hiệu quả rõ rệt, lại ảnh hưởng lên các hệ thống còn lại.
- Xóa các index không sử dụng, chỉ giữ lại các indexes hết sức cần thiết
- Sau khi đánh index nên kiểm tra lại cả trên các tools và sau khi triển khai trên các ngôn ngữ lập trình. Nhiều trường hợp trên tools ngon lành nhưng đến lúc viết code lại không nhảy vào index như mong muốn.
- Đa số các trường hợp, tự động Mongo sẽ chọn index phù hợp cho truy vấn của ta. Nhưng trong một số trường hợp không may hoặc muốn test một index nào đó, ta có thể chỉ định (ép) MongoDB sử dụng một index nào đó thông qua option hint.
- Đặc biệt chú ý đến kích thước của các dữ liệu liên quan đến index, căn chỉnh sao cho phù hợp với kích thước của RAM (Mặc định, kích thước tổng index phải <= (RAM - 1GB)/2)
- Độ ưu tiên các trường theo thứ tự : E-S-R (Equal - Sort - Range)
- Ưu tiên các trường mà có độ phân tán giá trị nhiều hơn trước. Ví dụ, với dữ liệu logfile chứa thông tin về xe trong đó bao gồm mã xí nghiệp và biển số xe. Do một xí nghiệp có rất nhiều biển số xe nên độ đa dạng dải giá trị của biển số xe là nhiều hơn nên ưu tiên trường này trước khi đánh index
- Ưu tiên các trường xuất hiện trong nhiều câu truy vấn
- Giảm bớt kích thước của collections. Trong một số trường hợp dữ liệu lưu theo thời gian, sau một thời gian nhất định nên xóa bớt hoặc di chuyển lưu sang một chỗ khác để giảm kích thước làm việc cho một collection, qua đó cũng giảm tải cho hệ thống và cải thiện hiệu năng khi hệ thống ngày càng phình to ra. Có thể sử dụng Cap collections
- Khi giá trị của trường nào đó là text là độ dài rất lớn thì trước khi đánh index nên tiến hành hashed dữ liệu để giảm kích thước index
- Chỉ sử dụng các option như unique, partial index trong các trường hợp cần thiết
Trên đây chỉ là các gợi ý. Trên thực tế tùy thuộc vào loại dữ liệu lưu xuống, độ lớn , độ phân tán của dữ liệu, .... mà áp dụng các biện pháp khác nhau. Không có cách nào ngoài việc chỉnh sửa và kiểm tra
Aggregation
Thao tác tổng hợp dữ liệu bằng cách phối hợp các toán từ mà MongoDB cung cấp nhằm lấy ra được dữ liệu mong muốn
Map Reduce
Thao tác lấy dữ liệu ra theo một hoặc trường nào đó (Map) và xử lý dữ liệu trên các trường đó (Reduce).
Views / Materialized Views
Định nghĩa kiểu các bảng ảo thông qua việc định nghĩa các aggration pipeline. Khi nào cần thì client có thể truy vấn trực tiếp các views này
Transactions
Thực hiện việc reads và writes nhiều documents trong cùng một collection hoặc nhiều collections khác nhau
Master Primary Replica
Nhân bản dữ liệu của mình ở nhiều nơi trên các server khác nhau để đảm bảo an toàn. Replica sinh ra để giải quyết vấn đề read, độ ổn định sẵn sàng của hệ thống
Một số lưu ý
- Chỉ nên dùng replica khi thực sự cần thiết vì nó ảnh hưởng độ phức tạp của hệ thống, tốn thêm bộ nhớ lưu trữ, các vấn đề liên quan đến backup, lưu trữ, restart, ...
- Dùng replica khi hệ thống với cấu hình hiện tại không còn đáp ứng được, tải tăng, lượng người dùng tăng, scale vấn đề read dữ liệu. Vì bản chất replica sinh ra là để cải thiện tình trạng read dữ liệu
- Khi triển khai sử dụng replica nên dùng thêm các arbiter để phòng khi primary chết hoặc có sự cố
- Nên cài đặt từ client việc read dữ liệu ưu tiên từ các replica, primary chỉ đảm nhận việc write dữ liệu. Việc này nhằm giảm tải cho primary, tăng hiệu năng hệ thống
Sharding
Là việc chia nhỏ dữ liệu, ở đây cụ thể là các collections ra nhiều vùng khác nhau và được lưu trên các server khác nhau. Việc chia như thế nào dựa trên các shard keys mà người dùng cài đặt. Bản chất sharding sinh ra là để giải quyết vấn đề write hệ thống, đảm bảo tính sẵn sàng ổn định của hệ thống
Một số kiểu sharding dữ liệu
Hashed Sharding : Chia dữ liệu ngẫu nhiên theo giá trị hash của shard key
Ranged Sharding : Chia dữ liệu theo khoảng của trường dữ liệu nào đó đã chọn làm shard key
Một mô hình khi cài đặt shard cho Mongo sẽ gồm các thành phần chính sau
Shard : Nơi lưu trữ các tập con dữ liệu
Config Server : Nơi lưu trữ các thông tin cấu hình liên quan đến toàn mạng cluster
Mongos : Nơi giao tiếp với client
Việc quan trọng nhất khi shard dữ liệu trên Mongo là chọn ra shard key làm sao cho phù hợp và hiệu quả nhất. Việc này ảnh hưởng trực tiếp tới việc phân phối dữ liệu trên các shards.
Một số lưu ý
- Chỉ nên dùng sharding khi thực sự cần thiết vì nó ảnh hưởng độ phức tạp của hệ thống, các vấn đề liên quan đến backup, lưu trữ, restart, ... Chỉ dùng khi lượng dữ liệu cực kỳ lớn mà một server vật lý không thể đáp ứng được.
- Với các hệ thống lớn áp dụng shard nên cấu hình thêm các replica để đảm bảo tính ổn định và tăng hiệu suất hệ thống
- Việc chọn các shard keys sao cho dữ liệu được phân phối đều trên tất cả các shards. Khi write thì nên trải đều tải lên các shards, còn khi read thì dữ liệu trả về nên nằm trên một hoặc ít shard nhất có thể.
- Chú ý việc cài đặt tham số liên quan đến chunks
Cài đặt
https://www.mongodb.com/download-center/community
Các công cụ hỗ trợ
MongoDB Shell
Các công cụ kiểm tra
mongotop
mongostat
Thư viện C#
https://www.nuget.org/packages/MongoDB.Driver
https://github.com/mongodb/mongo-csharp-driver
Giao tiếp với dữ liệu dạng file
https://www.nuget.org/packages/MongoDB.Driver.GridFS
Tham khảo thêm
Tiếp tục cập nhật ...