Frage

NoSQL bezieht sich auf nicht-relationalen Daten speichern, dass Bruch mit der Geschichte von relationalen Datenbanken und ACID garantiert. Beliebte Open-Source-NoSQL-Datenspeicher enthalten:

  • Cassandra (tabellarisch, in Java geschrieben, verwendet von Cisco, WebEx, Digg, Facebook, IBM , Mahalo, Rackspace, Reddit und Twitter)
  • CouchDB (Dokument, in Erlang geschrieben, die von BBC und Engine Yard)
  • Dynomite (Schlüssel-Wert, in Erlang geschrieben, verwendet von Powerset)
  • HBase (Schlüssel-Wert, die in Java geschrieben, verwendet von Bing)
  • Hyper (tabellarisch, in C ++ geschrieben, verwendet von Baidu)
  • Kai (Schlüssel-Wert, geschrieben in Erlang)
  • memcachedb (Schlüssel-Wert, in C geschrieben, verwendet von Reddit)
  • MongoDB (Dokument, geschrieben in C ++, verwendet von Electronic Arts, Github, New York Times und Source)
  • Neo4j (Graph, in Java geschrieben, die von einigen schwedischen Universitäten verwendet wird)
  • Projekt Voldemort (Schlüssel-Wert, in Java geschrieben, verwendet von LinkedIn)
  • Redis (Schlüssel-Wert, in C geschrieben, verwendet von Craigslist, Engine Yard und Github)
  • Riak (Schlüssel-Wert, in Erlang geschrieben, die von Comcast und Mochi Media)
  • Ringo (Schlüssel-Wert, in Erlang geschrieben, die von Nokia)
  • Scalaris (Schlüssel-Wert, in Erlang geschrieben, verwendet von OnScale)
  • Terrastor (Dokument, in Java geschrieben)
  • ThruDB (Dokument, in C ++ geschrieben, verwendet von JunkDepot.com)
  • Tokyo Cabinet / Tokyo Tyrant (Schlüssel-Wert, in C geschrieben, verwendet von Mixi.jp (Japanese Social-Networking-Site))

Ich möchte über spezifische Probleme, die Sie kennen - der Leser SO -. Gelöst haben Datenspeicher verwenden und was NoSQL Daten speichern Sie verwendet

Fragen:

  • Was Skalierbarkeit Probleme haben Sie NoSQL-Datenspeicher verwendet zu lösen?
  • Was NoSQL-Datenspeicher haben Sie?
  • Was Datenbank haben Sie dabei vor einer NoSQL-Datenspeicher zu wechseln?

Ich suche nach Erfahrungen aus erster Hand, also bitte nicht beantworten, wenn Sie das haben.

War es hilfreich?

Lösung

Ich habe ein kleines Teilprojekt von MySQL zu CouchDB geschaltet, in der Lage sein, die Last zu handhaben. Das Ergebnis war erstaunlich.

Vor ungefähr 2 Jahren haben wir eine selbst geschriebene Software auf http://www.ubuntuusers.de/ freigegeben (was wahrscheinlich die größte deutsche Linux-Community-Website ist). Die Seite ist in Python geschrieben und wir haben eine WSGI Middleware hinzugefügt die in der Lage war, alle Ausnahmen zu fangen und sie in einer anderen kleinen MySQL betriebenen Website zu senden. Diese kleine Website verwendet einen Hash verschiedene Fehler zu bestimmen und die Anzahl der Vorkommen und das letzte Vorkommen als auch gespeichert werden.

Leider kurz nach der Veröffentlichung, die Protokoll-Logger Webseite reagiert nicht mehr. Wir hatten einige Sperren Probleme mit der Produktion db unserer Haupt-Website, die Ausnahmen fast jeden Wunsch warf, sowie mehrere andere Fehler, die wir nicht während der Testphase untersucht. Der Server-Cluster unserer Haupt-Website, die Protokoll-Logger genannt einreichen Seite mehr k-mal pro Sekunde. Und das war zu viel ein Weg für den kleinen Server, der die Traceback-Logger gehostet (es war schon ein alter Server, der nur für Entwicklungszwecke verwendet wurde).

