0
0
Lập trình
Admin Team
Admin Teamtechmely

Sharding trong Cơ sở dữ liệu: Cách xác định Shard chính xác

Đăng vào 6 tháng trước

• 5 phút đọc

🔹 Sharding trong Cơ sở dữ liệu là gì?

Sharding là một kỹ thuật phân vùng cơ sở dữ liệu, trong đó dữ liệu được chia thành nhiều cơ sở dữ liệu hoặc máy chủ (được gọi là shards) để cải thiện khả năng mở rộng và hiệu suất.

Mỗi shard chứa một phần dữ liệu (không phải bản sao đầy đủ). Ví dụ:

  • Giả sử bạn có một bảng người dùng với 100 triệu dòng.
  • Thay vì lưu trữ tất cả trong một cơ sở dữ liệu, bạn có thể chia:
    • Shard 1 → người dùng có ID từ 1 đến 25 triệu
    • Shard 2 → người dùng có ID từ 25 triệu đến 50 triệu
    • Shard 3 → người dùng có ID từ 50 triệu đến 75 triệu
    • Shard 4 → người dùng có ID từ 75 triệu đến 100 triệu

Giờ đây, mỗi shard chỉ xử lý một tập hợp con, do đó các truy vấn và ghi dữ liệu trở nên nhanh hơn.

👉 Sharding thường được sử dụng trong các hệ thống quy mô rất lớn (ví dụ: Facebook, Twitter, YouTube) nơi một máy chủ cơ sở dữ liệu không thể xử lý toàn bộ tải.


🔹 Những khái niệm tương tự trong Cơ sở dữ liệu

Sharding chỉ là một trong nhiều kỹ thuật mở rộng/phân phối. Hãy so sánh:

1. Sao chép (Replication)

  • Bản sao của cùng một cơ sở dữ liệu được lưu giữ trên nhiều máy chủ.
  • Mô hình Master → Replica(s).
  • Được sử dụng cho mở rộng đọckhả năng sẵn sàng cao.
  • Ví dụ: MySQL Replication, PostgreSQL Streaming Replication.

👉 Sự khác biệt với sharding: Bản sao có bản sao đầy đủ, trong khi các shard có dữ liệu một phần.


2. Phân vùng (Partitioning) (trong một cơ sở dữ liệu duy nhất)

  • Dữ liệu được chia thành các phân vùng nhỏ hơn, dễ quản lý bên trong một máy chủ cơ sở dữ liệu.

  • Các loại:

    • Phân vùng ngang (Horizontal Partitioning) → các hàng được chia (như sharding, nhưng trong một máy chủ).
    • Phân vùng dọc (Vertical Partitioning) → các cột được chia (ví dụ: các cột thường được truy cập trong một bảng, JSON/blob lớn trong bảng khác).
  • Ví dụ: Phân vùng MySQL, Phân vùng bảng PostgreSQL.

👉 Sharding thực chất là phân vùng ngang giữa nhiều máy chủ.


3. Liên kết / Cụm cơ sở dữ liệu (Federation / Database Clustering)

  • Chia dữ liệu qua các cơ sở dữ liệu khác nhau một cách logic (như sharding, nhưng đôi khi thực hiện ở mức ứng dụng).
  • Ví dụ: SQL Server Federation, Citus cho PostgreSQL.

4. Pooling kết nối (Connection Pooling)

  • Không phải là phân phối dữ liệu, nhưng là một khái niệm quan trọng: tái sử dụng các kết nối cơ sở dữ liệu để cải thiện hiệu suất dưới tải cao.

5. Caching

  • Lưu trữ dữ liệu thường xuyên được truy cập trong Redis, Memcached, v.v.
  • Giúp giảm tải cho cơ sở dữ liệu (thường kết hợp với sharding).

🔹 So sánh MySQL và PostgreSQL

  • MySQL

    • Hỗ trợ sao chép, phân vùng, có thể được sharding thông qua middleware như Vitess (được YouTube sử dụng).
    • MySQL Cluster (NDB) cũng cung cấp sharding tự động.
  • PostgreSQL

    • Hỗ trợ phân vùng bảng tự nhiên.
    • Sao chép tích hợp.
    • Có thể sử dụng các mở rộng như Citus (cho PostgreSQL phân tán với sharding).

Cách hệ thống quyết định shard nào để truy vấn.

Không có phép thuật - cơ sở dữ liệu (hoặc middleware, hoặc ứng dụng của bạn) cần có một shard key (một quy tắc để xác định nơi dữ liệu nằm).


🔹 Cách các truy vấn tìm shard đúng

  1. Shard Key
  • Một cột đặc biệt (như user_id, customer_id, order_id, v.v.) được chọn.
  • Ví dụ: Nếu user_id = 12345, thì hệ thống áp dụng một quy tắc như:
    Copy
    shard_number = user_id % 4
    • Nếu kết quả = 1 → chuyển đến Shard 1
    • Nếu kết quả = 2 → chuyển đến Shard 2, v.v.
  • Đây được gọi là sharding dựa trên băm.

  1. Bảng ánh xạ (Shard Mapping)
  • Đôi khi, một bảng ánh xạ (hoặc dịch vụ cấu hình) lưu trữ shard nào giữ dữ liệu nào.
  • Ví dụ:
    Copy
    user_id_range   -> shard
    1 - 25M         -> shard1.db.com
    25M - 50M       -> shard2.db.com
    50M - 75M       -> shard3.db.com
  • Khi một truy vấn đến, ứng dụng sẽ tra cứu bảng ánh xạ trước.

  1. Middleware / Proxy
  • Các công cụ như Vitess (MySQL), Citus (Postgres), hoặc middleware tùy chỉnh nằm giữa ứng dụng và cơ sở dữ liệu.
  • Chúng chặn các truy vấn, kiểm tra shard key và định tuyến đến shard đúng.
  • Đối với ứng dụng của bạn, nó giống như một cơ sở dữ liệu.

  1. Truy vấn phát sóng (Broadcast Queries)
  • Nếu một truy vấn không bao gồm shard key (ví dụ, “tìm tất cả người dùng có email = xyz@gmail.com”), hệ thống có thể cần truy vấn tất cả các shard và kết hợp kết quả.
  • Điều này chậm, đó là lý do tại sao việc chọn shard key đúng là rất quan trọng.

🔹 Ví dụ: Luồng truy vấn Shard

Giả sử bạn đang lưu trữ người dùng trên 4 shard:

  • Quy tắc Shard: user_id % 4
  • Người dùng có user_id = 1017 đăng nhập.

Truy vấn:

Copy
SELECT * FROM users WHERE user_id = 1017;

Dòng chảy:

  1. Ứng dụng thấy user_id = 1017.
  2. Tính toán → 1017 % 4 = 1.
  3. Truy vấn chỉ đến Shard 1.
  4. Kết quả được trả về.

Tóm tắt:

  • Các truy vấn tìm shard đúng bằng cách sử dụng shard keys.
  • Việc định tuyến được thực hiện bởi:
    • Logic ứng dụng
    • Middleware/proxy
    • Bảng ánh xạ
  • Nếu không có shard key → hoặc truy vấn phát sóng hoặc chỉ mục tập trung.

Tóm tắt nhanh:

  • Sao chép → bản sao của cùng một dữ liệu.
  • Sharding → chia dữ liệu thành các tập hợp con qua các máy chủ.
  • Phân vùng → chia dữ liệu bên trong một cơ sở dữ liệu duy nhất.
  • Cụm / Liên kết → nhiều cơ sở dữ liệu hoạt động như một.
  • Caching → giảm tải cho cơ sở dữ liệu.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào