Ich bin ein SQL-Entwickler (nicht DBA oder Architekt) für ein kleines SaaS-Unternehmen (~ 50 Mitarbeiter). Ich habe die Aufgabe herauszufinden, wie man:
- Laden Sie Betriebsberichte aus unseren über 100 OLTP-Datenbanken herunter
- Lassen Sie diese Berichte für Daten aus mehreren Client-Datenbanken ausgeführt werden
- Positionieren Sie unser Unternehmen, um in Zukunft mehr analytikbasierte Lösungen anzubieten
Ich habe eine Reihe von Artikeln über verschiedene Technologien wie Transaktionsreplikation (insbesondere das Viele-zu-Eins- / Zentralabonnentenmodell), SQL Service Broker, Protokollversand, Änderungsverfolgung (CT) und Änderungsdatenerfassung (CDC) gelesen Dies ist nur für Unternehmen), und ich bin mir nicht sicher, welchen Weg ich am besten einschlagen soll.
Ich hoffe, dass einige von Ihnen mit Integrationskenntnissen auf ein ähnliches Setup wie wir gestoßen sind und mich auf einen erfolgreichen Weg weisen oder mich auf einige Ressourcen verweisen können, die hilfreich wären.
Aus Kostengründen muss unsere Lösung in SQL Server Standard Edition funktionieren. Außerdem muss die Lösung angemessen sein, um sie in unserer kleinen Organisation zu unterstützen / zu warten.
Grundlegende Einstellung:
Derzeit verfügen wir über mehr als 100 einzelne Client-Datenbanken, von denen die meisten auf SQL-Servern in unserem Rechenzentrum bereitgestellt werden. Einige werden jedoch auf Client-Servern in ihrem Rechenzentrum bereitgestellt, in die wir remote zugreifen können. Dies sind alles SQL Server 2008 R2-Datenbanken, aber wir planen, bald ein Upgrade auf SQL 2016 durchzuführen.
Wir verwenden Datenbankprojekte und Dacpacs, um sicherzustellen, dass das Schema für alle zu integrierenden Client-Datenbanken gleich ist. Da wir jedoch nicht alle Clients zwingen, gleichzeitig auf neue Versionen zu aktualisieren, sind einige Schemaunterschiede zwischen den Upgrades möglich. Die Lösung muss flexibel genug sein, um nicht zu brechen, wenn sich Client A in Softwareversion 1.0 und Client B in Version 1.1 befindet.
Betriebsberichte werden derzeit direkt aus der OLTP-Datenbank jedes Clients ausgeführt. Wir sind besorgt über die Auswirkungen, die dies auf die Leistung der Anwendung haben wird, wenn wir sie nicht auslagern.
Hohe Anforderungen:
Unsere Kunden sind SPD-Abteilungen (Hospital Sterile Processing Departments), die aktuelle Berichte darüber wünschen, was sie bisher verarbeitet haben, wo sich das Inventar befindet usw. Das Prozessinventar der SPD ist rund um die Uhr verfügbar, einschließlich an Wochenenden und Feiertagen. Da einer der Hauptzwecke dieser Bemühungen darin besteht, die operative Berichterstattung besser zu unterstützen, möchten wir, dass die Daten so zeitnah wie möglich sind, um die Anforderungen der Kunden weiterhin zu erfüllen.
Derzeit haben wir einige SPDs in separaten Datenbanken, die tatsächlich Teil desselben Krankenhaussystems sind. Diese Clients möchten die Möglichkeit haben, Berichte über alle SPDs in ihrem System zu erstellen.
Strategisch gesehen möchten wir die Möglichkeit haben, Daten für alle unsere Kunden einfach zu aggregieren, um unsere internen Analyseinitiativen zu unterstützen. Wir gehen davon aus, dass wir die gesammelten Betriebsdaten als Quelle für Data Marts / Warehouse verwenden können.
Gedanken so weit:
Die Transaktionsreplikation scheint die "Echtzeit" -Lösung zu sein. Ich fand diese Antwort besonders hilfreich, befürchte jedoch, dass sie aufgrund des Potenzials für Schemaunterschiede bei uns nicht funktioniert: SQL Server Many-to-One-Replikation
Der Protokollversand klingt nicht ideal, da das Protokoll nicht wiederhergestellt werden kann, während Abfragen aktiv sind. Entweder muss ich alle rausschmeißen, damit das Protokoll wiederhergestellt werden kann, oder die Daten werden veraltet. Ich bin mir nicht sicher, ob diese Methode zur Zentralisierung von Daten aus mehreren Datenbanken verwendet werden kann, da jedes ausgelieferte Protokoll nur für die einzelne Datenbank bestimmt ist, aus der es stammt.
Bei Verwendung des SQL Service Brokers kann die Latenz unvorhersehbar sein, wenn eine Warteschlange nicht mit der Anzahl der zu verarbeitenden Nachrichten Schritt halten konnte.
CT identifiziert nur eine Version für jede Tabellenzeile. Die Latenz hängt davon ab, wie schnell wir so etwas wie ein SSIS-Paket für jede Datenbank verarbeiten können, um die Daten abzurufen und in ein zentrales Repository einzufügen.
Müssen wir in Betracht ziehen, jede Datenbank einzeln zu replizieren und dann möglicherweise eine Art Datenvirtualisierungstechnik zu verwenden, um Daten aus den verschiedenen replizierten Quellen zu kombinieren?
Jeder Rat oder jede Anweisung, die Sie bereit sind zu geben, wäre sehr dankbar.
Antworten:
Ja. Sie können mehrere Abonnentendatenbanken auf einer einzelnen Instanz hosten und diese dann mit Ansichten abfragen oder in eine konsolidierte Datenbank laden.
quelle
Gemäß Ihrer obigen Beschreibung hilft Ihnen der folgende Link und ich arbeite auch an demselben Szenario. Mehrere Herausgeber mit einem einzelnen Abonnenten.
Fügen Sie eine weitere Spalte wie server_id mit einem Standardwert wie 1,2,3 usw. hinzu und erstellen Sie einen zusammengesetzten Primärschlüssel.
Beim Erstellen der Veröffentlichungen und Hinzufügen von Artikeln muss die Artikeleigenschaft Aktion, wenn der Name verwendet wird, auf Daten löschen gesetzt werden. Wenn der Artikel über einen Zeilenfilter verfügt, löschen Sie nur Daten, die dem Filter entsprechen. Dies kann im Dialogfeld "Artikeleigenschaften des Assistenten für neue Veröffentlichungen" oder mithilfe der gespeicherten Replikationsprozeduren sp_addarticle und der Angabe des Löschwerts für das Argument @pre_creation_cmd festgelegt werden. Auf diese Weise bleiben zuvor angewendete Snapshot-Daten erhalten, wenn der zentrale Abonnent aus mehreren Veröffentlichungs-Snapshots initialisiert oder neu initialisiert wird, da nur Daten gelöscht werden, die mit der Filterklausel übereinstimmen.
http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/
quelle
Eine mögliche Architektur:
Betrachten Sie das Reporting als eine Data Warehouse-basierte Lösung.
In der Regel ist ein Data Warehouse eine Datenbank mit einem Schema, das die erforderliche Teilmenge der Quellsysteme darstellt. AdventureWorks und AdventureworksDW demonstrieren diese Modellierung.
Als nächstes die ETL: Verschieben von Daten aus Quellen in das Data Warehouse.
Eine mögliche Implementierung ist hier die Verwendung der Änderungsverfolgung.
Erstens kann man Ansichten implementieren, die versionsspezifisch in Bezug auf das, was sie verbrauchen, aber in Bezug auf das, was sie zurückgeben, einheitlich sind. Beispiel: Wenn Person.Gender in Version 2, aber nicht in Version 1 vorhanden ist, kann die Personenansicht für Version 1 beispielsweise null für Version 1 zurückgeben.
Für den Lagerkonsumenten, der nur die Ansichten liest, haben die Daten dieselbe Form (mit unterschiedlicher Vollständigkeit).
Die Änderungsverfolgung bietet eine (relativ) einfache Möglichkeit, um zu bestimmen, welche Daten bei jeder Aktualisierung geändert werden müssen.
Die Implementierung der oben genannten Funktionen basiert auf handwerklichen Tools. Sie müssen also mit der SQL-Codierung vertraut sein und Leistungsszenarien testen, um festzustellen, wie schnell die Inkremente ausgeführt werden. In vielen Fällen können sie unter 1 Sekunde liegen, aber einige hohe Transaktionstabellen können eine hohe Belastung bei der Verarbeitung von Änderungen verursachen. (Change Tracking ist 'relativ' leicht ... nur Tests beweisen es).
Das Gute daran ist, dass Sie ein hohes Maß an Kontrolle darüber haben, wie sich Schemaunterschiede manifestieren, und dass bei der Nachverfolgung von Änderungen bei korrekter Implementierung keine Möglichkeit von Integritätsproblemen besteht, da die Nachverfolgung auf Engine-Ebene erfolgt.
Ob dies definitiv für Sie richtig ist, ist schwer zu sagen.
quelle