Scale theo từng giai đoạn: read replica + caching cho read trước, rồi sharding (Vitess) cho write — và thêm connection pooling trước tiên, vì đó là cú 10x rẻ nhất. Read và write scale khác nhau, nên đừng với tới sharding ngay ngày đầu.
┌─▶ Cache (Redis) ── hit ──▶ return
App ─▶ Pool(PgBouncer/ProxySQL) miss ▼
│ ┌─▶ Read replica 1 ┐
├──── reads ─────────┼─▶ Read replica 2 ┼─ (async replication)
│ └─▶ Read replica N ┘
└──── writes ──▶ Primary ──▶ (later) Vitess shards ─▶ Primary A / Primary B
Bước 0: connection pooling
Mỗi connection MySQL tốn memory và một thread. Ở 100x traffic bạn sẽ cạn từ lâu trước khi cạn CPU. Một pooler như hay ghép hàng nghìn connection từ app vào vài trăm connection DB. Đó là đổi config, không phải tái kiến trúc — làm trước.