Zu diesem Zeitpunkt CouchDB war ziemlich beliebt, und so entschied ich mich, es auszuprobieren und schreibe einen kleinen Protokoll-Logger mit ihm. Der neue Logger bestand nur aus einer einzigen Python-Datei, die eine Fehlerliste mit Sortier- und Filteroptionen zur Verfügung gestellt und eine einreichen Seite. Und im Hintergrund habe ich einen CouchDB-Prozess gestartet. Die neue Software reagiert extrem schnell auf alle Anfragen und wir konnten die enorme Menge von automatischen Fehlermeldungen anzuzeigen.

Eine interessante Sache ist, dass die Lösung vor, wurde auf einem alten dedizierten Server ausgeführt wird, in dem die neue CouchDB basierte Website auf der anderen Seite wurde nur mit sehr begrenzten Ressourcen auf einer gemeinsame xen Instanz läuft. Und ich habe nicht einmal die Kraft der Schlüsselwerte speichern verwendet horizontal zu skalieren. Die Fähigkeit von CouchDB / Erlang OTP gleichzeitigen Anfragen zu bearbeiten, ohne etwas zu Verriegelung war schon genug, um die Bedürfnisse zu dienen.

Nun, die schnell geschrieben CouchDB-Traceback-Logger noch läuft und ist ein hilfreicher Weg, Fehler auf der Haupt-Website zu erkunden. Wie auch immer, einmal im Monat wird die Datenbank zu groß und der CouchDB Prozess getötet wird. Aber dann die Kompakt db Befehl von CouchDB reduziert die Größe von mehreren GBs einigen KBs wieder und die Datenbank ist und läuft wieder (vielleicht sollte ich einen Cronjob Zugabe von dort ... 0o).

In einer Zusammenfassung, CouchDB war sicherlich die beste Wahl (oder zumindest eine bessere Wahl als MySQL) für dieses Teilprojekt und es macht seinen Job gut.

Andere Tipps

Mein aktuelles Projekt tatsächlich.

Speicher 18.000 Objekte in einer normalisierten Struktur: 90.000 Zeilen über 8 verschiedene Tabellen. Nahm 1 Minute sie zu unserem Java-Objektmodell zum Abrufen und Karte, das ist alles, was etc korrekt indiziert.

Speichern von ihnen als Schlüssel / Wert-Paare eine leichte Textdarstellung verwendet. 1 Tisch, 18.000 Zeilen, 3 Sekunden abrufen sie alle und rekonstruieren die Java-Objekte

Im Geschäftsbedingungen: erste Option war nicht möglich. Zweite Option bedeutet, dass unser App funktioniert.

Technologie Details: auf MySQL laufen sowohl für SQL und NoSQL! Das Festhalten an MySQL für eine gute Transaktionsunterstützung, Leistung und nachgewiesene Erfolgsbilanz für keine Daten korrumpieren, Skalierung ziemlich gut, Unterstützung für Clustering usw.

Unser Datenmodell in MySQL ist jetzt nur Schlüsselfelder (Integer) und das große Feld „Wert“. Nur ein großes Feld TEXT im Grunde

Wir haben nicht mit einem der neuen Spieler (CouchDB, Cassandra, MongoDB, usw.), denn obwohl sie jedes Angebot großartige Funktionen / Leistung in ihrem eigenen Recht, gab es Nachteile immer für unsere Verhältnisse (zB fehlende / unreif Java-Unterstützung ).

Zusatznutzen von (ab) mit MySQL -. Die Bits unseres Modells, dass Sie Arbeit kann relational leicht zu unserem Schlüssel / Wert-Speicherdaten verknüpft werden

Update: hier ist ein Beispiel dafür, wie wir Textinhalt dargestellt, nicht unsere tatsächlichen Geschäfts Domain (wir arbeiten nicht mit „Produkte“), wie meine boss'd schießen mir, aber vermittelt die Idee, einschließlich der rekursiven Aspekt (ein Einheit, hier ein Produkt, „enthalten“ andere). Hoffentlich ist es klar, wie in einer normalisierten Struktur dies durchaus ein paar Tische sein könnte, z.B. Verbinden Sie ein Produkt auf seine Palette von Aromen, die anderen Produkten enthalten sind, usw.

