Một số ghi chú về MongoDB

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

Shard kết hợp với Replica

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

Mongo GUI Tools 

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

https://medium.com/@arun2pratap/set-up-mongodb-sharded-cluster-for-windows-with-just-a-double-click-6eedbb7b79e

https://medium.com/@luansantos_4481/how-to-return-birthdays-of-the-current-day-week-and-month-with-mongodb-aggregation-f4104fe82e3c


Tiếp tục cập nhật ...