Diferència entre revisions de la pàgina «MongoDB: escalant»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(Es crea la pàgina amb «Escalabilitat: capacitat per augmentar el nombre de consultes per segon. Estratègia típica: tenir diverses rèpliques en diferents instàncies de la BBDD on poder repa…».)
 
Línia 20: Línia 20:
  
 
== Escalant MongoDB ==
 
== Escalant MongoDB ==
 +
Per crear un ''replica set'' caldrà fer:
 +
# Arrencar les diferents instàncies de mongod
 +
# Configurar l'arbitratge (primari, secondaris, etc.)
 +
 
Amb aquest script podem crear diverses instàncies en diversos ports (normalment caldria crearles en diverses màquines):
 
Amb aquest script podem crear diverses instàncies en diversos ports (normalment caldria crearles en diverses màquines):
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línia 27: Línia 31:
 
mongod --replSet m101 --logpath "2.log" --dbpath /data/rs2 --port 27018 --smallfiles --fork
 
mongod --replSet m101 --logpath "2.log" --dbpath /data/rs2 --port 27018 --smallfiles --fork
 
mongod --replSet m101 --logpath "3.log" --dbpath /data/rs3 --port 27019 --smallfiles --fork
 
mongod --replSet m101 --logpath "3.log" --dbpath /data/rs3 --port 27019 --smallfiles --fork
 +
</syntaxhighlight>
 +
 +
Podem consultar què fa cadascuna de les instàncies mirant els logfiles (.log)
 +
 +
De moment estan arrencades i son accessibles a través dels diferents ports amb:
 +
$ mongo --port 27017
 +
 +
I ara caldrà configurar el ''set'' perquè s'arbitri correctament. Ens caldrà aquesta configuració:
 +
<syntaxhighlight lang="javascript">
 +
config = { _id: "m101", members:[
 +
          { _id : 0, host : "localhost:27017"},
 +
          { _id : 1, host : "localhost:27018"},
 +
          { _id : 2, host : "localhost:27019"} ]
 +
};
 +
rs.initiate(config);
 +
rs.status();
 
</syntaxhighlight>
 
</syntaxhighlight>

Revisió del 23:30, 8 gen 2014

Escalabilitat: capacitat per augmentar el nombre de consultes per segon.

Estratègia típica: tenir diverses rèpliques en diferents instàncies de la BBDD on poder repartir les consultes (particularment les de lectura).

Per entendre aquest article convé llegir MongoDB i potser Pymongo

Escalabilitat en BBDD

  • Si son rèpliques/instàncies de lectura cap problema. Les d'escriptura tenen la problemàtica de la consistència.
  • Solució típica: 1 instància primària (escriptura) i 2 (o més) de secundàries (lectura).
  • Les secundàries es sincronitzen a la primària regularment.
  • La primària sempre serà consistent. Les secundàries poden tenir un retràs en l'actualització de les dades.
  • Si cau la primària cal unes eleccions per determinar quina farà de primària.

Dos paràmetres d'escriptura:

  • w -> wait (esperem a que s'hagi escrit a memòria)
  • j -> journal (efectiva persistència en disc)

Aquests paràmetres son importants a la nostra aplicació ja que ens determinen què fem quan escrivim a la BBDD. Podem esperar a què s'hagi actualitzat a la memòria, o al jornal (disc dur) i tenir en compte si s'ha enregistrat a les altres instàncies.


Escalant MongoDB

Per crear un replica set caldrà fer:

  1. Arrencar les diferents instàncies de mongod
  2. Configurar l'arbitratge (primari, secondaris, etc.)

Amb aquest script podem crear diverses instàncies en diversos ports (normalment caldria crearles en diverses màquines):

#!/bin/bash
mkdir -p /data/rs1 /data/rs2 /data/rs3
mongod --replSet m101 --logpath "1.log" --dbpath /data/rs1 --port 27017 --smallfiles --fork
mongod --replSet m101 --logpath "2.log" --dbpath /data/rs2 --port 27018 --smallfiles --fork
mongod --replSet m101 --logpath "3.log" --dbpath /data/rs3 --port 27019 --smallfiles --fork

Podem consultar què fa cadascuna de les instàncies mirant els logfiles (.log)

De moment estan arrencades i son accessibles a través dels diferents ports amb:

$ mongo --port 27017

I ara caldrà configurar el set perquè s'arbitri correctament. Ens caldrà aquesta configuració:

config = { _id: "m101", members:[
          { _id : 0, host : "localhost:27017"},
          { _id : 1, host : "localhost:27018"},
          { _id : 2, host : "localhost:27019"} ]
};
rs.initiate(config);
rs.status();