Name=An Example Product
Type=CategoryAProduct
Colour=Blue
Size=Large
Flavours={nice,lovely,unpleasant,foul}
Contains=[
Name=Product2
Type=CategoryBProduct
Size=medium
Flavours={yuck}
------
Name=Product3
Type=CategoryCProduct
Size=Small
Flavours={sublime}
]

Todd Hoff highscalability.com hat viele große Reichweite von NoSQL, darunter auch einige Fallstudien.

Die kommerzielle Vertica säulen DBMS könnte Ihre Zwecke anpassen (auch wenn es SQL unterstützt): es ist sehr schnell im Vergleich zu traditioneller relationaler DBMS für Analytik Abfragen. Siehe Stonebraker, et al. letzten CACM Papier kontras Vertica mit Karte -Reduzierung.

Update: Und ausgewählt Cassandras Twitter über mehr andere, darunter HBase, Voldemort, MongoDB, memcachedb, Redis und Hyper.

Update 2: Rick Cattell hat gerade ein Vergleich mehrerer NoSQL Systeme in High Performance Datenspeicher veröffentlicht . Und highscalability.com nehmen auf Ricks Papier hier .

Wir zogen Teil unserer Daten aus MySQL zu mongodb, nicht so sehr für die Skalierbarkeit, sondern mehr, weil es eine bessere Passform für Dateien und Nicht-Tabellendaten.

In der Produktion wir zur Zeit speichern:

  • 25 Tausend Dateien (60GB)
  • 130 Millionen andere "Dokumente" (350 GB)

mit einem täglichen Umsatz von rund 10 GB.

Die Datenbank in einer "gepaart" Konfiguration auf zwei Knoten (6x450GB sas raid10) mit Apache / wsgi / Python Clients mit dem mongodb Python-API (pymongo) eingesetzt wird. Der Plattenaufbau ist wahrscheinlich übertrieben, aber das ist, was wir für MySQL verwenden.

Abgesehen von einigen Problemen mit pymongo threadpools und der Blockierung der Natur des mongodb Servers hat es eine gute Erfahrung.

Ich entschuldige mich für das Gehen gegen den fett gedruckten Text, weil ich habe keine Erfahrungen aus erster Hand, aber dieser Satz von Blog-Posts ist ein gutes Beispiel für ein Problem mit CouchDB zu lösen.

CouchDB: A Case Study

Im Wesentlichen die TextMe Anwendung verwendet CouchDB mit ihrem rasanten Daten Problem zu beschäftigen. Sie fanden heraus, dass SQL zu langsam war mit großen Mengen von Archivdaten zu behandeln, und zogen es über zu CouchDB. Es ist eine ausgezeichnete lesen, und er beschreibt den gesamten Prozess, herauszufinden, welche Probleme CouchDB lösen könnte und wie sie sie zu lösen endete.

Wir haben einige unserer Daten zogen wir zum Speichern in Postgresql verwendet und Memcached in Redis . Schlüsselwert speichert sind viel besser geeignet für hierarchische Objektdaten zu speichern. Sie können Blob-Daten speichern viel schneller und mit viel weniger Entwicklungszeit und Aufwand als ein ORM mit Ihrem Blob zu einem RDBMS zuzuordnen.

Ich habe eine Open-Source-c # Redis-Client , die Sie speichern können und abrufen jeder POCO-Objekte mit 1 Zeile:

var customers = redis.Lists["customers"]; //Implements IList<Customer>
customers.Add(new Customer { Name = "Mr Customer" });

Schlüsselwertspeicher sind auch viel einfacher zu ‚Scale-out‘, wie Sie einen neuen Server hinzufügen und dann Ihre Last partitionieren gleichmäßig um den neuen Server aufzunehmen. Wichtig ist, dass es kein zentraler Server, die Ihre Skalierbarkeit einschränkt. (Obwohl Sie noch eine Strategie für eine konsistente Hashing benötigen, um Ihre Anfragen zu verteilen).

