Dieser Artikel wurde maschinell übersetzt.

Vorhersage: Bewölkt

Gigantisches Windows Azure

Joseph Fultz

 

Joseph FultzPersönlich, ich liebe die Art und Weise Dinge Zyklus. Es scheint immer zu mir, dass jede Entwicklung eines Objekts oder einen Mechanismus eine Dualität der Zweck ausdrückt, die Fortschritte sowohl eine Position der Vergangenheit bekräftigt. Technologie ist ein großartiger Ort zu sehen, weil das Tempo, bei dem Änderungen stattgefunden haben, es einfach zu viele Entwicklungen über kurze Zeiträume zu sehen ist.

Für mich ist die NoSQL-Bewegung nur eine solche Entwicklung. Zuerst hatten wir Dokumente und wir sie in Dateien und in Aktenschränke und schließlich in Dateifreigaben gehalten. Es war ein natürlicher Zustand. Das Problem mit der Natur ist, dass im Maßstab wir wirklich unser Gehirn um ihn herum wickeln kann nicht. Damit wir den Inhalt rationalisiert und entschied sich für rationalisierte und normalisierte Datenmodelle, die uns, vorhersehbar helfen würde belegen Speicherplatz, Daten speichern, die Indexdaten und in der Lage, es zu finden. Das Problem mit rationalen Modelle ist, dass sie nicht natürliche.

Geben Sie NoSQL, eine scheinbare Mischung der natürlichen und relationale Modelle. NoSQL ist ein Datenbank-Management-System für das Speichern und Abrufen von große Datenmengen optimiert. Es ist ein Weg für uns zu behalten Dokumentstile Daten und nutzen Sie noch einige Funktionen im täglichen relationalen Datenbank-Management-Systeme (RDBMSes).

Eines der wichtigsten Werkzeuge der NoSQL ist MongoDB von 10gen Inc., einem Dokument-orientierte, open-Source NoSQL-Datenbanksystem, und in diesem Monat werde ich zu konzentrieren auf einigen der Entwurf und die Implementierung Aspekte der Verwendung von MongoDB in einer Umgebung mit Windows Azure. Ich werde annehmen, dass Sie etwas NoSQL und MongoDB auskennen. Wenn nicht, Sie wollen Julie Lerman November 2011 Datenpunkte Spalte ansehen könnte "was zum Teufel Dokument Datenbanken sind?" (MSDN.Microsoft.com/Magazine/hh547103), und Ted Neward Mai 2010 der Arbeiten Programmierer Spalte, "Going NoSQL mit MongoDB" (msdn.microsoft.com/magazine/ee310029).

Jedoch eines nach dem anderen.

Wenn du denkst, MongoDB ausprobieren oder da er es als Alternative zu Windows Azure SQL-Datenbank oder Windows Azure Tabellen, müssen Sie einige Punkte auf die Gestaltung und Planung-Seite, einige zum Infrastruktur und zur Entwicklung berücksichtigen.

Bereitstellungsarchitektur

In der Regel enden die Daten zurück muss verfügbar und langlebig. Dazu mit MongoDB, verwenden Sie ein Replikations-Set. Replikations-Sets bieten Failover und Replikation, mit ein wenig der künstlichen Intelligenz (KI), Krawatte bei der Wahl des primären Knotens der Menge aufzulösen. Was bedeutet dies für Ihre Windows-Azure-Rollen ist, dass Sie drei Instanzen einzurichten, eine minimale Replikations-Set sowie ein Speicherort, den Sie mit dem Auto für jede dieser Rollen zuordnen können. Beachten Sie, dass aufgrund von Unterschieden in virtuellen Maschinen (VMs), Sie wahrscheinlich mindestens mittlere VMs bei jeder bedeutenden Bereitstellung haben wollen. Andernfalls könnte die CPU oder Speicher schnell zum Engpass.

Abbildung 1 zeigt eine typische Architektur für die Bereitstellung von einer minimalen MongoDB-ReplicaSet, die nicht verfügbar ist für die Öffentlichkeit. Sie konnte damit den Datenspeicher extern sich umwandeln, aber es ist besser, das über eine Dienstschicht zu tun. Eines der Probleme, dass MongoDB Adresse über seine integrierte Features helfen kann ist entwerfen und Bereitstellen eine verteilten Daten-Architektur. MongoDB hat einen vollen Funktionsumfang um Splitter zu unterstützen; Kombinieren Sie diese Funktion mit ReplicaSets und Windows Azure Compute und Sie haben einen Datenspeicher, der hoch skalierbaren, verteilten und zuverlässig ist. Um Ihnen den Einstieg zu erleichtern, bietet 10gen eine Beispiellösung, mit der eine minimale ReplicaSet eingerichtet. Finden Sie die Informationen zur bit.ly/NZROWJ und Sie können die Dateien von GitHub am grab bit.ly/L6cqMF.

Windows Azure MongoDB Deployment
Abbildung 1 Windows himmelblau MongoDB-Bereitstellung

Datenschema

Wird ein Wiz bei DB-Schema-Design können Sie eigentlich behindern beim ein NoSQL-Ansatz zu entwerfen. Die erforderlichen Fertigkeiten sind eher Objektdesign Modellierung und Integration für messaging-Infrastrukturen. Dafür gibt es zwei Gründe:

  1. Die Daten als ein Dokument angesehen werden und manchmal enthält geschachtelte Objekte oder Dokumente.
  2. Es gibt nur minimale Unterstützung für Joins, weswegen man balancieren das Speicherformat der Daten gegen die Auswirkungen der Verschachtelung und die Anzahl der Anrufe, die der Client zu machen, eine einzelne Ansicht erhalten hat.

Eine der ersten Aktivitäten des Übergangs von einer relationalen Denkweise der MongoDB Dokument Perspektive ist das Schema der Neugestaltung. Für einige Objekte, die in ein relationales Modell getrennt sind, wird die Trennung beibehalten. Z. B. Produkten und Bestellungen werden weiterhin separate Schema in MongoDB, und Sie verwenden noch einen Fremdschlüssel-Lookups zwischen den beiden zu tun. Ein wenig zu vereinfachen, das Redesign für diese beiden Objekte zueinander ist meist einfach, wie in Abbildung 2.

Direct Schema Translation
Abbildung 2 direkte Schema Übersetzung

Jedoch kann es nicht so einfach sein, beim Arbeiten mit Schemata, die nicht so sauber sind, konzeptionell, obwohl sie leicht sein können und natürlich in ein relationales Modell getrennt. Kunden und CustomerAddresses sind beispielsweise Personen, die möglicherweise so zusammengeführt werden, dass Kunden eine Auflistung der zugeordneten Adressen enthält (siehe Abbildung 3).

Converting Relational Schema to Nested Object Schema
Abbildung 3 Konvertieren von relationales Schema in geschachtelten Objektschema

Sie benötigen einen sorgfältigen Blick auf das relationale Modell und halten jeden Fremdschlüssel-Beziehung und wie, die im Diagramm als Entität dargestellt bekommen wird ist es dem NoSQL-Modell übersetzt.

Dateninteraktion

Beide Abfrageverhalten und caching-Verhalten in einem relationalen System wichtig sind, aber es ist Verhalten, das wichtigste hier bleibt Zwischenspeichern. Wie mit Windows Azure Tables, es einfach ist, ein Objekt in MongoDB ablegen. Und im Gegensatz zu Windows Azure Tables und mehr wie Windows Azure SQL-Datenbanken, die Felder können indiziert werden, wodurch für bessere Abfrageleistung auf einzelne Objekte. Jedoch der Mangel an Verknüpfungen (und Allgemein mangelnde Abfrage Ausdruckskraft) schaltet was einmal sein könnte, eine Abfrage mit einem oder mehr Verknüpfungen für einen klobigen Daten zurück in mehrere Aufrufe an den Backend-Datenspeicher an dieselben Daten zu holen. Dies kann sein ein wenig beängstigend, wenn Sie eine Auflistung von Objekten zu holen und dann eine damit verbundene Sammlung für jedes Element in der ersten Auflistung abrufen möchten. Mit meiner relationale Pubs-Datenbank, könnte ich also, eine SQL-Abfrage schreiben, die etwa so wie Folgendes zum letzten Autorennamen und alle Titel von einzelnen Autoren zu holen aussieht:

