7

Offensichtlich liegt der Grund für die BigTable-Architektur in der Schwierigkeit, relationale Datenbanken zu skalieren, wenn Sie mit der enormen Anzahl von Servern zu tun haben, mit denen Google zu tun hat.Welcher Aspekt relationaler Datenbanken erschwert es ihnen, Dienste wie Google App Engine ausreichend zu skalieren?

Aber was genau macht es für relationale Datenbanken technisch schwierig zu skalieren?

In den Enterprise-Rechenzentren großer Unternehmen scheinen sie dies erfolgreich durchführen zu können. Daher frage ich mich, warum es nicht möglich ist, dies auf einer größeren Größenordnung zu tun, damit es auf Googles Servern skaliert werden kann.

Antwort

3

Zusätzlich zu Mitchs Antwort gibt es noch eine andere Facette: Webapps sind im Allgemeinen für relationale Datenbanken schlecht geeignet. Relationale Datenbanken legen Wert auf Normalisierung - im Wesentlichen, macht Schreiben einfacher, liest aber härter (in Bezug auf die geleistete Arbeit, nicht notwendigerweise für Sie). Dies funktioniert sehr gut für OLAP-, Ad-hoc-Abfragetyp Situationen, aber nicht so gut für Webapps, die in der Regel massiv zugunsten Lesevorgänge über Schreibvorgänge gewichtet werden. Die Strategie, die von nicht-relationalen Datenbanken wie Bigtable übernommen wird, ist umgekehrt: denormalize, um Lesevorgänge zu vereinfachen, und zwar auf Kosten von Schreibvorgängen, die teurer sind.

+0

Ich bin damit einverstanden, dass die meisten Web-Apps mehr lesen als Benutzer-Eingabe oder App-Aktualisierung von Daten. Aber ich verstehe nicht, was Sie meinen, wenn Sie sagen, dass Schreiben in einem normalisierten RDBMS "einfacher (in Bezug auf die geleistete Arbeit)" ist? Ich würde meinen, der App Engine-Datenspeicher ist einfacher in Bezug auf die geleistete Arbeit, da ein eindeutiger Schlüssel jede Entität identifiziert und eine Aktualisierung einer Einfügung aufgrund des diklarartigen Charakters des Datenspeichers entspricht. Putten und Holen aus einem Wörterbuch ist so einfach wie es geht, soweit die Arbeit erledigt ist, würde ich denken. – pacman

+0

@pacman: Sie vergessen die ganze Arbeit, die tatsächlich getan wird. Der Index ist der große König des Datenspeichers. Wenn Sie dem Datenspeicherelement eine Entität hinzufügen, werden sehr viele Daten repliziert. Wenn Sie also eine Eigenschaft abrufen möchten, können Sie dies schnell tun. Es schreibt grundsätzlich Indizes für jede Eigenschaft, für jede Entität, zweimal (asc und desc) für alle Daten, die Sie speichern (vielleicht nicht die neuen großen Blobs, nicht sicher). Dies dauert für Schreibvorgänge so lange, ermöglicht aber auch schnelle Lesevorgänge auf einer verwirrenden Skala. Ich würde vorschlagen, ein gutes AppEngine-Buch zu bekommen, da es beim Entwerfen für GAE wichtig ist. –

6

Wenn Sie eine Abfrage ausführen, die Beziehungen umfasst, die physisch verteilt sind, müssen Sie diese Daten für jede Beziehung an einer zentralen Stelle abrufen. Das wird bei großen Datenmengen offensichtlich nicht gut skalieren.

Ein gut konfigurierter RDBMS-Server führt die meisten Abfragen auf Hot-Pages im RAM aus, mit wenig physischen Festplatten oder Netzwerk-E/A.

Wenn Sie durch Netzwerk-E/A eingeschränkt sind, werden die Vorteile von relationalen Daten verringert.

+0

DANKE! Viel klarer. Ursprünglicher Kommentar gelöscht. –

0

Der Hauptgrund wie angegeben ist physischer Standort und Netzwerk-IO. Darüber hinaus befassen sich selbst große Unternehmen mit einem Bruchteil der Daten, mit denen sich Suchmaschinen beschäftigen.

Denken Sie über den Index einer Standarddatenbank nach, vielleicht ein paar Felder ... Suchmaschinen benötigen schnelle Textsuche in großen Textfeldern.