Ich halte Redis a ‚verwaltete Textdatei‘ sein auf Steroiden, die eine schnelle, gleichzeitige und Atom-Zugriff für mehrere Clients bietet, so etwas habe ich eine Textdatei oder eingebettete Datenbank zu verwenden, denn ich jetzt Redis verwenden. z.B. Um eine Echtzeit zu erhalten kombiniert Rollfehlerprotokoll für alle unsere Leistungen (das ist eine schwierige Aufgabe für uns notorisch gewesen ist), wird nun mit nur ein paar Zeilen erreicht durch nur vor-Erwartung der Fehler auf eine Redis Server-Seite Liste und dann die Liste Trimmen, so dass nur die letzten 1000 gehalten werden, zum Beispiel:

var errors = redis.List["combined:errors"];
errors.Insert(0, new Error { Name = ex.GetType().Name, Message = ex.Message, StackTrace = ex.StackTrace});
redis.TrimList(errors, 1000);

Ich habe keine Erfahrungen aus erster Hand., Aber ich fand dies recht interessant Blog-Eintrag.

ich den Aufwand finden Software Domain-Objekte abzubilden (zB aSalesOrder, aCustomer ...) auf zweidimensionale relationale Datenbank (Zeilen und Spalten) nimmt eine Menge Code speichern / aktualisieren und dann wieder eine Domäne Objektinstanz zu instanziiert aus mehreren Tabellen. Nicht die Performance-Einbußen zu erwähnen, alle mit denen verbinden, die alle jene Platte liest ... nur einen Blick / manipulieren, um ein Domain-Objekt wie ein Kundenauftrag oder Kundendatensatz.

Wir haben Object Database Management System (ODBMS) geschaltet. Sie sind über die Fähigkeiten der NoSQL-Systeme aufgeführt. Die GemStone / S (für Smalltalk) ist ein solches Beispiel. Es gibt noch andere ODBMS Lösungen, die Treiber für viele Sprachen haben. Ein wichtiger Entwickler profitieren, Ihre Klassenhierarchie ist automatisch Ihre Datenbank-Schema, Unterklassen und alle. Verwenden Sie einfach Ihre objektorientierte Sprache zu machen, um zu der Datenbank persistente Objekte. ODBMS Systeme bieten eine ACID-Level-Transaktion Integrität, so wäre es auch Arbeit in den Finanzsystemen.

I wechselte von MySQL (InnoDB) zu cassandra für ein M2M-System, das im Grunde speichert zeit Reihe von Sensoren für jedes Gerät. Jede Daten werden durch (device_id, Datum) indiziert und (device_id, type_of_sensor, Datum). Die MySQL-Version enthalten sind 20 Millionen von Zeilen.

MySQL:

  • Setup im Master-Master-Synchronisierung. Wenige Probleme erschienen um Verlust der Synchronisation . Es war anstrengend und vor allem am Anfang könnte Stunden fix nehmen.
  • Insertion Zeit war kein Problem, aber Abfrage erforderlich, um mehr und mehr Speicher als wuchsen die Daten. Das Problem ist, die Indizes als Ganzes betrachtet werden. In meinem Fall war ich mit nur einen sehr dünnen Teilen der Indizes, der Last im Speicher notwendig waren (nur wenige Prozent der Geräte wurden häufig kontrolliert und es war auf den neuesten Daten).
  • Es war schwer zu sichern . Rsync ist nicht in der Lage schnelle Backups auf großen InnoDB-Tabellendateien zu tun.
  • Es wurde schnell klar, dass es war nicht möglich, die schwere Tabellen zu aktualisieren Schema , weil es viel zu viel Zeit in Anspruch nahm (Stunden).
  • Importieren von Daten dauerte Stunden, (auch wenn die Indizierung am Ende getan wurde). Der beste Rettungsplan war immer ein paar Kopien der Datenbank zu halten (Datendatei + logs).
  • Bewegen von einem Hosting-Unternehmen zu einer anderen war wirklich eine große Sache . Replikation hatte sehr sorgfältig behandelt werden.

