Volver a MongoDB Intermedio
Replicación y Sharding en MongoDB
Replica Sets
// Iniciar un replica set de 3 miembros
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017", priority: 2 }, // preferido como primario
{ _id: 1, host: "mongo2:27017", priority: 1 },
{ _id: 2, host: "mongo3:27017", arbiterOnly: true } // solo desempate
]
})
// Verificar estado
rs.status()
// Forzar elección de nuevo primario
rs.stepDown(60)
Preferencias de Lectura
// Leer de secundarias
const client = new MongoClient(uri, {
readPreference: "secondaryPreferred"
})
// Opciones disponibles:
// primary — siempre del primario (default)
// primaryPreferred — primario si disponible
// secondary — siempre de secundaria
// secondaryPreferred — secundaria si disponible
// nearest — menor latencia
Write Concerns
// Escritura de mayoría (sobrevive failover)
await collection.insertOne(doc, {
writeConcern: { w: "majority", j: true, wtimeout: 5000 }
})
// Sobrescribir por operación (solo primario)
await collection.updateMany(
{ estado: "pendiente" },
{ $set: { estado: "procesando" } },
{ writeConcern: { w: 1 } }
)
Arquitectura de Sharding
┌──────────────────┐
App ──►│ mongos (router) │
└────────┬─────────┘
│
┌─────────┼──────────┐
▼ ▼ ▼
Shard 0 Shard 1 Shard 2
RS(3) RS(3) RS(3)
Configurar Sharding
// Habilitar sharding en la base de datos
sh.enableSharding("miapp")
// Shard por hash (distribución uniforme)
sh.shardCollection("miapp.eventos", { _id: "hashed" })
// Shard por rango (consultas de rango naturales)
sh.shardCollection("miapp.metricas", { dispositivoId: 1, timestamp: 1 })
// Verificar distribución
db.eventos.getShardDistribution()
Elección del Shard Key
| Criterio | Buena Clave | Mala Clave |
|---|---|---|
| Cardinalidad | Muchos valores únicos | Booleano / enum |
| Distribución | Uniforme | Monotónicamente creciente |
| Consultas | Aparece en queries comunes | Nunca en queries |
// ❌ Malo: ObjectId como rango → shard caliente
sh.shardCollection("miapp.logs", { _id: 1 })
// ✅ Bueno: hash para distribución uniforme
sh.shardCollection("miapp.logs", { _id: "hashed" })
// ✅ Bueno: clave compuesta para consultas de rango
sh.shardCollection("miapp.metricas", { tenantId: 1, creado_en: 1 })
Zone Sharding (Localidad de Datos)
// Etiquetar shards por región
sh.addShardTag("shard0", "LATAM")
sh.addShardTag("shard1", "US")
// Redirigir clientes de LATAM a shards de LATAM
sh.addTagRange(
"miapp.usuarios",
{ pais: "MX", _id: MinKey },
{ pais: "MX", _id: MaxKey },
"LATAM"
)