Phân tích cơ chế điều phối Region trong TiDB qua bài toán xử lý điểm nóng

Vấn đề điểm nóng (Hotspot) trong TiDB

Kiến trúc cốt lõi của TiDB bao gồm ba thành phần: TiDB (lớp xử lý), TiKV (lớp lưu trữ phân tán) và PD (Placement Driver - trung tâm điều phối). Trong đó, TiKV chia nhỏ dữ liệu thành các Region – đơn vị nhỏ nhất để PD thực hiện điều phối.

Vấn đề "điểm nóng" xảy ra khi một lượng truy cập lớn đổ dồn vào cùng một Region Leader, khiến một nút TiKV bị quá tải trong khi các nút khác lại nhàn rỗi. Mặc dù TiDB có khả năng tự cân bằng (thông qua phân tách và di chuyển Region), nhưng trong các kịch bản ghi dữ liệu cường độ cao, việc chủ động xử lý là rất cần thiết.

Cấu trúc dữ liệu của Region

PD quản lý siêu dữ liệu (metadata) của Region thông qua cấu trúc quan trọng. Dưới đây là mô hình đơn giản hóa của một đối tượng Region trong PD:

type RegionData struct {
    ID          uint64
    StartRange  string
    EndRange    string
    Epoch       *metapb.RegionEpoch
    Peers       []*metapb.Peer
    Leader      *metapb.Peer
    Size        int64
    WriteCount  uint64
}
    

Các thành phần quan trọng:

  • StartRange & EndRange: Xác định phạm vi khóa (key range) theo khoảng [Start, End).
  • RegionEpoch: Đảm bảo tính nhất quán của phiên bản Region khi thay đổi cấu hình.
  • Peers & Leader: Đại diện cho các thành viên trong nhóm Raft và vai trò điều phối chính.

PD không tự ý can thiệp vào TiKV. Thay vào đó, TiKV chủ động gửi nhịp tim (heartbeat) chứa thông tin hiện tại của Region cho PD. PD dựa vào dữ liệu này để đưa ra các kế hoạch điều phối.

Các bộ điều phối (Scheduler) trong PD

PD tích hợp nhiều bộ điều phối chuyên biệt:

  • balance-leader-scheduler: Cân bằng số lượng Leader giữa các nút.
  • balance-region-scheduler: Cân bằng tổng dung lượng lưu trữ dữ liệu.
  • balance-hot-region-scheduler: Cân bằng lưu lượng mạng/I/O để giải quyết điểm nóng.

Mỗi bộ điều phối hoạt động dựa trên các tham số cấu hình linh hoạt. Ví dụ, khoảng thời gian giữa các lần điều phối được tính toán linh động để tránh gây áp lực lên hệ thống:

func calculateNextInterval(current time.Duration, strategy IntervalType) time.Duration {
    switch strategy {
    case Exponential:
        return min(current * Factor, MaxInterval)
    case Linear:
        return min(current + Step, MaxInterval)
    default:
        return current
    }
}
    

Quy trình điều phối

Quy trình vận hành của scheduler có thể chia làm 3 giai đoạn:

  1. Đăng ký: Tại thời điểm khởi động, PD đăng ký các hàm khởi tạo cho từng loại scheduler.
  2. Khởi tạo: Mỗi scheduler được gói trong một ScheduleController, giữ vai trò quản lý ngữ cảnh và thời gian thực thi (timer).
  3. Thực thi: Phương thức Schedule() được gọi định kỳ. Nó tạo ra các Operator (các hành động di chuyển hoặc phân tách Region). Các toán tử này được đưa vào hàng đợi và gửi tới TiKV thông qua nhịp tim tiếp theo.

Nếu một lần điều phối thất bại, hệ thống sẽ thực hiện thử lại (retry) một số lần nhất định (mặc định là 10) trước khi cập nhật lại khoảng thời gian chờ để đảm bảo tính ổn định của cụm TiKV.

Thẻ: TiDB TiKV PD DistributedSystem DatabaseEngine

Đăng vào ngày 13 tháng 6 lúc 04:16