Grupa Always On Availability, zawsze przekierowuje użytkownika do instancji tylko do odczytu

9

Mamy grupę dostępności Always On z podstawową i wtórną z możliwością odczytu. Mamy użytkownika zespołu wdrożeniowego, który korzysta z bazy danych do sprawdzania poprawności danych, które zamierzają umieścić w bazie danych.

Użytkownicy mają tylko prawa do odczytu z bazy danych, ale kiedy łączą się (za pośrednictwem SSMS) za pomocą AG Listener, zawsze łączą się z aktywnym węzłem.

Próbowałem zmusić ich do bezpośredniego dostępu do instancji tylko do odczytu, ale utknęli na swojej drodze i po jednym lub dwóch dniach znów wrócili do aktywnego węzła.

Czy istnieje sposób, aby SQL Server powiedział, że ten użytkownik zawsze będzie z zamiarem tylko do odczytu i przekieruje go tam?

UWAGA: Próbowałem ustawić „ApplicationIntent = ReadOnly” w dodatkowych parametrach połączenia, ale wydaje się, że to nie przekierowuje do dodatkowego węzła i nie jest to idealne rozwiązanie, ponieważ nieuchronnie zapomną skonfigurować go dla nowych użytkowników.

SQL Server 2012 Enterprise, grupa dostępności 1 podstawowa, 1 czytelna pomocnicza z synchronicznym zatwierdzeniem.

Nie mam zamiaru, aby użytkownik łączył się z połączonym serwerem lub innym serwerem. Użytkownicy łączą się bezpośrednio z bazą danych przez SSMS (żadna inna aplikacja) i chciałbym, aby AG Listener (lub coś w tym miejscu) mógł skierować tego użytkownika do drugiego węzła, jeśli jest on dostępny (ponieważ ma on tylko dostęp do odczytu nie ma sensu uzyskiwać dostępu do podstawowego) bez konieczności robienia czegokolwiek, ponieważ poruszają się po komputerach i zapomną dodać intencję aplikacji. Uważam też, że dodanie do dodatkowych parametrów połączenia nie zawsze prowadzi do drugiego węzła.

Ste Bov
źródło
oprócz poniższych komentarzy musisz określić bazę danych w AG, z którą się łączysz.
swasheck

Odpowiedzi:

4

Nie mam odpowiedzi na całe twoje pytanie (chociaż dzisiaj odpowiedziałem na podobne pytanie https://dba.stackexchange.com/a/137844/36812 ), ale wspomniałeś, że użycie ApplicationIntent = ReadOnly nie działa prawidłowo.

Czy skonfigurowałeś tylko adresy URL routingu tylko do odczytu? Ponieważ nie jest to zrobione po wyjęciu z pudełka, a jeśli tego nie zrobisz, te ustawienia i ta flaga nie będą działać. Myślę, że jeśli to działa, możesz zacząć ponownie oceniać swoje wymagania.

Instrukcje dotyczące MSDN https://msdn.microsoft.com/en-us/library/hh710054.aspx i najłatwiej wykonane w PowerShell.

Set-Location SQLSERVER:\SQL\PrimaryServer\default\AvailabilityGroups\MyAg
$primaryReplica = Get-Item "AvailabilityReplicas\PrimaryServer"
$secondaryReplica = Get-Item "AvailabilityReplicas\SecondaryServer"

Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://PrimaryServer.domain.com:1433" -InputObject $primaryReplica
Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://SecondaryServer.domain.com:1433" -InputObject $secondaryReplica
Set-SqlAvailabilityReplica -ReadOnlyRoutingList "SecondaryServer","PrimaryServer" -InputObject $primaryReplica
Cody Konior
źródło
1

Ste, czego chcesz, to rozwiązanie typu wskaż i kliknij lub ustawienie gdzieś. Niestety, żaden z nich nie istnieje obecnie w formie „z półki”. Byłoby naprawdę miło, gdyby Microsoft uwzględnił to w ustawieniach połączenia dla zarejestrowanego serwera, aby można go było zapisać, ale niestety nie.

To pozostawia jedną z dwóch opcji:

  • Napisz coś sam
  • Zmień zachowanie użytkownika

Natknąłem się na plik do pobrania Microsoft dla SNAC - SQL Native Client Client, szukając czegoś, co może spełnić twoje wymagania. Umożliwiłoby to napisanie małego fragmentu kodu, aby dać użytkownikom przycisk umożliwiający bezpośredni dostęp do dodatkowej wersji tylko do odczytu. https://blogs.msdn.microsoft.com/alwaysonpro/2013/08/02/connect-to-sql-server-using-application-intent-read-only/

Inną możliwością jest zmuszenie użytkowników do wypełnienia okna dialogowego parametrów połączenia podczas łączenia przez SSMS. Aby wymusić to zachowanie, musisz zmodyfikować dane logowania na serwerze głównym i pomocniczym, odmawiając połączenia z serwerem podstawowym i zezwalając na połączenie z serwerami pomocniczymi. Możesz użyć zadania agenta SQL, aby sprawdzić status serwera i odpowiednio ustawić logowania.

Wprawdzie nie próbowałem robić tego drugiego, ale teoretycznie powinno to działać.

Steve Mangiameli
źródło
-2

Wygląda na to, że jest to teraz funkcja SQL Server 2019.

Od wtórnej do podstawowej replikacji przekierowanie połączenia do odczytu / zapisu (grupy zawsze włączone) w oficjalnej dokumentacji:

Wersja zapoznawcza programu SQL Server 2019 CTP 2.0 wprowadza wtórne przekierowanie połączenia odczytu / zapisu repliki podstawowej dla grup Always On Availability. Przekierowanie połączenia odczytu / zapisu jest dostępne na dowolnej platformie systemu operacyjnego. Umożliwia kierowanie połączeń aplikacji klienckiej do repliki podstawowej niezależnie od serwera docelowego określonego w ciągu połączeń.

Na przykład parametry połączenia mogą być kierowane na replikę dodatkową. W zależności od konfiguracji repliki grupy dostępności (AG) i ustawień ciągu połączenia połączenie może zostać automatycznie przekierowane do podstawowej repliki.

Matt
źródło
Nie jestem pewien, czy widzę, jak ważna jest ta nowa funkcja. Scenariusz PO wydaje się inny niż ten, dla którego ta funkcja jest przeznaczona. OP chce przekierowywać połączenia tylko do odczytu do dodatkowego węzła (tylko do odczytu), podczas gdy dokumentacja tej nowej funkcji mówi, że służy ona do przekierowywania połączeń do odczytu / zapisu do węzła podstawowego. Czy mógłbyś wyjaśnić, w jaki sposób można wykorzystać nową funkcjonalność do rozwiązania danego problemu?
Andriy M,