4 Stimmen

Parallele Abfrageausführung auf mehreren Datenbankservern (die Microsoft SQL Server ausführen)

Ist es möglich, mehrere Datenbankserver (die alle dieselbe Datenbank hosten) so zu konfigurieren, dass sie eine einzelne Abfrage gleichzeitig ausführen?

Ich frage nicht nach der Ausführung von Abfragen mit mehreren CPUs gleichzeitig - das weiß ich, dass es möglich ist.

UPDATE

Was ich meine, ist so etwas wie das:

  • Es gibt zwei Server: Server1 und Server2
  • Beide Server hosten die Datenbank Foo und beide Instanzen von Foo sind identisch
  • Ich verbinde mich mit Server1 und sende eine komplizierte (viele Joins, viele Berechnungen) Abfrage
  • Server1 entscheidet, dass einige Berechnungen auf Server2 durchgeführt werden sollten und einige Daten von diesem Server gelesen werden sollten - entsprechende Teile der Abfrage werden an Server2 gesendet
  • Beide Server lesen Daten und führen notwendige Berechnungen durch
  • Schließlich werden die Ergebnisse von Server1 und Server2 zusammengeführt und an den Client zurückgegeben

All dies sollte automatisch geschehen, ohne dass Server1 oder Server2 explizit referenziert werden müssen. Ich meine eine solche parallele Abfrageausführung - ist das möglich?

UPDATE 2

Danke für die Tipps, John und wuputah.

Ich erforsche Alternativen zur Steigerung der beiden Verfügbarkeit und Kapazität des MOSS-Datenbank-Backends. Also suche ich nach einer Art SQL Server Lastenausgleichslösung, die transparent für die Anwendung ist, weil ich die Anwendung nicht auf irgendeine Weise ändern kann. Ich denke, SQL Server hat keine solche Funktion (und Oracle, soweit ich das verstehe, hat sie - es ist RAC, wie von wuputah erwähnt).

UPDATE 3

Ein Zitat aus dem Artikel Top Tips for SQL Server Clustering:

Kommen wir zu einer weit verbreiteten Fehlannahme. Sie verwenden MSCS-Clustering für hohe Verfügbarkeit, nicht für Lastenausgleich. Außerdem hat SQL Server keine integrierte, automatische Lastenausgleichsfunktion. Sie müssen den Lastenausgleich durch das physische Design Ihrer Anwendung durchführen.

0 Stimmen

Coole Frage, aber du solltest dein Ziel / deine Absicht klarstellen. Im Grunde genommen, wie würde sich das von der Master-Master-Replikation unterscheiden?

3voto

wuputah Punkte 11174

Worüber Sie wirklich sprechen, ist eine Clustering-Lösung. Es sieht so aus, als ob SQL Server und Oracle Lösungen dafür haben, aber ich kenne mich damit nicht aus. Ich kann mir vorstellen, dass sie sehr teuer in der Anschaffung und Implementierung sein würden.

Mögliche alternative Vorschläge wären wie folgt:

  • Verwenden Sie die Master-Slave-Replikation und führen Sie Ihre komplexen Leseabfragen vom Slave aus. Alle Schreibvorgänge müssen zum Master gehen, der sie dann an den Slave sendet, damit alles synchronisiert bleibt. Dies hilft, dass die Abläufe schneller vonstattengehen, da der Slave sich nur um die Schreibvorgänge vom Master kümmern muss, die bereits im Namen des Slaves bestimmt sind (keine Deadlocks usw.). Wenn Sie mehrere Server nutzen möchten, ist dies der erste Punkt, an dem Sie beginnen sollten.
  • Verwenden Sie die Master-Master-Replikation. Das bedeutet, dass alle Schreibvorgänge von beiden Servern an den jeweils anderen gesendet werden, damit sie synchron bleiben (zumindest theoretisch). Dies hat einige der Vorteile der Master-Slave-Replikation, jedoch müssen Sie sich nicht um Schreibvorgänge kümmern, die nur an einem Server anstelle des anderen erfolgen. Der häufigere Einsatz der Master-Master-Replikation dient der Failover-Unterstützung; Master-Slave eignet sich besser für die Leistung.
  • Verwenden Sie die von John Sansom erwähnte Funktion. Ich kenne mich nicht gut damit aus, aber anscheinend basiert sie darauf, Ihre Datenbank in Tabellen auf verschiedenen Servern aufzuteilen, was einige Vorteile sowie Nachteile haben wird. Das große Problem dabei ist, dass da die beiden Systeme keinen gemeinsamen Speicher haben, sie eine Menge Daten über das Netzwerk teilen müssen, um komplexe Verknüpfungen berechnen zu können.

