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

CriterioBuena ClaveMala Clave
CardinalidadMuchos valores únicosBooleano / enum
DistribuciónUniformeMonotónicamente creciente
ConsultasAparece en queries comunesNunca 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" )