Database Sharding là gì? Chiến lược chia dữ liệu cho hệ thống lớn

Khi website hay ứng dụng phát triển nhanh, lượng người dùng và dữ liệu tăng gấp hàng triệu lần, database đơn lẻ trở thành điểm nghẽn. Database sharding là kỹ thuật chia một cơ sở dữ liệu lớn thành nhiều phần nhỏ hơn, gọi là shard, phân tán trên nhiều máy chủ khác nhau — tương tự cách hệ thống phân mảnh đĩa cứng để tăng hiệu năng.

Sơ đồ phân mảnh database theo chiều ngang (horizontal sharding) cho thấy bảng users được chia thành shard 1, 2, 3, 4 theo user_id

Horizontal vs Vertical Sharding

Sharding có 2 hình thức cơ bản:

  • Horizontal sharding (phân mảnh ngang): Mỗi shard chứa cùng số cột, nhưng các hàng khác nhau. Ví dụ: bảng orders có 100 triệu dòng → chia theo 4 shard theo khoảng ID (1–25tr, 25–50tr, 50–75tr, 75–100tr).
  • Vertical sharding (phân mảnh dọc): Mỗi shard chứa tập con các cột khác nhau. Ví dụ: shard profiles lưu thông tin người dùng, shard auth lưu mật khẩu/quyền, shard analytics lưu hành vi.

Hầu hết hệ thống lớn (Instagram, Facebook, Uber) dùng horizontal sharding vì nó giảm tải tốt nhất cho bảng lớn có hàng triệu bản ghi.

Sơ đồ vertical sharding cho thấy bảng users được tách thành 3 shard theo nhóm cột: profile, auth, analytics

Các chiến lược sharding phổ biến

Chiến lược Cách hoạt động Ưu điểm Nhược điểm
Range-based Chia theo khoảng giá trị (ID, ngày, vùng) Dễ debug, truy vấn theo range nhanh Hotspot nếu data không đều
Hash-based Hash key → modulo số shard Phân bố đều, dễ mở rộng Khó truy vấn range, thêm/xóa shard phức tạp
Directory-based Bảng lookup ánh xạ key → shard Linh hoạt, thay đổi mapping dễ Lookup table thành bottleneck
Geo-based Chia theo khu vực địa lý Latency thấp cho user local, tuân thủ GDPR Khó cân bằng tải nếu user không đều

Khi nào nên shard?

Sharding không phải giải pháp mặc định. Áp dụng khi:

  • Database đơn lẻ đạt ngưỡng CPU/RAM/IOPS tối đa — ví dụ PostgreSQL > 50% CPU liên tục, InnoDB buffer pool đầy.
  • Lượng dữ liệu > 500GB–1TB và tăng 20–30%/tháng.
  • Đọc/ghi > 10,000 QPS mà read replica không cải thiện.
  • Khách hàng toàn cầu cần low-latency cho từng khu vực.

Trước khi shard, thử các bước tối ưu đơn giản: query optimization, indexing, caching (Redis), read replica, partition — vì sharding tăng đáng kể độ phức tạp vận hành và application logic.

Thách thức của sharding

Joins và transactions xuyên shard

Join giữa 2 bảng nằm trên shard khác nhau rất tốn kém. Có 3 hướng: denormalize sẵn dữ liệu, dùng distributed SQL (CockroachDB, TiDB), hoặc chấp nhận eventual consistency và join ở application layer.

Rebalancing khi thêm shard

Thêm shard mới yêu cầu di chuyển data — dùng consistent hashing hoặc hash function có thể mở rộng (VNodes) để giảm thiểu dữ liệu phải di chuyển.

Hotspot key

Một key cực hot (ví dụ: influencer có triệu follower) đổ toàn bộ request vào 1 shard. Giải pháp: thêm ngẫu nhiên (jitter) vào key, hoặc cache riêng cho hot key.

Công cụ và framework

  • Vitess: Sharding proxy cho MySQL, dùng bởi YouTube, Slack. Tự động vito routing, connection pooling, query rewriting.
  • Citus: Extension PostgreSQL thành distributed database — shard transparent, hỗ trợ joins xuyên shard giới hạn.
  • ProxySQL / MaxScale: Routing layer cho MySQL/MariaDB, nhận biết shard từ query context.
  • Custom application sharding: Nhiều hệ thống lớn tự implement: Instagram (ID-based), Uber (Geobase), Facebook (MyRocks sharded MySQL).

Ảnh minh họa kiến trúc Citus hoặc Vitess — shard map, coordinator node, data nodes — hoặc dashboard giám sát cluster sharded

Ví dụ thực tế: Instagram và Vitess

Instagram sử dụng Vitess để sharding PostgreSQL cho hàng tỷ nội dung media. Shard key là user_id, cho phép truy vấn profile và post của một người dùng luôn ở cùng một shard. Khi user nổi tiếng gây hotspot, team dùng read replica và cache Redis để giảm tải. Kiến trúc này giúp Instagram mở rộng từ triệu lên tỷ người dùng mà không cần rewrite application.

Kết luận

Sharding là kỹ thuật mạnh để đưa database lên quy mô triệu người dùng, nhưng không phải giải pháp ban đầu cho mọi vấn đề. Bắt đầu từ đơn giản: tối ưu query, thêm index, cache, read replica. Khi mọi kỹ thuật đó đã bão, hãy sharding có chiến lược rõ ràng về shard key, rebalancing, và cross-shard query handling.


Nguồn tham khảo: Database Sharding Explained — dev.to, Database Sharding With Real Examples — dev.to, Database Sharding Strategies Deep Dive — dev.to

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Bun 1.1: JavaScript Runtime Mới Cho Full-Stack Development

Bun 1.1: JavaScript Runtime Mới Cho Full-Stack Development Bun là một JavaScript runtime mới nổi, được thiết kế từ đầu để thay thế Node.js trong nhiều trường hợp sử dụng….

Xem thêm

Flask 3.1: Micro Framework Web Python Hiện Đại Cho Dự Án Mới

Flask 3.1 là phiên bản mới nhất của framework web Python nhẹ nhất — và là một trong những dự án được tải nhiều nhất trên PyPI (trên 20 triệu…

Xem thêm
Minh họa lập trình Go 1.24 generic type aliases

Go 1.24: Generic Type Aliases, Tool Directives và Crypto Post-Quantum

Go 1.24 là bản phát hành mới nhất của ngôn ngữ lập trình Go, ra mắt tháng 2/2025 sáu tháng sau Go 1.23. Bản release này tập trung cải tiến…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất