Datenbank zum Aufbau eines Echtzeit-Analysesystems

7

Ich möchte ein System ähnlich wie Google Analytics erstellen (nur für den internen Gebrauch, weniger Verkehr und weniger Funktionen) und mich hauptsächlich darauf konzentrieren

  1. Echtzeitzählung von eindeutigen URI-Besuchen / PV nach verschiedenen Dimensionen der demografischen Benutzerinformationen, z. B. Benutzeragent, Betriebssystem, Land usw.

  2. Echtzeitberechnung der durchschnittlichen Benutzersitzungslänge (wenn der Unterschied zwischen zwei Anforderungen von derselben IP weniger als 1 Minute beträgt)

Gibt es einen guten Datenbankspeicher, der diese Art von Abfrage in Echtzeit ermöglicht?

ps Ich teste gerade InfiDB.

Howard
quelle
InfiDB -> InfiniDB?
Qerub

Antworten:

14

Es gibt einen Trick, schnelle Echtzeitanalysen unabhängig von der Plattform zu erstellen. Ich habe dies mit Microsoft Analysis Services gemacht, aber Sie können ähnliche Techniken auch mit anderen Plattformen verwenden.

Der Trick besteht darin, eine führende Partition zu haben, die mit Echtzeitdaten gefüllt werden kann, und eine historische Partition (oder Partitionen), die für schnelle Abfragen optimiert sind. Wenn Sie die führende Partition klein genug halten, kann sie auch schnell abgefragt werden.

Um dies zu verwalten, füllt Ihre ETL- Verarbeitung die führende Partition und Sie erstellen einen zusätzlichen Prozess, der die Partitionen regelmäßig in das für schnelle Abfragen optimierte Format konvertiert. Die genaue Art dieses Prozesses hängt von Ihrer Plattform ab.

In MS Analysis Services wird die führende Partition als ROLAP- Partition ausgeführt, die direkt aus der Tabelle liest. Nachfolgende Partitionen werden mit Aggregaten in MOLAP konvertiert . Andere OLAP- Systeme funktionieren ähnlich. Unter Oracle können Sie Bitmap-Indizes und materialisierte Ansichtspartitionen auf Ihren nachfolgenden Partitionen erstellen, um Abfragen zu beschleunigen. Einige andere Systeme haben diese Art von Funktion ebenfalls, obwohl mir nicht bekannt ist, dass MySQL sie unterstützt.

Ich würde sagen, die billigste Mainstream-Plattform, die dies tun würde, ist MS Analysis Services, die nur zusammen mit SQL Server verfügbar ist und nicht separat erworben werden kann. Für die Partitionierung mit 2008 R2 benötigen Sie die Enterprise Edition von SQL Server, die in Großbritannien etwa 22.000 GBP pro CPU-Sockel und auf der anderen Seite des Teichs etwas weniger kostet. Microsoft liefert ab 2012 eine neue 'Business Intelligence'-Edition von SQL Server aus. Sobald dies RTM erreicht, unterstützt die BI-Edition des Produkts partitionierte Cubes und ist wesentlich billiger als die Enterprise Edition. Abhängig von Ihrem Budget und Ihren zeitlichen Einschränkungen können Sie dies möglicherweise stattdessen verwenden.

Ein weiterer Aspekt des Problems, das Sie angehen müssen, ist die geänderte Datenerfassung - effizientes Identifizieren und Verschieben neuer oder geänderter Datenzeilen in den ETL- Prozess. Die CDC-Funktionen der meisten DBMS-Anbieter funktionieren nur mit ihren eigenen Datenbanken. Wenn Sie also eine CDC-Lösung wünschen, müssen Sie möglicherweise zu einer Drittanbieter-App oder zu Triggern in der Quelle wechseln.

  • Verschiedene Drittanbieter stellen CDC- Anwendungen bereit , die über Datenbankplattformen hinweg migriert werden. Eine Liste der CDC-Produkte finden Sie im Wikipedia-Eintrag zu diesem Thema. Beachten Sie, dass Sie möglicherweise immer noch Probleme mit der Integration haben. Beispielsweise kann IBM Infosphere CDC externe Prozesse nur pro Zeile und nicht pro Stapel auslösen, was zu Effizienzproblemen bei großen Datenmengen führen kann.

  • Sie können eine Reihe von Triggern für die Quelltabellen erstellen, die die Änderungen in einen Staging-Bereich übertragen. Dies würde erfordern, dass Sie über ausreichenden Zugriff auf die Quellendatenbank verfügen, um dies zu tun. Daher ist dies möglicherweise keine Option für vom Hersteller unterstützte Datenbanken.

  • Wenn die Daten aus einer Datei stammen (z. B. einem Webserver-Protokoll), müssen Sie einen clientseitigen Prozess schreiben, der das Ende der Dateien auf neue Datensätze überwacht.

Es ist sehr wahrscheinlich, dass Sie am Ende einen Pull-Prozess implementieren müssen, der die Datenquellen abfragt. In diesem Fall müssen Sie die tolerierbare Latenz berechnen und Ihren Prozess so schreiben, dass er Änderungen effizient genug erkennt, damit er ausreichend schnell ausgeführt werden kann. Es gibt ein altes Sprichwort, das manchmal in Kreisen eingebetteter Systeme zu finden ist: "Sie wissen, dass sie die Zuverlässigkeit ernst nehmen, wenn sie mit der Abfrage beginnen. "

ConcernedOfTunbridgeWells
quelle
3

In PostgreSQL ist es möglich, etwas zu erstellen, das Ihren grundlegenden Anforderungen entspricht. Sie können materialisierte Ansichten erstellen , die mit Triggern auf dem neuesten Stand gehalten werden, und mithilfe der Partitionierung den Aufwand für die Pflege älterer Daten verringern. Aber das ist alles ein sehr manueller Prozess in dieser Datenbank, sodass Sie eine benutzerdefinierte Codierung für mehrere Komponenten benötigen. Die Leistung des Ergebnisses ist im Vergleich zu kommerziellen Lösungen, die für diesen speziellen Zweck optimiert wurden, nicht sehr gut.

In diesem Bereich gibt es einige analytische Innovationen, die von kommerziellen PostgreSQL-Gabeln bereitgestellt werden, die auf diesen Markt abzielen, beispielsweise von Greenplum und Truviso . Das völlig kostenlose PostgreSQL ist noch keine großartige Lösung für diese Art von Problem in größerem Maßstab.

Greg Smith
quelle