Ý chính: Mở rộng cơ sở dữ liệu bắt đầu bằng việc tìm đúng nơi đang tranh chấp tài nguyên, không phải bằng cách thêm máy.
Thuật ngữ trong bài: Connection pool: nhóm kết nối dùng lại; replica: bản sao cơ sở dữ liệu để đọc; partition: chia dữ liệu thành các phần nhỏ theo một quy tắc.
Bài toán thực tế
Ứng dụng có thể tăng số máy nhanh hơn khả năng nhận kết nối của cơ sở dữ liệu. Pool kết nối quá lớn, truy vấn lặp và giao dịch kéo dài sẽ làm cạn năng lực. Tách dữ liệu quá sớm lại khiến vận hành phức tạp hơn.
Cơ sở dữ liệu thường chậm vì tranh chấp kết nối, truy vấn không hiệu quả hoặc giao dịch giữ tài nguyên quá lâu, không phải vì thiếu một kỹ thuật chia dữ liệu mới. Cần đo đúng điểm nghẽn trước khi tăng độ phức tạp.
Replica, partition và sharding chỉ có ích khi mô hình truy cập đã rõ. Nếu đưa vào quá sớm, chúng che vấn đề truy vấn và tạo thêm công việc vận hành.
Thiết kế và triển khai
- Đặt giới hạn kết nối cho toàn hệ thống rồi phân bổ cho API, worker và từng đợt triển khai.
- Ưu tiên tối ưu các truy vấn có tổng chi phí lớn nhất bằng kế hoạch thực thi và dữ liệu gần với production.
- Chỉ thêm replica hoặc partition khi đã xác định rõ yêu cầu nhất quán và quy tắc định tuyến dữ liệu.
Mã minh họa: Giao dịch hữu hạn và đọc theo mức nhất quán
with db.transaction(timeout = 800ms) as tx:
order = tx.orders.lock(orderId)
tx.orders.update(orderId, nextState)
readTarget = PRIMARY if session.justWrote else REPLICA
return query(readTarget, tenantId, orderId)Không gọi mạng bên ngoài khi đang giữ giao dịch cơ sở dữ liệu; một timeout bên ngoài có thể kéo dài khóa và ảnh hưởng khách hàng khác.
Rủi ro cần tính trước
- Đợt triển khai mở thêm nhiều kết nối hơn mức cơ sở dữ liệu có thể phục vụ.
- Replica chậm trả về quyền lợi cũ ngay sau khi khách hàng vừa nâng gói.
- Tạo chỉ mục trên bảng lớn giữ khóa hoặc làm bão hòa luồng ghi.
Nên theo dõi gì?
| Tín hiệu | Điều tín hiệu cho biết |
|---|---|
| Kết nối đang chạy so với kết nối đang chờ | Phân biệt tải hữu ích với tranh chấp trong nhóm kết nối. |
| Tổng thời gian truy vấn và số dòng phải đọc | Giúp ưu tiên truy vấn theo chi phí trên toàn hệ thống, không chỉ theo một lần chạy. |
| Thời gian chờ khóa và độ trễ replica | Làm rõ rủi ro nhất quán cùng các trường hợp độ trễ cao bất thường. |
Đưa vào production từng bước
Đưa số liệu truy vấn và kết nối vào bảng theo dõi trước. Thu nhỏ các nhóm kết nối quá lớn, sửa truy vấn bị lộ ra, rồi thử replica trên một luồng đọc chấp nhận dữ liệu cũ; coi partition hoặc sharding là dự án riêng có đối soát và phương án quay lui.
Điều cần nhớ
Cơ sở dữ liệu mở rộng tốt nhờ giới hạn tài nguyên và mô hình truy cập có thể dự đoán, trước khi cần tới việc chia nhỏ dữ liệu.