Cassandra:

  • Noch einfacher zu installieren als MySQL.
  • Benötigt viel RAM. Ein 2 GB Beispiel könnte es nicht in den ersten Versionen laufen zu lassen, jetzt ist es auf einer 1 GB Instanz arbeiten kann, aber es ist nicht Idee (viel zu viele Daten Wallungen). Giving es 8GB war genug, um in unserem Fall.
  • Wenn Sie verstehen, wie Sie Ihre Daten organisieren, ist die Speicherung einfach. Anfordern ist ein wenig komplex. Aber wenn Sie es sich um, es ist wirklich schnell (man kann nicht wirklich Fehler machen, wenn Sie wirklich wollen).
  • Wenn vorheriger Schritt richtig gemacht wurde, es ist und bleibt super-schnell.
  • Es scheint fast wie Daten organisiert ist gesichert werden. Jede neue Daten werden als neue Dateien hinzugefügt. Ich persönlich, aber es ist nicht eine gute Sache, bündig Daten jede Nacht und vor jedem Herunterfahren (in der Regel für ein Upgrade), so dass die Wiederherstellung weniger Zeit in Anspruch nimmt, weil wir weniger Protokolle haben zu lesen. Es schafft nicht viel Dateien werden sie verdichtet werden.
  • Importieren von Daten ist schnell wie der Blitz. Und je mehr Rechner hat, desto schneller. Exportieren und Gigabyte Daten importieren kein Problem mehr ist.
  • kein Schema aufweist, ist eine sehr interessante Sache, weil man Sie Daten vornehmen können sich entwickeln Ihren Bedürfnissen zu folgen. Was bedeuten könnte verschiedene Versionen Ihrer Daten zur gleichen Zeit auf der gleichen Spalte Familie zu haben.
  • war einfach, einen Host hinzufügen (nicht schnell obwohl), aber ich habe es nicht auf einer Multi-Datacenter-Einstellungen abgeschlossen.

Hinweis: Ich habe auch verwendet Elasticsearch (Dokument basierend auf lucene orientiert) und ich denke, es in Betracht gezogen werden sollte als NoSQL-Datenbank. Es wird verteilt, zuverlässig und oft schnell (einige komplexe Abfragen kann sehr schlecht durchführen).

ich nicht. Ich möchte einen einfachen und kostenlosen Schlüssel-Wert-Speicher verwenden, dass ich in Prozess nennen kann, aber so etwas gibt es nicht afaik auf der Windows-Plattform. Jetzt benutze ich Sqlite aber ich möchte so etwas wie Tokyo Cabinet verwenden. BerkeleyDB hat Lizenz „Fragen“.

Wenn Sie jedoch das Windows-Betriebssystem Ihrer Wahl von NoSQL-Datenbanken verwendet werden soll, beschränkt ist. Und es ist nicht immer ein C # Anbieter

Ich habe versucht MongoDB und es war 40-mal schneller als SQLite, vielleicht sollte ich es verwenden. Aber ich hoffe immer noch für einen einfachen Prozesslösung.

habe ich redis Log-Meldungen über Maschinen zu speichern. Es war sehr einfach zu implementieren, und sehr nützlich. Redis rockt wirklich

Wir ersetzten eine Postgres-Datenbank mit einer CouchDB Dokument Datenbank, da kein festes Schema mit einem starken Vorteile für uns war. Jedes Dokument hat eine variable Anzahl von Indizes für den Zugriff des Dokuments verwendet wird.

Ich habe Couchbase in der Vergangenheit und wir auftretende Probleme und vielen anderen Fragen Neugewichtung. Ich verwende Redis derzeit in mehreren Produktionsprojekten. Ich verwende redislabs.com , die ein Managed Service für Redis ist, die Pflege Ihrer Skalierung Redis Cluster nimmt. Ich habe ein Video-on-Objekt-Persistenz auf meinem Blog veröffentlicht unter http://thomasjaeger.wordpress.com , dass zeigt, wie Redis in einem Provider-Modell zu verwenden, und wie Sie Ihre C # Objekte in Redis zu speichern. Werfen Sie einen Blick.

