Escale em estágios: read replicas + caching para leituras primeiro, depois sharding (Vitess) para escritas — e adicione connection pooling antes de tudo, porque é o 10x mais barato. Leituras e escritas escalam de forma diferente, então não recorra a sharding no primeiro dia.
┌─▶ 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
Passo 0: connection pooling
Cada conexão MySQL custa memória e uma thread. Com 100x de tráfego você esgotará muito antes da CPU. Um pooler como ou multiplexa milhares de conexões de app em algumas centenas de conexões de DB. É uma mudança de config, não uma rearquitetura — faça primeiro.
