#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
| Traffic | Chiến lược | Độ phức tạp |
|---|---|---|
| < 10K QPS | Vertical scaling | Thấp |
| 10-100K QPS | Read replicas | Trung bình |
| 100K+ QPS | Sharding | Cao |
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.