würde ich ermutige jeden der Lektüre dieses zu versuchen, Couchbase einmal mehr jetzt, dass 3,0 ist die Tür. Es gibt mehr als 200 neue Funktionen für den Anfang. Die Performance, Verfügbarkeit, Skalierbarkeit und einfache Verwaltungsfunktionen von Couchbase Server sorgen für eine äußerst flexible, hochverfügbare Datenbank. Das Management UI ist eingebaut und die APIs entdeckt automatisch den Cluster-Knoten, so gibt es keine Notwendigkeit für einen Load-Balancer von der Anwendung auf die DB ist. Während wir Sie nicht über einen Managed-Service zu diesem Zeitpunkt haben kann Couchbase auf Dinge wie AWS, RedHat Gears, Cloudera, Rackspace, Dockarbeiter Container wie Cloud, laufen und vieles mehr. Im Hinblick auf eine Neugewichtung es hängt davon ab, was speziell auf Sie beziehen sich aber nach einem Couchbase Knotenausfall nicht automatisch Neuverteilung, so entworfen, aber ein Administrator für den ersten Knoten Ausfall Setup Auto-Failover könnte und unsere APIs verwenden, können Sie auch Zugriff auf die gewinnen Replik vbuckets für sie aktiv oder mit dem RestAPI zu machen, bevor das Lesen Sie einen Failover durch ein Monitoring-Tool durchsetzen kann. Dies ist ein Sonderfall ist aber möglich durchgeführt werden.

Wir neigen dazu, nicht zu rebalance in so ziemlich jeden Modus, wenn der Knoten vollständig offline ist und nie wieder kommen oder ein neuer Knoten bereit ist, automatisch ausgeglichen werden. Hier sind ein paar Führer zu helfen jemand daran interessiert zu sehen, was eine der leistungsstärksten NoSQL-Datenbanken geht.

  1. Couchbase Server 3.0
  2. Administration Guide
  3. REST API
  4. Entwicklerleitfäden

Schließlich möchte ich Sie auch ermutigen, für verteilte Abfragen zu überprüfen N1QL:

  1. N1QL Tutorial
  2. N1QL Führer

Vielen Dank für das Lesen und lassen Sie mich oder andere wissen, wenn Sie brauchen mehr Hilfe!

Austin

Ich habe Vertica im past.It verwendet beruht auf säulen Kompression & Beschleunigt Platte liest und Bedürfnisse Speicher senkt das Beste aus Ihrer Hardware zu machen. Schnellere Datenlasten und höhere Parallelität können Sie Analysedaten, um mehr Nutzer mit minimaler Latenz dienen.

Früher waren wir die Abfrage Oracle-Datenbank Milliarden von Datensätzen und die Leistung, die war sehr suboptimal. Die Abfragen dauerte 8 bis 12 Jahren zu laufen, auch nach mit SSD zu optimieren. Daher fühlten wir die Notwendigkeit, ein schneller Einsatz Lesen optimiert, Analytik orientierte Datenbank. Mit Vertica-Clustern hinter der mageren Service-Schicht, könnten wir APIs mit Sub-Second-Leistung ausgeführt werden.

Vertica speichern Daten in Projektionen in einem Format, das Abfrageausführung optimiert. Ähnlicher eher zu materialisierten Ansichten, Projektionen speichern Ergebnismengen auf der Festplatte oder SSD als Rechen sie jedes Mal, wenn sie in einem query.Projections bieten folgende Vorteile genutzt werden:

  1. Komprimieren und Kodieren von Datenspeicherplatz zu reduzieren.
  2. Simplify Verteilung über die Datenbank-Cluster.
  3. Geben Sie eine hohe Verfügbarkeit und Wiederherstellung.

Vertica optimiert die Datenbank von Daten über Cluster mit Segmentation zu verteilen.

  1. Die Segmentierung stellt einen Teil der Daten auf einem Knoten.
  2. Sie verteilt die Daten gleichmäßig auf allen Knoten. Somit führt jeder Knoten eine Stück des abfragenden Prozess.
  3. Die Abfrage wird auf dem Cluster und jeder Knoten empfängt die Abfrage Plan.
  4. Die Ergebnisse der Abfragen werden aggregiert und verwendet die schaffen Ausgabe.

Für mehr finden Sie in Vertica Dokumentation @ https://www.vertica.com/knowledgebase/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top