Type Sharding
Sharding database là kỹ thuật chia nhỏ dữ liệu thành nhiều phần (shards) và phân phối lên nhiều database hoặc server khác nhau để tăng hiệu năng, khả năng mở rộng và tính sẵn sàng. Có nhiều cách phân loại sharding, dưới đây là các loại phổ biến nhất kèm theo ưu nhược điểm:
📌 1. Horizontal Sharding (Sharding theo hàng / theo dữ liệu)
Chia dữ liệu thành các hàng (record) dựa trên một giá trị nhất định (ví dụ:
user_id % số shard
)Ví dụ:
Shard 1: user_id 1-10000
Shard 2: user_id 10001-20000
✅ Ưu điểm:
Dễ mở rộng quy mô (scale out).
Mỗi shard nhỏ hơn nên query nhanh hơn.
Thích hợp với hệ thống có lượng dữ liệu lớn.
❌ Nhược điểm:
Khó join dữ liệu giữa các shard (cross-shard query).
Cần cơ chế định tuyến (routing) để truy xuất đúng shard.
Migrate dữ liệu phức tạp nếu thay đổi rule.
📌 2. Vertical Sharding (Sharding theo cột / theo schema)
Chia dữ liệu theo bảng hoặc domain riêng biệt.
Ví dụ:
DB1 chứa bảng User, Account
DB2 chứa bảng Product, Order
✅ Ưu điểm:
Tách biệt logic rõ ràng giữa các module/domain.
Giảm kích thước schema => dễ quản lý.
❌ Nhược điểm:
Không giải quyết được vấn đề volume lớn trên 1 bảng.
Có thể dẫn đến unbalanced load nếu 1 bảng có nhiều traffic hơn.
📌 3. Directory-Based Sharding (Manual Mapping)
Tạo bảng ánh xạ (lookup table) lưu thông tin shard cho từng record.
Truy vấn thông qua bảng này để biết dữ liệu nằm ở shard nào.
✅ Ưu điểm:
Linh hoạt trong việc phân phối dữ liệu.
Có thể thay đổi mapping mà không thay đổi logic code nhiều.
❌ Nhược điểm:
Bảng ánh xạ có thể trở thành bottleneck.
Phức tạp trong đồng bộ và consistency.
📌 4. Hash-Based Sharding
Áp dụng hàm băm (hash function) lên một khóa nào đó (ví dụ user_id) để xác định shard.
✅ Ưu điểm:
Phân phối đều dữ liệu.
Dễ mở rộng bằng cách dùng consistent hashing.
❌ Nhược điểm:
Khó join và aggregate dữ liệu.
Khi thêm shard mới, cần rehashing lại → tốn effort hoặc cần thiết kế consistent hash.
📌 5. Range-Based Sharding
Chia theo khoảng giá trị (range) cụ thể của khóa.
Ví dụ: user_id 1-100000 → shard 1, 100001-200000 → shard 2
✅ Ưu điểm:
Dễ hiểu, dễ debug.
Có thể tối ưu truy vấn theo range.
❌ Nhược điểm:
Dễ gây unbalanced shard nếu không tính toán tốt.
Không phù hợp với khóa có tính tăng dần nhanh (hot shard).
✅ Tổng kết so sánh nhanh
Horizontal
Scale tốt, hiệu suất cao
Join khó, migrate phức tạp
Vertical
Tách biệt module rõ ràng
Không phù hợp với bảng quá lớn
Directory-based
Linh hoạt
Cần thêm 1 lookup table
Hash-based
Phân phối đều
Rehashing khi scale
Range-based
Dễ hiểu, dễ query theo range
Dễ gây unbalanced shard
Last updated