Mongo Sharding(P1)

Nguyễn Thành Trung
Edumall Engineering
4 min readFeb 12, 2019

Cơ sở dữ liệu với lượng dữ liệu lớn hoặc tải cao là một thách thức lớn đối với mô hình máy chủ đơn(Mainframe).
Với các câu lệnh truy vấn phức tạp có thể làm CPU tăng cao. Với việc phải làm việc với dữ liệu lớn có thể đòi hỏi lượng RAM của máy chủ.
Hiện nay có 2 phương án có thể giải quyết vấn đề trên là: Vertical Scaling và Horizontal Scaling
- Vertical Scaling(Scaling Up): tăng số lõi CPU hoặc là dùng CPU mạnh hơn
- Horizontal Scaling(Scaling Out) : tăng số máy chủ.
Sharding là một phương pháp để lưu trữ dữ liệu (storage) của DB trên nhiều máy chủ. MongoDB sử dụng sharding để hỗ trợ việc phân tán một lượng dữ liệu trên nhiều máy chủ, ở đây có thể là các tập collection trong DB điều này giúp cho việc truy cập nhanh hơn, giảm tải việc quá tải ổ cứng cho một vài máy chủ và giúp hệ thống dễ dàng mở rộng khi có nhu cầu hơn.
Ví dụ, nếu một cơ sở dữ liệu có một bộ dữ liệu 1 terabyte, và có chia ra thành 4 shards, sau đó mỗi shard có thể giữ chỉ 256GB dữ liệu. Nếu có 40 shard thì mỗi shard có thể giữ chỉ 25GB dữ liệu như hình dưới. Điều này giảm dữ liệu mỗi máy chủ phải chứa và dễ dàng có thể mở rộng hệ thống theo chiều ngang.
Sharded Cluster
Mongodb Sharded Cluster bao gồm các thành phần chính như sau:
- Shards: Là nơi chứa dữ liệu, được phân tán bởi nhiều máy chủ theo cơ chế “replica set
- Query routers: Là nơi điều hướng việc client truy cập chính xác dữ liệu vào shard nào, mỗi hệ thống Sharding có thể có nhiều query router.
- Config servers: Là nơi chưa các “meta data” (nôm na là các thông số kỹ thuật) hệ thống Sharding, nó chứa một bản đồ dữ liệu của việc thiết lập các Shards. Query routers dùng các “meta data” này xác định được chính xác việc truy vấn vào Shards nào trên hệ thống. Mỗi hệ thống Sharding có chính xác là 3 file Config servers.

Mongodb chia sẻ dữ liệu ở tầng Collection(Tương ứng với Table trong hệ quản trị cơ sở dữ liệu quan hệ). Dữ liệu trong Collection được phân tán trên các Shards trong cụm.

Shard Keys: Để phân tán dữ liệu của Collection trên các Shards, MongoDb phân vùng dữ liệu thông qua Shard Keys. Shard Key là một cột hoặc một cụm các cột không thể thay đổi tồn tại ở mỗi Documents thuộc Collection. Chúng ta cần phải chọn một Shard Keys mỗi khi chúng ta phân chia dữ liệu của Collection.

Tất các các Shard Collection bắt buộc phải tạo Index cho Shard Keys. Index này có thể dựa trên field hoặc một tập hợp các fields của Key. Đối với các Collection không có dữ liệu, MongoDB sẽ tự tạo index trên Shard Key nếu như Index không tồn tại.

Lưu ý: Việc chọn lựa Shard Key có ảnh hưởng đến hiệu năng, khả năng mở rộng của Cluster.

MongoDb hỗ trợ Database tồn tại cả 2 loại Sharding Collection và Non Sharding Collection

Chunk: MongoDb phân chia dữ liệu Sharding Collection vào trong chunk. Mặc định Chunk Size là 64Mb.

Chunk Splits: Là tiến trình chia cắt khi Chunk tăng đến giới hạn(Chunk Size) hoặc khi số lượng Document trong Chunk vượt quá tham số Maximum Number of Documents Per Chunk to Migrate. Dựa trên Share Key, MongoDb sẽ tiến hành chia cắt thành nhiều Chunk nếu cần

Chunk Migration: MongoDB chuyển đổi Chunk để phân bố lại chunk của Shard Collection. Hình dung việc này cũng như việc chúng ta Defragment lại ổ cứng trên Window. MongoDB cũng hỗ trợ 2 phương pháp để làm được việc này:

  • Manual: Chỉ nên sử dụng trong một số trường hợp nhất định như phân tán dữ liệu sử dụng Bulk Insert
  • Automatic: Thông qua tiến trình Balancer tự động Migrate lại chunk khi có sự phân bố không đều giữa các chunk trên các Shards

Lợi ích của việc sử dụng Sharding

Đọc/Ghi: MongoDb phân tán dữ liệu trên các Shards của Cluster. Việc đọc ghi sử dụng Sharding có thể dễ dàng được scaled horizontally

Lưu trữ(Storage Capacity): Shardings phân tán dữ liệu trên các Shard của Cluster. Việc này giúp cho dữ liệu sẽ được phân bố đều trên cụm máy cài Sharding

Tính sẵn sàng(High Availability): MongoDB có thể đọc ghi dữ liệu dễ dàng thậm chí ngay cả khi một hoặc nhiều Shard không sẵn sàng. Khi một hoặc nhiều Shard không sẵn sàng, MongoDB vẫn dễ dàng đọc ghi trên nhưng Share sẵn sàng

--

--