Sharding là chia ngang (horizontal partition) dữ liệu ra nhiều node, mỗi shard giữ một tập con các hàng theo shard key. Khác biệt:
- Replication: mỗi node giữ toàn bộ bản sao dữ liệu (nhân đôi để đọc/HA). Sharding: mỗi node giữ một phần khác nhau của dữ liệu (chia để scale ghi + dung lượng vượt giới hạn một máy).
- Partitioning thường chỉ việc chia bảng trong cùng một DB/instance; sharding là partition trải trên nhiều máy/instance.
Chiến lược chọn shard: range (theo khoảng giá trị), hash (băm khóa cho đều), directory (bảng tra cứu ánh xạ). Thách thức:
- Truy vấn/join xuyên shard phức tạp và chậm; nên thiết kế để phần lớn truy vấn nằm gọn trong một shard.
- Hotspot: shard key kém (vd theo thời gian tăng dần) dồn tải vào một shard.
- Rebalancing khi thêm/bớt node — consistent hashing giúp giảm lượng dữ liệu phải di chuyển.
- Transaction xuyên shard khó đảm bảo atomic (né 2PC, dùng saga/eventual consistency).
Chốt: sharding mở đường scale gần như không giới hạn nhưng tăng đáng kể độ phức tạp vận hành — chỉ dùng khi một node thật sự không kham nổi.