Khi làm việc với các hệ thống dữ liệu lớn, sớm hay muộn bạn cũng sẽ gặp một kịch bản rất quen thuộc:
Hệ thống đang chạy ổn, nhưng một ngày đẹp trời nó chậm đi trông thấy.
Query lâu hơn, CPU database tăng cao, RAM lúc nào cũng căng, disk IO liên tục chạm ngưỡng.
Và trong rất nhiều trường hợp, thủ phạm chính là database.
Khi dữ liệu ngày càng phình to, database dần trở thành “cổ chai” của toàn hệ thống.
Lúc này, có hai kỹ thuật mà bất kỳ ai làm việc với hệ thống dữ liệu lớn cũng phải nắm vững:
- Partitioning
- Sharding
1. Partitioning là gì?
Partitioning là kỹ thuật chia nhỏ một bảng dữ liệu lớn thành nhiều phần nhỏ hơn, gọi là partition, nhưng tất cả vẫn nằm trong cùng một database và cùng một server.
Bạn có thể hình dung partitioning giống như:
🧹 Dọn dẹp nhà cửa
Ngôi nhà vẫn là một, nhưng bạn sắp xếp đồ đạc gọn gàng hơn:
- Khu A
- Khu B
- Khu C
Khi cần tìm đồ, bạn biết ngay cần tìm ở khu nào, không phải lật tung cả căn nhà.
Cách Partitioning hoạt động
+---------------------------+
| DATABASE |
| |
| orders table |
| +---------------------+ |
| | Partition 2024-01 | |
| +---------------------+ |
| | Partition 2024-02 | |
| +---------------------+ |
| | Partition 2024-03 | |
| +---------------------+ |
| |
| (Same Server) |
+---------------------------+
Thay vì một bảng khổng lồ:
orders (100 triệu bản ghi) Ta chia thành nhiều partition, ví dụ theo thời gian:
orders_2024_01
orders_2024_02
orders_2024_03
... Khi query, database engine chỉ đọc partition liên quan, thay vì scan toàn bộ bảng.
User Query
|
v
+------------------+
| WHERE date=07/2024|
+------------------+
|
v
+------------------+
| Partition 2024-07 |
+------------------+
Ví dụ Partitioning (PostgreSQL)
CREATE TABLE orders (
id BIGSERIAL,
order_date DATE NOT NULL,
amount NUMERIC
) PARTITION BY RANGE (order_date);
CREATE TABLE orders_2024_07
PARTITION OF orders
FOR VALUES FROM ('2024-07-01') TO ('2024-08-01');
Khi chạy query:
SELECT * FROM orders
WHERE order_date BETWEEN '2024-07-01' AND '2024-07-31';
👉 Database chỉ scan partition tháng 7, nhanh hơn rất nhiều.
Lợi ích của Partitioning
- 🚀 Tăng tốc độ query
- 📉 Giảm lượng dữ liệu phải scan
- 🧹 Dễ quản lý dữ liệu cũ (drop partition)
- 💰 Không cần thêm server mới
Hạn chế của Partitioning
❌ Không mở rộng theo chiều ngang
Tất cả partition vẫn nằm trên một server duy nhất.
Nếu server đó:
- Hết RAM
- Hết CPU
- Hết disk
→ Partitioning không còn cứu được hệ thống.
2. Sharding là gì?
Sharding là kỹ thuật chia dữ liệu ra nhiều database, nhiều server khác nhau.
Nếu partitioning là dọn dẹp nhà cửa, thì sharding là:
🏗️ Xây thêm nhà mới
Bạn không cố nhét mọi thứ vào một chỗ nữa, mà chia tải ra nhiều nơi.
Cách Sharding hoạt động
Dữ liệu được chia theo shard key, ví dụ:
- user_id
- customer_id
- region
Ví dụ:
- Shard 1: user_id từ 1 → 1,000,000
- Shard 2: user_id từ 1,000,001 → 2,000,000
- Shard 3: user_id từ 2,000,001 → 3,000,000
Mỗi shard:
- Có database riêng
- Có server riêng
- Chịu tải độc lập
+-------------+
| Router / |
| Shard Logic |
+------+------+
|
-----------------------------------------
| | |
+------------+ +------------+ +------------+
| Shard 1 | | Shard 2 | | Shard 3 |
| Server A | | Server B | | Server C |
| users 1M | | users 1M | | users 1M |
+------------+ +------------+ +------------+
Ví dụ Sharding trong ứng dụng (Node.js – logic)
function getShardByUserId(userId) {
if (userId < 1000000) return shard1;
if (userId < 2000000) return shard2;
return shard3;
}
Ứng dụng sẽ:
- Xác định shard
- Gửi query đến đúng database
- Không ảnh hưởng các shard khác
Lợi ích của Sharding
- 📈 Mở rộng theo chiều ngang
- 🚀 Chịu tải lớn (read & write)
- 🧱 Tránh single point of failure
- 🌍 Phân dữ liệu theo khu vực (VN, US, EU…)
Nhược điểm của Sharding
❌ Độ phức tạp rất cao:
- Query cross-shard khó
- Join gần như không thể
- Transaction phức tạp
- Vận hành & debug khó
👉 Sharding không dành cho hệ thống nhỏ.
3. So sánh trực tiếp Partitioning vs Sharding
| Tiêu chí | Partitioning | Sharding |
|---|---|---|
| Vị trí dữ liệu | 1 server | Nhiều server |
| Mục tiêu | Tối ưu hiệu năng | Mở rộng hệ thống |
| Mở rộng ngang | ❌ | ✅ |
| Độ phức tạp | Thấp | Cao |
| Chi phí | Thấp | Cao |
📌 Một câu để nhớ mãi:
Partitioning là tối ưu bên trong một server.
Sharding là mở rộng ra nhiều server.
PARTITIONING SHARDING
-------------------- --------------------
1 Server Nhiều Server
1 Database Nhiều Database
Chia bảng Chia hệ thống
Tối ưu query Mở rộng tải
4. Khi nào nên dùng Partitioning?
Dùng Partitioning khi:
- Dữ liệu lớn nhưng 1 server vẫn chịu được
- Query thường lọc theo khoảng (date, range)
- Muốn tăng tốc hệ thống nhưng ngân sách hạn chế
👉 Partitioning là giải pháp nhanh – gọn – rẻ.
5. Khi nào buộc phải dùng Sharding?
Dùng Sharding khi:
- Server hiện tại đã chạm trần tài nguyên
- Lượng read/write quá lớn
- Cần mở rộng thực sự theo chiều ngang
- Muốn phân dữ liệu theo vùng địa lý
👉 Đây là lúc 1 server không còn đủ nữa.
6. Có phải chọn một trong hai không?
Không.
💡 Hệ thống lớn thường kết hợp cả hai:
- Sharding để chia tải giữa các server
- Partitioning bên trong mỗi shard để tối ưu query
Đây là kiến trúc rất phổ biến trong các hệ thống lớn ngoài thực tế.
+-------------+
| Router |
+------+------+
|
-----------------------------
| |
+------------------+ +------------------+
| Shard A | | Shard B |
| (Server A) | | (Server B) |
| | | |
| orders_2024_01 | | orders_2024_01 |
| orders_2024_02 | | orders_2024_02 |
+------------------+ +------------------+
Kết luận
- Partitioning ≠ Sharding
- Một cái tối ưu bên trong
- Một cái mở rộng bên ngoài
- Hiểu đúng giúp bạn:
- Tránh over-engineering
- Tiết kiệm chi phí
- Thiết kế hệ thống đúng ngay từ đầu
Nếu bạn thấy bài viết hữu ích, hãy follow w3dev.vn để xem thêm các nội dung chuyên sâu về Web Development & System Design 🚀
Leave a comment
Your email address will not be published. Required fields are marked *