Select authors.au_lname, authors.au_id,
  titles.title_id, titles.title
From authors inner join titleauthor
  on authors.au_id = titleauthor.au_id
  inner join titles on
  titles.title_id = titleauthor.title_id
Order By authors.au_lname

Im Gegensatz dazu um die C#-Treiber und MongoDB verwenden dieselben Daten zu erhalten, der Code sieht wie was, in gezeigt wird Abbildung 4.

Abbildung 4 Verknüpfen mit MongoDB Sammlungen

MongoDatabase mongoPubs = _mongoServer.GetDatabase("Pubs");
MongoCollection<BsonDocument> authorsCollection =
  mongoPubs.GetCollection("Authors");
MongoCursor<BsonDocument> authors = authorsCollection.FindAll();
string auIdQueryString = default(string);           
Dictionary<string,BsonDocument> authorTitles =
  new Dictionary<string,BsonDocument>();
// Build string for "In" comparison
// Build list of author documents, add titles next
foreach (BsonDocument bsonAuthor in authors)
{
  auIdQueryString = bsonAuthor["au_id"].ToString() + ",";
  authorTitles.Add(bsonAuthor["au_id"].ToString(), 
    new BsonDocument{{"au_id",
    bsonAuthor["au_id"].ToString()},
   {"au_lname", bsonAuthor["au_lname"]}});
   authorTitles.Add("titles",
   new BsonDocument(new Dictionary<string,object>()));
}
// Adjust last character
auIdQueryString = auIdQueryString.Remove(auIdQueryString.Length-1,1);
// Create query
QueryComplete titleByAu_idQuery = Query.In("au_id", auIdQueryString);
Dictionary<string, BsonDocument> bsonTitlesToAdd =
  new Dictionary<string,BsonDocument>();
// Execute query, coalesce authors and titles
foreach (BsonDocument bsonTitle in 
  authorsCollection.Find(titleByAu_idQuery))
{
  Debug.WriteLine(bsonTitle.ToJson());
  // Add to author BsonDocument
  BsonDocument authorTitlesDoc = 
    authorTitles[bsonTitle["au_id"].ToString()];
  ((IDictionary<string, object>) authorTitlesDoc["titles"]).Add(bsonTitle["title_id"].ToString(), 
      bsonTitle);
}

Es gibt Möglichkeiten, Sie können dies durch Code und Struktur zu optimieren, aber verpassen Sie nicht den Punkt, dass zwar MongoDB gut geeignet für direkte Abfragen auch auf verschachtelte Objekte ist, komplexere Abfragen, die Kreuz-Entitätenmengen erfordern ein gutes etwas mehr... na ja, sagen wir einfach mehr Handbuch. Die meisten von uns verwenden LINQ, um Brücke, die das Objekt zu relationalen Welt zu helfen. Mit MongoDB das interessante ist, dass Sie die Brücke, werde aber aus dem entgegengesetzten Grund — verpassen Sie die relationale Funktionalität.

Sie könnten auch referenzielle Einschränkungen, vor allem Fremdschlüsseleinschränkungen verpassen. Weil Sie alles wörtlich in die MongoDB-Auflistung hinzufügen können, wird ein Element kann oder möglicherweise nicht die richtigen Daten, es auf andere Entitäten beziehen. Während dieses wie ein Versagen der Plattform scheinen kann wenn Sie ein RDBMS-hard-Fan sind, ist es nicht. Es ist in der Tat eine Abweichung in der Philosophie. Für NoSQL-Datenbanken in der Regel ist die Idee zu bewegen die Intelligenz des Systems aus dem Datenspeicher und lassen die Fokus auf das Lesen und Schreiben von Daten speichern Daten. Also, wenn Sie das Bedürfnis, Dinge wie foreign Key-Einschränkungen in Ihrer Implementierung MongoDB explizit zu erzwingen, tun Sie, dass durch das Unternehmen oder die Dienstschicht, die vorne der Daten sitzt speichern.

