Всегда в группе доступности, всегда перенаправлять пользователя на экземпляр только для чтения

9

У нас есть группа доступности Always On с первичным и вторичным доступом с поддержкой чтения. У нас есть пользователь для команды внедрения, который использует базу данных для проверки правильности данных, которые они намереваются поместить в базу данных.

Пользователи имеют права только на чтение из базы данных, но когда они подключаются (через SSMS) через прослушиватель AG, они всегда подключаются к активному узлу.

Я пытался заставить их обращаться к экземпляру только для чтения напрямую, но они застряли на своем пути, и через день или два они снова вернулись на активный узел.

Есть ли способ для SQL Server сказать, что этот пользователь всегда будет с намерением только для чтения, и перенаправить его туда?

ПРИМЕЧАНИЕ. Я попытался установить «ApplicationIntent = ReadOnly» в дополнительных параметрах соединения, но, похоже, это не перенаправляет на вторичный узел и не является идеальным решением, поскольку они неизбежно забудут настроить его для новых стартеров.

SQL Server 2012 Enterprise, группа доступности 1 первичная, 1 читаемая вторичная с синхронной фиксацией.

Я не собираюсь подключать пользователя к связанному серверу или через любой другой сервер. Пользователи подключаются напрямую к базе данных через SSMS (никакое другое приложение), и я хотел бы, чтобы прослушиватель AG (или что-то еще там) мог направить этого пользователя на вторичный узел, если он доступен (поскольку он имеет только доступ для чтения там). нет никакого смысла в доступе к основному) без необходимости что-либо делать, поскольку пользователи перемещаются по машинам и забывают добавить намерение приложения. Также я считаю, что добавление к дополнительным параметрам подключения не всегда направляет вас на дополнительный узел.

Ste Bov
источник
В дополнение к комментариям ниже, вам нужно указать базу данных в AG, к которой вы подключаетесь.
swasheck

Ответы:

4

У меня нет ответа на весь ваш вопрос (хотя я дал ответ на аналогичный вопрос сегодня https://dba.stackexchange.com/a/137844/36812 ), но вы упомянули, что использование ApplicationIntent = ReadOnly не работает должным образом.

Вы установили URL маршрутизации только для чтения? Потому что это не сделано из коробки, и если вы не сделаете это, эти настройки и этот флаг не будут работать. Я думаю, что если у вас это получится, вы можете начать переоценивать свои требования.

Инструкции для MSDN https://msdn.microsoft.com/en-us/library/hh710054.aspx и проще всего сделать в 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
Коди Кониор
источник
1

Ste, то, что вы хотите, это решение типа «укажи и щелкни» или параметр где-нибудь К сожалению, ни один из них в настоящее время не существует в готовом виде. Было бы очень хорошо, если бы Microsoft включила это в настройки подключения для Зарегистрированного сервера, чтобы его можно было сохранить, но, увы, нет.

Это оставляет вас с одним из двух вариантов:

  • Напишите что-нибудь сами
  • Изменить поведение пользователя

Я наткнулся на загрузку Microsoft для SNAC - SQL Native Access Client, ища что-то, что могло бы удовлетворить ваши требования. Это позволит вам написать небольшой кусочек кода, чтобы дать пользователям кнопку для доступа непосредственно к вторичному устройству только для чтения. https://blogs.msdn.microsoft.com/alwaysonpro/2013/08/02/connect-to-sql-server-using-application-intent-read-only/

Другая возможность - заставить пользователей заполнять диалог параметров соединения при подключении через SSMS. Чтобы вызвать такое поведение, вам нужно изменить имена входа на первичном и вторичном серверах, запретив подключение к первичному серверу и разрешив подключение к вторичным. Вы можете использовать задание агента SQL для проверки состояния сервера и установки логинов соответственно.

Правда, я не пытался сделать последнее, но теоретически это должно работать.

Стив Мангиамели
источник
-2

Похоже, что теперь это функция в SQL Server 2019.

От Перенаправления вторичной реплики к первичной реплике для чтения / записи (всегда в группах доступности) в официальной документации:

Предварительный просмотр SQL Server 2019 В CTP 2.0 добавлено вторичное перенаправление на чтение-запись для первичной реплики для групп Always On Availability. Перенаправление соединения «чтение / запись» доступно на любой платформе операционной системы. Это позволяет направлять подключения клиентских приложений к основной реплике независимо от целевого сервера, указанного в строке подключений.

Например, строка подключения может быть нацелена на вторичную реплику. В зависимости от конфигурации реплики группы доступности (AG) и настроек в строке соединения, соединение может быть автоматически перенаправлено на первичную реплику.

Matt
источник
Я не уверен, что вижу, как эта новая функция актуальна здесь. Сценарий OP, кажется, отличается от того, для которого эта функция предназначена. OP хочет перенаправить соединения только для чтения на вторичный (только для чтения) узел, в то время как в документации для этой новой функции говорится, что он предназначен для перенаправления соединений для чтения / записи на первичный узел. Не могли бы вы рассказать, как можно использовать новую функциональность для решения данной проблемы?
Андрей М