#database #scalability #backend

Chiến lược Mở rộng Database: Từ Single Node đến Sharding

Hướng dẫn toàn diện về chiến lược mở rộng database bao gồm vertical scaling, read replicas, partitioning và sharding cho ứng dụng traffic cao.

2 phút đọc
Mục lục

Hành trình Mở rộng

Mọi ứng dụng thành công cuối cùng đều đối mặt với cùng một thách thức: database trở thành điểm nghẽn. Đây là cách tiếp cận hệ thống để mở rộng database.

Level 1: Vertical Scaling

Cách đơn giản nhất — mua máy mạnh hơn.

Trước: 4 CPU, 16GB RAM, 100GB SSD
Sau:   32 CPU, 128GB RAM, 2TB NVMe

Ưu điểm: Không cần thay đổi code, không phức tạp Nhược điểm: Đắt, có giới hạn cứng

Level 2: Read Replicas

Tách biệt traffic đọc và ghi:

class DatabaseRouter {
  private primary: Connection;
  private replicas: Connection[];

  query(sql: string, isWrite: boolean) {
    if (isWrite) {
      return this.primary.execute(sql);
    }
    const replica = this.replicas[
      Math.floor(Math.random() * this.replicas.length)
    ];
    return replica.execute(sql);
  }
}

Level 3: Sharding

Phân phối dữ liệu trên nhiều database:

function getShardKey(userId: string): number {
  const hash = crypto
    .createHash("md5")
    .update(userId)
    .digest("hex");
  return parseInt(hash.slice(0, 8), 16) % NUM_SHARDS;
}

Chọn Chiến lược Phù hợp

TrafficChiến lượcĐộ phức tạp
< 10K QPSVertical scalingThấp
10-100K QPSRead replicasTrung bình
100K+ QPSShardingCao

Kết luận

Bắt đầu đơn giản. Tối ưu queries trước. Thêm indexes. Dùng caching. Chỉ shard khi đã hết các lựa chọn đơn giản hơn. Sharding quá sớm là một trong những sai lầm tốn kém nhất trong thiết kế hệ thống.