Trong Blog gần đây, tôi thảo luận khi nào cần Scale MongoDB. Bài này tập trung vào CÁCH Scale MongoDB.
MongoDB Version 3.0 giới thiệu WiredTiger làm Default Storage Engine. Kể từ đó, MongoDB cung cấp 2 hướng tiếp cận Scalability. Mongo giờ có thể Mở rộng Dọc (Vertically) cũng như Ngang (Horizontally). Cả hai đáng xem xét kỹ.
Mở rộng Dọc (Vertical Scaling)
Vertical Scaling tăng Computing Resources: số lượng/loại CPU, RAM, Disk Space. Với WiredTiger, khi Vertical Scale, cần xác định Resource nào gây Bottleneck (CPU/RAM/Disk hoặc kết hợp).
Lưu ý về WiredTiger RAM
Nếu RAM cấp phát < 1GB, WiredTiger mặc định 256MB hoặc 50% Available RAM. Do đó, WiredTiger Cache phải Resize nếu cấp thêm RAM.
Mở rộng Ngang (Horizontal Scaling)
Horizontal Scaling phân phối Computing Resources qua Network, thường bằng cách thêm Server. Để phân phối Data qua Multiple Nodes khi thêm, MongoDB dùng kiến trúc Database gọi là Sharding, dùng Key Ranges phân vùng Data phân tán trên Multiple Database Instances.
Thiết lập Hạ tầng vật lý Sharding
Các thành phần vật lý thiết lập Sharding Configuration yêu cầu:
- MONGOS đóng vai Query Router.
- CONFIG SERVERS lưu Sharding Metadata.
- DATA NODES lưu Data thực tế.
Tham khảo MongoDB Overview của chúng tôi cho chi tiết thành phần vật lý.
Định nghĩa Shard Keys
Sau khi setup Physical Sharding Infrastructure, tập trung vào Logical Aspect của Sharding. Shard Keys đại diện cho các Field trong Collection mà MongoDB dùng để Partition Data. Tiện lợi, Mongo cho phép bạn Define Keys này.
Để xác định Field liên quan Implement Shard Keys:
- Xác định Collections cần Shard. Collections > 200MB và Data phân bố đều là Candidate tốt cho Sharding.
- Tạo hoặc thiết kế Shard Key phù hợp. Khi tạo Shard Key, cân nhắc Recommendations và Questions sau:
- Hiểu cách App tương tác với Database.
- Xem App Read-heavy, Write-heavy, hay Balanced.
- Hoạt động quan trọng nhất đối với Database? Ví dụ: App Write Data lớn, nhưng hoạt động quan trọng nhất là Query trả Data < 100ms.
- Pattern Data Growth Tuần/Tháng kỳ vọng?
- Có Pain Points/Problem Areas cần giải quyết (Slow Queries)?
- App bận rộn lúc nào (Giờ/Ngày/Tuần/Năm)? Hay liên tục?
Sau khi điều tra, bắt đầu phân tích chi tiết. Blog tiếp theo sẽ thảo luận cách tìm Right Shard Key.