MongoDB: Sharing auf einer einzelnen Maschine. Macht das Sinn?

7

hat eine Sammlung in MongoDB erstellt, die aus 11446615 Dokumenten besteht.

Jedes Dokument hat die folgende Form:

%Vor%

Ссылка : Nur eine URL

Wörter : Wörter, die von der obigen URL analysiert wurden. Die Größe der Liste liegt zwischen 15 und 90.

Ich plane, diese Datenbank zu verwenden, um eine Liste von Webseiten mit ähnlichem Inhalt zu erhalten.

Ich werde diese Sammlung mit dem Feld words abfragen, so dass ich den Index für dieses Feld erstellt habe (oder vielmehr damit begonnen habe):

%Vor%

Das Erstellen dieser Sammlung dauert sehr lange. Ich versuchte zwei Ansätze (Tests wurden auf meinem Laptop durchgeführt):

  1. Einfügen und Indizieren Das Einfügen dauerte 5,5 Stunden, hauptsächlich wegen der CPU-intensiven Vorverarbeitung von Daten. Die Indizierung dauerte 30 Stunden.
  2. Indizierung vor dem Einfügen Es würde einige Tage dauern, alle Daten in die Sammlung einzufügen.

Mein Hauptaugenmerk liegt darauf, die Zeit der Erstellung der Sammlung zu reduzieren. Ich brauche keine Replikation (zumindest für jetzt). Die Abfrage muss auch nicht lichtecht sein.

Nun, Zeit für eine Frage:

Ich habe nur eine Maschine mit einer Festplatte, auf der ich meine App ausführen kann. Ist es sinnvoll, mehr als eine Instanz der Datenbank auszuführen und meine Daten aufzuteilen?

    
whysoserious 25.06.2011, 12:06
quelle

5 Antworten

15

Ja , es macht Sinn, auf einem einzelnen Server zu sharden.

  1. Zu diesem Zeitpunkt verwendet MongoDB immer noch eine globale Sperre pro mongodb-Server. Das Erstellen mehrerer Server wird einen Server von den Sperren des jeweils anderen Servers freigeben.

  2. Wenn Sie eine Maschine mit mehreren Kernen mit separaten NUMAs ausführen, ist dies möglich     erhöhen Sie auch die Leistung.

  3. Wenn Ihre Belastung für Ihren Server zu stark ansteigt, erleichtert das anfängliche Sharding in Zukunft die horizontale Skalierung. Sie können es jetzt genauso gut tun.

Maschinen variieren. Ich schlage vor, ein eigenes Bulk-Insertion-Benchmark-Programm zu schreiben und eine Anzahl von MongoDB-Server-Shards hochzufahren. Ich habe einen RAID-basierten 16-Core-Rechner, und ich habe herausgefunden, dass 3-4 Shards ideal für meine Datenbank für schwere Schreibvorgänge sind. Ich stelle fest, dass meine zwei NUMAs mein Engpass sind.

    
EhevuTov 22.02.2012, 19:05
quelle
4

In der heutigen Zeit (2015) gibt es mit mongodb v3.0.x ein Sperren auf Sammlungsebene mit mmap, was den Schreibdurchsatz leicht erhöht (vorausgesetzt, Sie schreiben in mehrere Sammlungen), aber wenn Sie es verwenden Die Wiredtiger-Engine gibt es auf Dokumentebene, die einen viel höheren Schreibdurchsatz hat. Dadurch entfällt das Sharding auf einer einzelnen Maschine. Obwohl Sie die Leistung von mapReduce technisch noch erhöhen können, indem Sie Sharding auf einem einzelnen Rechner durchführen, wäre es in diesem Fall besser, wenn Sie nur das Aggregation-Framework verwenden, das mehrere Kerne ausnutzen kann. Wenn Sie sich stark auf Kartenreduzierungsalgorithmen verlassen, ist es vielleicht am sinnvollsten, etwas wie Hadoop zu verwenden.

Der einzige Grund, mongodb zu scheren, ist horizontal zu skalieren. Für den Fall, dass ein einzelner Computer nicht genügend Speicherplatz, Arbeitsspeicher oder CPU-Leistung aufnehmen kann (selten), wird das Sharding vorteilhaft. Ich denke, es ist wirklich selten, dass jemand genug Daten hat, die sie zu shard, sogar ein großes Geschäft, vor allem seit wiredtiger Kompression Unterstützung hinzugefügt, die Festplattennutzung auf über 80% weniger reduzieren kann. Es ist auch selten, dass jemand mongodb verwendet, um wirklich CPU-intensive Abfragen in großem Maßstab durchzuführen, weil es hierfür viel bessere Technologien gibt. In den meisten Fällen ist IO der wichtigste Faktor für die Leistung, nicht viele Abfragen sind CPU-intensiv, es sei denn, Sie führen eine Menge komplexer Aggregationen durch, sogar Geo-Spatial wird beim Einfügen indiziert.

Der wahrscheinlichste Grund, warum Sie Shard benötigen, ist, wenn Sie viele Indizes haben, die eine große Menge an RAM verbrauchen, verdrahteter reduziert dies, aber es ist immer noch der häufigste Grund für shard. Wenn das Sharding über eine einzelne Maschine wahrscheinlich nur einen unerwünschten Overhead verursacht, mit sehr wenig oder gar keinen Vorteilen.

    
tsturzl 05.08.2015 18:41
quelle
2

Dies muss keine Mongo-Frage sein, es ist eine allgemeine Betriebssystemfrage. Es gibt drei mögliche Engpässe für Ihre Datenbanknutzung.

  1. Netzwerk (d. h. Sie sind auf einer Gigabit-Leitung, Sie verwenden das meiste zu Spitzenzeiten, aber Ihre Datenbank ist nicht wirklich geladen)
  2. CPU (Ihre CPU liegt nahe bei 100%, aber Festplatte und Netzwerk ticken kaum)
  3. Festplatte

Falls es ein Netzwerk gibt, überschreiben Sie das Netzwerkprotokoll, falls möglich, andernfalls shard zu anderen Rechnern. Wenn Sie bei der CPU zu 100% auf einigen Kernen arbeiten, andere aber frei sind, verbessert das Sharding auf demselben Rechner die Leistung. Wenn die Festplatte voll ausgelastet ist, fügen Sie mehr Festplatten und Shards hinzu - viel billiger als das Hinzufügen weiterer Maschinen.

    
amwinter 07.01.2013 16:26
quelle
1

Nein, es macht keinen Sinn, a auf einem einzelnen Server zu sharden.

Es gibt ein paar Ausnahmefälle, aber sie gehen meistens auf Nebenläufigkeitsprobleme zurück, die mit Dingen wie dem Ausführen von map / reduce oder Javascript zusammenhängen.

    
Scott Hernandez 25.06.2011 14:30
quelle
-2

Dies wird im ersten Absatz des Tutorials zum Replikatsatz

beantwortet

Ссылка

    
Andreas Jung 25.06.2011 12:09
quelle

Tags und Links