Die Migration

Sobald die habe des Datenschemas umgestaltet und als Abfrageverhalten Anforderungen ist es Zeit, einige Daten draußen in der Cloud zu erhalten, um damit arbeiten.

Die schlechte Nachricht ist, dass es keinen Assistenten, mit dem Sie zeigen auf Ihrer Windows Azure SQL-Datenbank-Instanz und Ihre MongoDB-Instanz, und klicken Sie auf migrieren. Sie müssen einige Skripte, die Shell oder in Code zu schreiben. Zum Glück, wenn der Code für die MongoDB-Seite der Gleichung gut gebaut ist, einen guten Teil davon für normale Laufzeit Betrieb der Lösung wiederverwenden werden Sie.

Der erste Schritt ist verweisen auf die MongoDB.Bson und Mongo­DB.Treiberbibliotheken und hinzufügen, die mit Anweisungen:

using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson.Serialization.Conventions;
using MongoDB.Bson.Serialization.IdGenerators;
using MongoDB.Bson.Serialization.Options;
using MongoDB.Bson.Serialization.Serializers;
using MongoDB.Driver.Builders;
using MongoDB.Driver.GridFS;
using MongoDB.Driver.Wrappers;

Objekte zeigt dann einige neuen Methoden darauf, die äußerst nützlich sind, wenn Sie versuchen, Verschieben von regulären .net Objekte auf die bSohn-Objekte mit MongoDB verwendet. Als Abbildung 5 zeigt, wird dies ganz offensichtlich in einer Funktion zum Konvertieren von der Ausgabezeilen von einem Datenbank-Abruf in einer BsonDocument in MongoDB zu speichern.

Abbildung 5 Migrieren von Daten mit LINQ und MongoDB

pubsEntities myPubsEntities = new pubsEntities();
var pubsAuthors = from row in myPubsEntities.authors
  select row;
MongoDatabase mongoPubs = _mongoServer.GetDatabase("Pubs");
mongoPubs.CreateCollection("Authors");
MongoCollection<BsonDocument> authorsCollection =
  mongoPubs.GetCollection("Authors");
BsonDocument bsonAuthor;
foreach (author pubAuthor in pubsAuthors)
{
  bsonAuthor = pubAuthor.ToBsonDocument();
    authorsCollection.Insert(bsonAuthor);
}

Das einfache Beispiel in Abbildung 5 wandelt die Daten direkt über die Erweiterungsmethoden MongoDB. Sie müssen jedoch vorsichtig sein, vor allem mit LINQ, wenn diese Art der Operation durchführen. Z. B. wenn ich den gleichen Vorgang für Titel direkt versuchen, verursacht die Tiefe des Objektdiagramms der Tabelle Titles in der Entity Model den MongoDB Treiber produzieren einen Stack-Überlauffehler. In diesem Fall die Konvertierung werden ein wenig ausführlicher in Code, wie im Abbildung 6.

Abbildung 6 konvertieren Werte individuell

pubsEntities myPubsEntities = new pubsEntities();
var pubsTitles = from row in myPubsEntities.titles
  select row;
MongoDatabase mongoPubs = _mongoServer.GetDatabase("Pubs");
MongoCollection<BsonDocument> titlesCollection =
  mongoPubs.GetCollection("Titles");
BsonDocument bsonTitle;
foreach (title pubTitle in pubsTitles)
{
  bsonTitle = new BsonDocument{ {"titleId", pubTitle.title_id},
     {"pub_id", pubTitle.pub_id},
     {"publisher", pubTitle.publisher.pub_name},
     {"price", pubTitle.price.ToString()},
     {"title1", pubTitle.title1}};
  titlesCollection.Insert(bsonTitle);
}

Um die Umstellung so einfach wie möglich zu halten, ist der beste Ansatz zum Schreiben der SQL-Abfragen, um einzelne Entitäten zurückgegeben, die leichter der entsprechenden MongoDB-Auflistung hinzugefügt werden kann. Für BsonDocuments, die Kind-Dokument-Sammlungen haben, wird es eine multistep Ansatz den übergeordneten BsonDocument, erstellen das Kind BsonDocuments dem übergeordneten BsonDocument hinzufügen und dann das übergeordnete Element der Auflistung hinzufügen.

