Frage

Ich habe diese Frage auch in meinem Blog gepostet: http://www.sqldioblo.com/2012/04/15/service-broker-alwayson-ubierbarkeit-groups-odd-transmission-queue-behavior/.

Ich habe in den letzten Monaten an einem Projekt gearbeitet, in dem Service Broker und immeronon -Verfügbarkeitsgruppen verwendet werden, um einige der HA- und DR -Ziele des Unternehmens zu erreichen, für die ich arbeite (weitere Informationen: http://www.sqldiablo.com/service-broker-replication/). Erst kürzlich konnte ich die vollständige Lösung in meinem Entwicklungslabor implementieren und eine Instanz unserer Website darauf hinweisen. Während wir einige Knicke in unserer Datenbank und Website ausarbeiten, um die beiden gut mit meinem Service Broker Replication -Projekt zusammenzuarbeiten, bemerkte ich ein seltsames Verhalten im Service Broker, als es mit immerzeiten Verfügbarkeitsgruppen verwendet wurde, und ich wollte darüber bloggen Ein Versuch zu sehen, ob jemand anderes dieses Problem gesehen hat und möglicherweise eine Idee hat, wie man es angeht.

Die Einrichtung:

Ich habe einen Hyper-V-Host, der 6 Windows Server 2008 R2 VMs (BTDEVSQLVM1-BTDEVSQLVM6) ausführt. Die VMs werden in 2-Knoten-WSFCs mit Knoten- und Dateifreigabe-Quorum gruppiert. Ich habe Standalone SQL 2012 Developer Edition -Instanzen in jedem der VMs installiert und eine Verfügbarkeitsgruppe mit einem Hörer auf jedem Cluster erstellt (Sbrepldistrib, SBREPL1 und SBREPL2).

Für den Zweck dieses Blog -Beitrags werde ich mich auf die Kommunikation zwischen SBREPL1 und SBRLDISTRIB konzentrieren. Die folgende Abbildung zeigt die Service Broker -Objekte für jede Seite des Gesprächs:

(Ich bin neu und kann noch Bilder veröffentlichen, also sehen Sie sich meinen Blog in der URL oben für das Bild an.)

Die Service Broker Endpunkte und Routen sind pro Setup pro Setup Dieser MSDN -ArtikelDie SBREPL_RECEIVE -Route in MSDB ist für den Dienst des lokalen Servers (// sbrepldistrib/sbrepl on sbrepldistrib und // sbrepl1/sbrepl auf SBREPL1) und zeigt auf die lokale Instanz. Die SBREPL_SEND -Route auf SBREPL1 MAPS Service // sbrepldistrib/sbrepl an tcp: // sbrepldistrib: 4022, und die SBREPL_SEND_SBREPL1 -Route auf Sbrepldistrib ist eine ähnliche Zuordnung für den Service auf SBREPL1.

Das erwartete Verhalten:

Mein Verständnis dafür, wie Service Broker das Senden und Empfangen von Nachrichten verarbeitet, ist daher (dies ist ziemlich vereinfacht. Es gibt viel mehr Details zu diesem Prozess in Klaus Aschenbrenners Buch „Pro SQL Server 2008 Service Broker“):

  1. Die Initiator -App erstellt eine Nachricht (in diesem Fall gut geformte XML)
  2. Wenn sich eine vorhandene Dialogkonversation zwischen dem Initiatordienst und dem Zieldienst im Gesprächsstatus befindet, kann die App einfach die Nachricht im vorhandenen Gesprächsgriff senden. Andernfalls sollte die Initiator -App eine Dialoggespräch zwischen dem Initiatordienst und dem Zieldienst beginnen und die Nachricht in diesem Gesprächsgriff senden.
  3. Die Nachricht wird in der Tabelle Sys.Transmission_queue System platziert, und Service Broker beginnt Versuche, die Nachricht an den Zieldienst zu liefern.
  4. Service Broker sucht nach einer geeigneten Route und einer Remote -Service -Bindung und ermittelt sie, um die Adresse herzustellen, mit der eine Verbindung hergestellt werden soll, um die Nachricht zu übermitteln.
  5. Service Broker öffnet eine Verbindung zum Ziel, authentifiziert und liefert die Nachricht an den Target Service Broker.
  6. Der Target Service Broker versucht, die Nachricht zu klassifizieren und zu bestimmen, welcher lokale Dienst die Nachricht behandelt (damit wird Routendaten in der MSDB -Datenbank verwendet).
  7. Der Target Service Broker liefert die Nachricht an die Warteschlange des Zieldienstes
  8. Sobald die Nachricht erfolgreich an die Zielwarteschlange übermittelt wurde, sucht der Target Service Broker nach Routeninformationen zurück zum Initiator und versucht, eine Bestätigung zu liefern, dass die Nachricht empfangen wurde.
  9. Der Service Broker des Initiators erhält die Bestätigung und verwendet Routing -Informationen in MSDB, um festzustellen, für welchen lokalen Service die Bestätigung ist.
  10. Nach erfolgreichem Routing der Bestätigung zum initiierenden Dienst wird die Nachricht aus der Tabelle sys.transmission_queue -Systems entfernt.
  11. Wenn der Initiator keine Bestätigung erhält, dass die Nachricht empfangen wurde, wird er regelmäßig die Nachricht an das Ziel übertragen. Wenn das Ziel die Nachricht bereits erhalten hat, werden lediglich zusätzliche Zustellungsversuche fallen und für diese Bestätigungen gesendet.

Das seltsame Verhalten:

In Schritt 11 sehe ich ein sehr seltsames Verhalten bei Service Broker und immer. Ich sehe die Nachricht, dass die Nachricht an das Ziel übermittelt und erfolgreich verarbeitet wird, und ich sehe auch, dass die Bestätigung an den Initiator zurückgesandt und empfangen wird. Die Nachricht bleibt jedoch in sys.transmission_queue, als ob keine Bestätigung eingehen würde. Um die Dinge noch seltsamer zu machen, versucht der Service Broker nicht, die Nachricht so weiterzugeben, wie ich es erwarten würde, wenn die Bestätigung nicht erhalten würde. Stattdessen bleibt die Nachricht einfach in der sys.transmission_queue, und wenn neue Nachrichten gesendet werden, werden sie geliefert, bestätigt und auch im sys.transmission_queue bleiben. Es scheint mir, als ob der Service Broker die Bestätigungen erhält und hört daher auf, die Nachricht zu übermitteln, entzieht sie jedoch nicht aus irgendeinem Grund aus dem sys.transmission_queue. Der Getriebe für diese Nachrichten bleibt leer, was darauf hinweisen sollte, dass der Service Broker noch nicht versucht hat, sie zu liefern.

Ich habe die Aufbewahrungseinstellung in der Service -Warteschlange überprüft und sie ist auf OFF gesetzt. Dies sollte sich jedoch nur auf die Service -Warteschlange und nicht auf die sys.transmission_queue auswirken. Ich habe auch beide Seiten des Gesprächs mit SQL Profiler verfolgt, und ich kann sehen, dass die Nachricht gesendet wird und die Bestätigung an den Initiator zurückgesandt und empfangen wird (siehe XML -Trace -Daten am Ende dieses Beitrags).

Eine seltsame Sache sprang in den Spuren auf mich aus. Mir ist aufgefallen, dass beide Seiten mit den TCP -Verbindungen etwas verwirrt zu sein schienen, da Nachrichten aus der IP -Adresse des Knotens selbst gesendet werden, während die Service -Routen und die Nachrichten selbst auf den Namen/die IP des Ag -Listeners hinweisen. Diese Verwirrung scheint zu veranlassen, die vorhandene Verbindung zwischen den beiden Diensten zu schließen und eine neue zu erstellen, um eine Nachricht oder Bestätigung zu übermitteln. Ich bin mir nicht sicher, ob dies normal ist oder nicht oder ob es etwas damit zu tun hat, warum die Anerkennung nicht richtig gehandhabt werden, aber es war das einzige, was ich sehen konnte, das möglicherweise das seltsame Verhalten erklären könnte.

Die Bitte um Hilfe:

Zu diesem Zeitpunkt habe ich keine andere Lösung für dieses Problem der Nachrichtenbindung, als das Gespräch mit Aufräumarbeiten auf beiden Seiten manuell zu beenden, und das ist nicht wirklich etwas, das ich tun möchte. Wenn Sie irgendwelche Ideen haben, warum dies passieren könnte oder was ich dagegen tun kann, hinterlassen Sie mir bitte einen Kommentar und lassen Sie es mich wissen. Wenn es zusätzliche Informationen gibt, die ich über mein Setup oder das Problem zur Verfügung stellen soll, teilen Sie mir bitte auch in den Kommentaren mit. Ich werde eine Follow -up in diesen Beitrag veröffentlichen, wenn ich eine Lösung für dieses Problem finde.

Die Trace -Daten:

Bitte beachten Sie meinen Blog -Beitrag (die URL steht am Anfang der Frage).

War es hilfreich?

Lösung

In den letzten Monaten habe ich mit dem Produkt Support -Team von Microsoft zusammengearbeitet und zwei Fehler in SQL Server 2012 in Bezug auf dieses Problem bestätigt. Sie werden Patches für diese Fehler im Rahmen des nächsten Service -Packs für SQL Server 2012 veröffentlichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top