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;
 
});
Zurück