Frage

Hintergrund:

Ich habe eine PostgreSQL (v8.3) Datenbank, die stark für OLTP optimiert ist.

Ich muß die Daten aus es auf einer halbEchtZeit-Basis extrahieren (einige-on gebunden zu fragen, was halbEchtZeit-Mittel und die Antwort ist so oft wie ich kann vernünftigerweise aber ich werde pragmatisch sein, als Benchmark kann sagen wir für jeden 15min) und ihn in einen Data-Warehouse hoffen.

Wie viele Daten? Zu Spitzenzeiten sprechen wir ca. 80-100k Zeilen pro Minute schlagen die OLTP-Seite, Off-Peak dies deutlich zu 15-20k sinken. Die am häufigsten aktualisierten Zeilen sind ~ 64 Bytes pro Person, aber es gibt verschiedene Tabellen usw., so dass die Daten sehr vielfältig sind und bis 4000 Byte pro Zeile reichen können. Der OLTP ist aktiv 24x5.5.

beste Lösung?

Von dem, was ich Stück zusammen die praktischste Lösung ist wie folgt:

  • eine TRIGGER erstellen alle DML-Aktivität auf einer rotierenden CSV-Protokolldatei schreiben
  • Führen Sie
  • , was Transformationen erforderlich sind
  • Verwenden Sie die nativen DW Datenpumpe Werkzeug zur effizienten Steuerung des transformierten CSV in die DW
  • Pumpe

Warum dieser Ansatz?

  • TRIGGERS erlaubt selektive Tabellen eher ausgerichtet sein als sein systemweite + Ausgang konfigurierbar ist (das heißt in eine CSV) und ist relativ leicht zu schreiben und bereitstellen. Slony verwendet ähnlichen Ansatz und Overhead ist akzeptabel
  • CSV einfach und schnell zu verwandeln
  • Einfache CSV in die DW zu pumpen