Die offensichtliche Bits brauchen Sie konvertieren, wenn aus einer Windows Azure SQL-Datenbank auf eine MongoDB-Implementierung zu verschieben ist alles des Codes, der lebt in gespeicherten Prozeduren, Views und Triggers. In vielen Fällen wird der Code etwas einfacher, sein, weil Sie den Umgang werden mit einem BsonDocument mit Kindern, die Sie beibehalten in seiner Gesamtheit anstatt über die relationalen Einschränkungen von mehreren Tabellen zu arbeiten. Anstatt zu schreiben TSQL, erhalten Sie darüber hinaus Ihre Lieblings .net-Sprache, mit der Unterstützung von Visual Studio als IDE verwenden. Der Code, der nicht ursprünglich berücksichtigt werden kann ist, was müssen Sie erstellen, um Transaktionen dokumentübergreifend tun können. In gewissem Sinne ist es ein Schmerz, alle für die Windows Azure SQL-Datenbank-Plattform in Anwendungscode bewegen zu müssen. Auf der anderen Seite, sobald Sie fertig sind haben eine extrem schnelle und skalierbare Daten-Back-End, Sie da es ausschließlich auf Daten pendelt spezialisiert ist. Sie erhalten auch eine hochskalierbare mittlere Schicht durch Verschieben aller dieser Logik, die zuvor in eine richtige Middle-Tier-Ebene in der RDMBS gefangen.

Eine letzte Anmerkung von einiger Bedeutung ist, dass aufgrund der Beschaffenheit des Datenspeichers, die Datengröße wahrscheinlich zunehmen wird. Dies ist da jedes Dokument hat, Schema und Daten zu halten. Während dieses nicht für am meisten wegen der niedrigen Kosten des Raumes in Windows Azure Tabellen schrecklich wichtig sein kann, ist es noch etwas, das in der Gestaltung berücksichtigt werden muss.

Schlussbemerkung

Sobald die Daten in MongoDB verfügbar ist, werden, arbeiten mit es in viele Grüße, vertraut fühlen.

Stand: C#-Treiber 1.4 (derzeit auf 1.5.0.4566) ist die LINQ-Unterstützung erheblich verbessert, so das Schreiben des Codes wird nicht völlig fremd fühlen. Also, wenn Ihr Projekt oder Lösung von einem NoSQL-Datenspeicher wie MongoDB profitieren könnten, lassen Sie nicht die Syntax erschrecken Sie, weil die Anpassung minimal sein wird. Bedenken, jedoch, das es gibt einige wichtige Unterschiede zwischen eine ausgereifte, robuste RDBMS-Plattform — wie Windows Azure SQL-Datenbank — und MongoDB. Gesundheit und Überwachung erfordert beispielsweise weitere manuelle Arbeit. Anstatt nur eine Anzahl von Windows Azure SQL-Datenbank-Instanzen zu überwachen, müssen Sie die Host-Worker-Funktionen, die Windows Azure Blob-Speicher-Server von Datenbankdateien und Protokolldateien von MongoDB selbst überwachen.

NoSQL-Lösungen bieten hervorragende Leistung für einige Datenbankoperationen und einige nützliche und interessante Features, die wirklich ein Segen für die Entwicklungs-Team eine Lösung sein können. Wenn Sie eine große Menge von Daten und du auf ein begrenztes Budget bist, möglicherweise die MongoDB auf Windows Azure-Option eine große Bereicherung für Ihre Architektur der Lösung.

Joseph Fultz ist Softwarearchitekt bei Hewlett-Packard Co. und Mitglied der HP.com Global IT-Gruppe. Zuvor war er Softwarearchitekt bei Microsoft und arbeitete gemeinsam mit dessen wichtigsten Unternehmens- und ISV-Kunden an der Definition von Architekturen und dem Entwurf von Lösungen.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Wen-Ming Ihr