Hoffentlich hilft Ihnen das weiter!


Betreff Update 1:

Wenn Sie die Anwendung nicht ändern können, besteht Hoffnung, aber es könnte etwas kompliziert sein. Wenn Sie die Master-Slave-Replikation einrichten, können Sie dann einen Proxy einrichten, der Leseabfragen an den Slave(s) und Schreibabfragen an den Master(s) sendet. Ich habe das bei MySQL gesehen, aber nicht bei SQLServer. Das ist ein bisschen problematisch, es sei denn, Sie möchten den Proxy selbst schreiben.

Das wurde bereits auf SO diskutiert, also können Sie dort weitere Informationen finden.


Betreff Update 2:

Clusters von Microsoft sind möglicherweise nicht für die Leistung konzipiert, aber das ist Microsofts Schuld. Das ist dennoch das Maß an Komplexität, von dem hier die Rede ist. Wenn sie sagen, dass es nicht hilft, sind Ihre Optionen auf die oben genannten begrenzt und darauf, was Sie mit Ihrer Anwendung machen (wie Sharding, Aufteilung in mehrere Datenbanken usw.).

2voto

John Sansom Punkte 40295

Ja, ich glaube, dass es möglich ist, oder zumindest so etwa, lass mich erklären.

Sie müssen sich mit der Verwendung von verteilten Abfragen befassen und sie analysieren. Eine verteilte Abfrage läuft über mehrere Server und wird normalerweise verwendet, um Daten zu referenzieren, die nicht lokal gespeichert sind.

http://msdn.microsoft.com/en-us/library/ms191440.aspx

Zum Beispiel kann Server A meine Kunden-Tabelle enthalten und Server B meine Bestellungen-Tabelle. Mit verteilten Abfragen ist es möglich, eine Abfrage auszuführen, die sowohl auf Server A als auch auf Server B verweist, wobei jeder Server die Verarbeitung seiner lokalen Daten steuert (was die Verwendung von Parallelität beinhalten könnte).

Theoretisch könnte man die exakt gleichen Daten auf jedem Server speichern und Ihre Abfragen so entwerfen, dass nur bestimmte Tabellen auf bestimmten Servern referenziert werden, um die Last der Abfrage zu verteilen. Dies ist jedoch kein echtes paralleles Verarbeiten in Bezug auf die CPU.

Wenn Ihr Ziel ist, die Verarbeitungslast Ihrer Anwendung zu verteilen, dann ist der typische Ansatz mit SQL Server, die Replikation zu verwenden, um die Datenverarbeitung auf mehrere Server zu verteilen. Diese Methode ist auch nicht mit paralleler Verarbeitung zu verwechseln.

http://databases.about.com/cs/sqlserver/a/aa041303a.htm

Ich hoffe, das hilft, aber natürlich können Sie gerne alle Fragen stellen, die Sie haben.

1voto

Kristen Punkte 4123

Interessante Frage, aber ich habe Schwierigkeiten zu verstehen, wie dies für ein Mehrbenutzersystem vorteilhaft sein könnte.

Wenn ich der einzige Benutzer bin, bei dem die Hälfte meiner Abfrage auf Server1 und die andere Hälfte auf Server2 durchgeführt wird, hört sich das cool an :)

Wenn es zwei gleichzeitige Benutzer gibt (sagen wir mit Abfragen von identischer Schwierigkeit), dann sehe ich nicht, wie das hilft :(

Ich könnte identische Daten auf beiden Servern haben und eine Lastverteilung durchführen - sodass ich Server1 bekomme und mein Freund Server2 bekommt - oder ich könnte die Hälfte der Daten auf Server1 und die andere Hälfte auf Server2 haben und jeder wäre optimiert und würde nur seine eigenen Daten cachen, um die Last zu verteilen. Aber immer wenn du einen Merge durchführen musst, um eine Abfrage abzuschließen, wird die Leitung zwischen ihnen zum begrenzenden Faktor.

Dies sind im Grunde genommen Föderierte Datenbankserver. Anstatt alle meine Kunden auf einem Server und alle meine Bestellungen auf einem anderen zu haben, könnte ich zum Beispiel meine USA-Kunden und ihre Bestellungen auf einem haben und meine europäischen Kunden/Bestellungen auf einem anderen und nur wenn meine Abfrage beide umfasst, gibt es einen Merge-Schritt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X