Alternativen betrachtet ....

  • Verwenden von nativen Protokollierung ( http : //www.postgresql.org/docs/8.3/static/runtime-config-logging.html ). Problem dabei ist es sehr ausführlich sah relativ zu dem, was ich brauchte, und war ein wenig schwieriger zu analysieren und zu transformieren. Allerdings könnte es schneller sein, als ich nehme an, es ist weniger Overhead im Vergleich zu einem TRIGGER. Sicherlich wäre es das Admin leichter machen, wie es System breit ist aber auch hier, ich weiß nicht einige der Tabellen müssen (einige sind für dauerhafte Speicherung von JMS-Nachrichten verwendet, die ich nicht anmelden wollen)
  • Die Abfrage der Daten direkt über ein ETL-Tool wie Talend und in das DW Pumpen ... Problem ist das OLTP-Schema, dies zu unterstützen müssen gezwickt würde und das hat viele negative Nebenwirkungen
  • Mit einem gezwickt / gehackten Slony - Slony macht einen guten Job der Protokollierung und die Migration Änderungen an einen Slave so der konzeptionelle Rahmen gibt es aber die vorgeschlagene Lösung scheint nur einfacher und saubere
  • Verwenden des WAL

Hat jemand dies getan, vor? Möchten Sie Ihre Meinung teilen?

War es hilfreich?

Lösung

Unter der Annahme, dass Ihre Tabellen von Interesse (oder können mit erweitert werden), um einen einzigartigen, indizierte, sequenziellen Schlüssel, dann werden Sie viel besser Wert erhalten aus einfach SELECT ... FROM table ... WHERE key > :last_max_key mit Ausgabe in eine Datei ausgeben und last_max_key der letzte Schlüssel ist Wert aus der letzten Extraktion (0, wenn erste Extraktion). Diese inkrementell, entkoppelten Ansatz vermeidet Einführung Trigger Latenz in Einführrichtung Datenweg (es sein Slony benutzerdefinierten Auslösern oder modifiziert), und auf Ihrem Setup abhängig konnte skalieren besser mit der Anzahl der CPUs usw. (wenn Sie jedoch auch Spur UPDATEs haben , und die sequentielle Schlüssel wurde von Ihnen hinzugefügt, dann sollten Sie Ihre UPDATE Aussagen über die Schlüsselspalte SET NULL so dass es einen neuen Wert bekommt und wird von der nächsten Extraktion. Sie würde nicht in der Lage zu verfolgen DELETEs ohne Abzug gepflückt.) Ist das, was Sie im Sinn hatten, als Sie Talend erwähnt?

Ich würde nicht die Protokollfunktion verwenden, wenn Sie nicht die Lösung über umsetzen können; Anmeldung beinhaltet höchstwahrscheinlich Sperren Kopf Protokollzeilen und tun sequentiell, um sicherzustellen, geschrieben nicht überlappen / überschreiben einander, wenn mehrere Backends in das Protokoll (überprüfen Sie die Postgres-Quelle.) schreiben Die Kopfverriegelung nicht katastrophal sein können, Sie können jedoch, ohne es tun, wenn Sie die inkrementelle SELECT Alternative verwenden können. Außerdem Erklärung Protokollierung würde tönen jede nützliche Warnungen oder Fehlermeldungen und die Parsen selbst wird nicht sofort sein .

Wenn Sie nicht bereit sind, wals zu analysieren (einschließlich Transaktionsstatus Tracking und sind bereit, den Code jedes Mal neu zu schreiben Sie Postgres Upgrade) Ich würde nicht unbedingt das wals verwenden entweder - das heißt, es sei denn, Sie hat die zusätzliche Hardware verfügbar , wobei in diesem Fall könnten Sie Schiff Wanden auf eine andere Maschine für die Extraktion (auf der zweiten Maschine können Sie Verwendung Auslöser schamlos - oder sogar Anweisung Protokollierung - da, was da geschieht, wirkt sich nicht auf INSERT / UPDATE / DELETE Leistung auf der primären Maschine.) Beachten Sie, dass Performance-weise (auf der primären Maschine), es sei denn, Sie die Protokolle zu einem SAN schreiben können, dann würden Sie eine vergleichbare Leistung getroffen erhalten ( in Bezug auf die Cache-Thrashing-Dateisystem, von meist) Wanden auf eine andere Maschine als vom laufen die inkrementelle SELECT versenden.

Andere Tipps

, wenn Sie von einer ‚Prüfsumme Tabelle‘ denken kann, die nur enthält die IDs und die ‚Prüfsumme‘ können Sie nicht nur ein tun schnell wählen die neuen Datensätze, sondern auch die geänderten und gelöschten Datensätze.

die Prüfsumme ein CRC32 Funktion, die Sie wie sein könnte.

Die neue KONFLIKT Klausel in PostgreSQL hat die Art und Weise geändert ich viele Updates tun. Ich ziehe die neuen Daten (basierend auf einer row_update_timestamp) in eine temporäre Tabelle dann in einer SQL-Anweisung INSERT in die Zieltabelle mit ON CONFLICT UPDATE. Wenn Ihre Zieltabelle partitioniert ist, dann müssen Sie durch ein paar Reifen springen (das heißt drücken Sie die Partitionstabelle direkt). Die ETL kann passieren, wie Sie die Temp-Tabelle (am wahrscheinlichsten) oder in dem KONFLIKT SQL (wenn trivial) laden. Im Vergleich zu anderen „UPSERT“ -Systeme (Update, Insert, wenn keine Zeilen etc.) Dies zeigt eine enorme Verbesserung der Geschwindigkeit. In unserer speziellen DW-Umgebung haben wir nicht brauchen / wollen DELETEs aufzunehmen. Überprüfen Sie die KONFLIKT docs aus - es gibt Oracle MERGE ein Lauf für ihn das Geld

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