Sharding mit MongoDB
Wir bauen uns eine minimale Sharding Konfiguration mit mongodb. Bestens geeignet für eine Dev Umgebung. Mein System: Mac OS X 10.10 / mongodb 3.0
Konfiguration
- Ein Config Server
- Ein Router
- und zwei Shards mit je drei Replica Sets (Primary, 2 x Secondaries)
Config Server erstellen
Im Config - Server werden keine Nutzerdaten gespeichert, sondern nur die Informationen über die Shards und die dazugehörende Keys.
mkdir /data/farm/config
mongod --port 27019 --configsvr --dbpath /data/farm/config
Router Server starten
Der Router verarbeitet die einzelnen Anfragen und delegiert diese zu den jeweiligen Shards. Eine Anwendung kommuniziert mit einem Router Server.
mongos --port 10000 --configdb localhost:8000 --chunkSize 1
Zwei Shards mit je drei Replica Sets erstellen
In den Shards werden die Daten gespeichert. Der Replica Set verbessert die Ausfallsicherheit.
mkdir /data/dataHosts/rHost1
mkdir /data/dataHosts/rHost2
mkdir /data/dataHosts/rHost3
mkdir /data/dataHosts/rHost4
mkdir /data/dataHosts/rHost5
mkdir /data/dataHosts/rHost6
# replSet rHost (shard #1)
mongod --replSet rHost --dbpath /data/dataHosts/rHost1 --port 8001 --httpinterface --rest --oplogSize 50
mongod --replSet rHost --dbpath /data/dataHosts/rHost2 --port 8002 --httpinterface --rest --oplogSize 50
mongod --replSet rHost --dbpath /data/dataHosts/rHost3 --port 8003 --httpinterface --rest --oplogSize 50
# replSet rHost2 (shard #2)
mongod --replSet rHost2 --dbpath /data/dataHosts/rHost4 --port 8004 --httpinterface --rest --oplogSize 50
mongod --replSet rHost2 --dbpath /data/dataHosts/rHost5 --port 8005 --httpinterface --rest --oplogSize 50
mongod --replSet rHost2 --dbpath /data/dataHosts/rHost6 --port 8006 --httpinterface --rest --oplogSize 50
# initiate replSet rHost
mongo --port 8001
rs.initiate()
# Es wird nur der Primary Knoten initialisiert die zwei Secondaries müssen nur noch hinzugefügt werden
rs.add("localhost:8002")
rs.add("localhost:8003")
# das ganze nochmal wiederholen für rHost2
mongo --port 8004
rs.initiate()
rs.add("localhost:8005")
rs.add("localhost:8006")
Replica Sets zu Shards umwandeln
mongo --port 10000
sh.addShard("rHost/localhost:8001")
{ "shardAdded" : "rHost", "ok" : 1 }
sh.addShard("rHost2/localhost:8004")
{ "shardAdded" : "rHost2", "ok" : 1 }
Sharding Verwaltung
mongo --port 10000
Sharding für die Datenbank aktivieren
Mit sh.enableSharding("databasename")
können wir unsere Datenbank für das Sharding aktivieren. Danach müssen wir ein Index( Schlüssel ) aussuchen anhand welchem unsere Dokumenten auf Chunks(Shards) aufgeteilt werden. Es sollte von Typ String, Hash oder Number sein. Zusätzlich sollte es eine hohe Variabilität aufweisen. Gut geeignet wären Username, Email oder ein Hashwert.
Damit wir Sharding nutzen können, müssen wir ein Index anlegen. Ohne Index ist kein Sharding möglich!
Alternativ ohne Replica Sets
Wer ohne Replica Sets Shards anlegen möchte:
mkdir /data/farm/shard1
mkdir /data/farm/shard2
mongod —port 10001 —dbpath /data/farm/shard1
mongod —port 10002 —dbpath /data/farm/shard2
sh.addShard("localhost:10001")
sh.addShard("localhost:10002")
Mit node.js Treiber verbinden
mongodb Treiber für node.js installieren: npm install mongodb Mit Router Server verbinden
var url = 'mongodb://localhost:10000/databasename';
MongoClient.connect(url, function(err, db) {
var database = db;
});
Alexander Naumov
Contao Freelancer, PHP Entwickler und Web Allrounder