Дополнительные сведения см. в статье "Использование реплик только для чтения с целью разгрузить рабочие нагрузки от запросов только на чтение"

Применимо к: База данных SQL Azure Управляемый экземпляр SQL Azure

В рамках архитектуры высокой доступности каждая отдельная база данных или база данных эластичного пула в уровне "Премиум" и критически важный для бизнеса уровня служб автоматически подготавливается с первичной репликой чтения и записи и одной или несколькими вторичными репликами только для чтения. Вторичные реплики подготавливаются с тем же объемом вычислительных ресурсов, что и первичная реплика. Благодаря функции горизонтального увеличения масштаба для чтения можно распределять рабочие нагрузки базы данных SQL только для чтения за счет емкости одной из реплик только для чтения вместо совместного использования реплики для чтения и записи. Таким образом, некоторые рабочие нагрузки, доступные только для чтения, могут быть изолированы от рабочих нагрузок чтения и записи и не влияют на их производительность. Эта возможность предназначена для приложений, включающих логически разделенные рабочие нагрузки только для чтения, например, для аналитики. На уровнях служб категорий "Премиум" и "критически важный для бизнеса" приложения могут повысить производительность с помощью этой дополнительной емкости без лишних затрат.

При добавлении хотя бы одной вторичной реплики также доступна функция масштабирования для чтения на уровне служб "Гипермасштабирование". Вторичные вторичные именованные реплики гипермасштабирования обеспечивают независимое масштабирование, изоляцию доступа, изоляцию рабочей нагрузки, поддержку различных сценариев масштабирования чтения и других преимуществ. Несколько вторичных реплик HA можно использовать для рабочих нагрузок с балансировкой нагрузки только для чтения, для которых требуется больше ресурсов, чем доступно на одной вторичной реплике HA.

Архитектура высокого уровня доступности уровней "Базовый", "Стандартный" и "общего назначения" не включает ни одной реплики. Функция горизонтального масштабирования чтения недоступна на этих уровнях служб. Однако при использовании База данных SQL Azure геореплики могут предоставлять аналогичные функциональные возможности на этих уровнях служб. При использовании Управляемый экземпляр SQL Azure и групп отработки отказа прослушиватель группы отработки отказа может предоставлять аналогичные функции соответственно.

На следующей схеме показана функция для баз данных и управляемых экземпляров уровней "Премиум" и "Критически важный для бизнеса".

Схема, на которой показаны реплики чтения.

Функция масштабирования для чтения по умолчанию включена для новых баз данных уровней "Премиум", "Критически важный для бизнеса" и "Гипермасштабирование".

Примечание.

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

Если строка подключения SQL настроеноApplicationIntent=ReadOnly, приложение перенаправляется на реплику только для чтения этой базы данных или управляемого экземпляра. Сведения об использовании ApplicationIntent свойства см. в разделе Указание намерения приложения.

Только для База данных SQL Azure, если вы хотите убедиться, что приложение подключается к первичной реплике независимо от ApplicationIntent параметра в строка подключения SQL, необходимо явно отключить горизонтальное масштабирование чтения при создании базы данных или при изменении его конфигурации. Например, если вы обновите базу данных с уровня "Стандартный" или "Общего назначения" до уровня "Премиум" или "Критически важный для бизнеса" и хотите убедиться, что все подключения продолжают работать с первичной репликой, отключите масштабирование для чтения (см. раздел Включение и выключение масштабирования для чтения).

Примечание.

Хранилище запросов и SQL Profiler не поддерживаются в репликах только для чтения.

Согласованность данных

Изменения, внесенные в основную реплику, сохраняются в доступных только для чтения репликах, синхронно или асинхронно в зависимости от типа реплики. Однако для всех типов реплик чтение из реплики, доступной только для чтения, всегда выполняется асинхронно с точки зрения первичной реплики. В сеансе, подключенном к реплике только для чтения, операции чтения всегда являются транзакционно согласованными. Поскольку задержка распространения данных является переменной, различные реплики могут возвращать данные в несколько разные моменты времени относительно первичной и каждой последующей. Если реплика только для чтения становится недоступной и сеанс повторно подключается, он может подключиться к реплике, которая находится в моменте времени, отличном от исходной реплики. Аналогичным образом, если приложение изменяет данные с помощью сеанса чтения и записи в основном и немедленно считывает его с помощью сеанса только для чтения в реплике только для чтения, возможно, что последние изменения не сразу видны.

Типичная задержка распространения данных между первичной репликой и репликами только для чтения варьируется в диапазоне от десятков миллисекунд до 10 секунд. Однако нет фиксированной верхней границы задержки распространения данных. Такие условия, как высокий уровень использования ресурсов в реплике, могут значительно увеличить задержку. Приложения, требующие гарантированной согласованности данных в сеансах или немедленного чтения зафиксированных данных, должны использовать первичную реплику.

Примечание.

Задержка распространения данных включает время, необходимое для отправки и сохранения (если применимо) записей журнала в вторичную реплику. Он также включает время, необходимое для повтора (применения) этих записей журнала к страницам данных. Чтобы обеспечить согласованность данных, изменения не отображаются до тех пор, пока запись журнала фиксации транзакций не будет применена. Когда рабочая нагрузка использует более крупные транзакции, увеличивается эффективная задержка распространения данных.

Сведения о мониторинге задержки распространения данных см. в статье "Мониторинг и устранение неполадок реплики только для чтения".

Подключение к реплике только для чтения

При включении масштабирования для чтения для базы данных предоставляемый клиентом параметр ApplicationIntent в строке подключения определяет, куда направляется подключение: к реплике для записи-чтения или к реплике только для чтения. В частности, если ApplicationIntent значение равно ReadWrite (значение по умолчанию), подключение направляется к реплике чтения и записи. Это идентично поведению, если ApplicationIntent он не включен в строка подключения. Если значение ApplicationIntentReadOnly, подключение направляется к реплике, доступной только для чтения.

Например, следующая строка подключения позволяет подключить клиента к реплике только для чтения (замените элементы в угловых скобках правильными значениями для среды и удалите угловые скобки):

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Чтобы подключиться к реплике только для чтения с помощью SQL Server Management Studio (SSMS), выберите "Параметры"

Снимок экрана: кнопка

Выберите дополнительные параметры подключения и введите ApplicationIntent=ReadOnly и нажмите кнопку "Подключиться"

Снимок экрана: дополнительные параметры подключения SSMS.

Обе приведенные ниже строки подключения подключают подключить клиента к реплике для чтения и записи (замените элементы в угловых скобках правильными значениями для среды и удалите угловые скобки):

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadWrite;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;User ID=<myLogin>;Password=<myPassword>;Trusted_Connection=False; Encrypt=True;

Убедитесь, что подключение выполняется к реплике только для чтения

Можно проверить, подключены ли вы к реплике только для чтения, выполнив следующий запрос в контексте базы данных. Он возвращает READ_ONLY при подключении к реплике только для чтения.

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');

Примечание.

В уровнях служб "Премиум" и "критически важный для бизнеса" доступна только одна реплика только для чтения в любой конкретный момент времени. Уровень "Гипермасштабирование" поддерживает несколько реплик только для чтения.

Мониторинг и устранение неполадок реплик только для чтения

При подключении к реплике только для чтения динамические административные представления (DMV) отображают состояние реплики и могут запрашиваться для целей мониторинга и устранения неполадок. Ядро базы данных обеспечивает несколько представлений для показа широкого спектра данных мониторинга.

Для мониторинга реплик и устранения неполадок с ними обычно используются следующие представления:

Имя. Характер использования
sys.dm_db_resource_stats Предоставляет метрики использования ресурсов за последний час, включая ЦП, операции ввода-вывода данных и использование записи журнала относительно ограничений цели службы.
sys.dm_os_wait_stats Предоставляет совокупную статистику ожидания для экземпляра ядра базы данных.
sys.dm_hadr_database_replica_states Предоставляет состояние работоспособности реплики и статистику синхронизации. Размер очереди повтора и скорость повтора служат индикаторами задержки распространения данных в реплике только для чтения.
sys.dm_os_performance_counters Предоставляет счетчики производительности ядра базы данных.
sys.dm_exec_query_stats Предоставляет статистику выполнения по запросу, например количество выполнений, использованное время ЦП и т. д.
sys.dm_exec_query_plan() Предоставляет кэшированные планы запросов.
sys.dm_exec_sql_text() Предоставляет текст запроса для кэшированного плана запроса.
sys.dm_exec_query_profiles Предоставляет ход выполнения запросов в режиме реального времени в ходе выполнения запросов.
sys.dm_exec_query_plan_stats() Предоставляет последний известный фактический план выполнения, включая статистику времени выполнения для запроса.
sys.dm_io_virtual_file_stats() Предоставляет статистику операций ввода-вывода, пропускной способности и задержки хранилища для всех файлов базы данных.

Примечание.

sys.elastic_pool_resource_stats Динамические sys.resource_stats административные представления в логической master базе данных возвращают данные об использовании ресурсов первичной реплики.

Мониторинг реплик только для чтения с помощью расширенных событий

Расширенный сеанс событий нельзя создать при подключении к реплике только для чтения. Однако в База данных SQL Azure и Управляемый экземпляр SQL Azure определения сеансов расширенных событий с областью базы данных, созданных и измененных на первичной реплике, в реплике только для чтения, включая геореплики, и записи событий на репликах только для чтения.

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

Управляемый экземпляр SQL Azure Чтобы запустить трассировку в реплике только для чтения, необходимо сначала запустить трассировку на первичной реплике, прежде чем запустить трассировку на реплике только для чтения. Если вы не запускаете трассировку на первичной реплике, при попытке запустить трассировку на реплике только для чтения возникает следующая ошибка:

Msg 3906, Level 16, State 2, Line 1 Не удалось обновить базу данных master, так как база данных доступна только для чтения.

После запуска трассировки сначала на первичной реплике, а затем на реплике только для чтения можно остановить трассировку на первичной реплике.

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

  1. Подключите SSMS обозреватель объектов или окно запроса к реплике только для чтения.
  2. Остановите сеанс на реплике только для чтения, выбрав команду Остановить сеанс в контекстном меню сеанса в обозреватель объектов или выполнив в ALTER EVENT SESSION [session-name-here] ON DATABASE STATE = STOP; окне запроса.
  3. Подключите обозреватель объектов или окно запроса к первичной реплике.
  4. Удаление сеанса на первичной реплике либо путем нажатия кнопки "Удалить " в контекстном меню сеанса или путем выполнения DROP EVENT SESSION [session-name-here] ON DATABASE;

Уровень изоляции транзакций для реплик только для чтения

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

В редких случаях, если транзакция изоляции моментального снимка обращается к метаданным объекта, которые были изменены в другой параллельной транзакции, она может получить ошибку 3961, "Сбой транзакции изоляции моментального снимка в базе данных '%. * ls', так как объект, к которому обращается инструкция, был изменен инструкцией DDL в другой параллельной транзакции с момента запуска этой транзакции. Это запрещено, так как управление версиями метаданных не осуществляется. Параллельное обновление метаданных может привести к несогласованности при использовании смешанного режима с изоляцией моментальных снимков".

Длительные запросы к репликам только для чтения

Запросы, выполняющиеся в репликах только для чтения, должны иметь доступ к метаданным для объектов, на которые ссылается запрос (таблицы, индексы, статистика и т. д.). В редких случаях, если метаданные объекта изменяются на первичной реплике, в то время как сам запрос удерживает блокировку того же объекта в реплике только для чтения, этот запрос может заблокировать процесс, который применяет изменения из первичной реплики к реплике только для чтения. Если такой запрос выполняется в течение длительного времени, то реплика только для чтения может расходиться в синхронизации с первичной репликой. Для реплик, которые являются потенциальными целями отработки отказа (вторичные реплики уровней "Премиум" и "Критически важный для бизнеса", реплики HA уровня "Гипермасштабирование", а также все геореплики), это также приведет к задержке восстановления базы данных, если произойдет отработка отказа, что приведет к более длительному, чем ожидалось, времени простоя.

Если длительный запрос к реплике только для чтения, прямо или косвенно вызывает такую блокировку, он может быть автоматически завершен, чтобы избежать чрезмерной задержки данных и потенциального воздействия на доступность базы данных. Сеанс получает ошибку 1219: "Сеанс был отключен из-за операции DDL с высоким приоритетом" или ошибкой 3947", "Транзакция была прервана, так как вторичный вычислительный ресурс не удалось выполнить повтор. Повторите транзакцию".

Примечание.

Если при выполнении запросов к реплике только для чтения появляется сообщение об ошибке 3961, 1219 или 3947, повторите запрос. Кроме того, не выполняйте операции, изменяющие метаданные объекта (изменения схемы, обслуживание индекса, обновление статистики и т. д.) на первичной реплике, пока на вторичных репликах выполняются длительные запросы.

Совет

В уровнях служб "Премиум" и "критически важный для бизнеса" при подключении к реплике только для чтения столбцы redo_queue_size и redo_rate в динамическом административном представлении sys.dm_database_replica_states могут использоваться для мониторинга процесса синхронизации данных, выступая в качестве индикаторов задержки распространения данных в реплике только для чтения.

Включение и отключение горизонтального масштабирования чтения для База данных SQL

Для Управляемый экземпляр SQL горизонтальное масштабирование чтения автоматически включается на уровне служб критически важный для бизнеса и недоступен на уровне служб общего назначения. Отключение и повторное масштабирование чтения невозможно.

Для База данных SQL масштабирование чтения по умолчанию включено на уровнях служб "Премиум", критически важный для бизнеса и "Гипермасштабирование". Горизонтальное масштабирование чтения невозможно включить на уровнях служб "Базовый", "Стандартный" или "Общего назначения". Масштабирование для чтения автоматически отключается для баз данных уровня "Гипермасштабирование", для которых не настроены вторичные реплики.

Для отдельных и объединенных баз данных в База данных SQL Azure можно отключить и повторно включить горизонтальное масштабирование чтения на уровнях служб "Премиум" или критически важный для бизнеса с помощью портал Azure и Azure PowerShell. Эти параметры недоступны для Управляемый экземпляр SQL, так как горизонтальное масштабирование чтения невозможно отключить.

Примечание.

Для отдельных баз данных и баз данных эластичных пулов возможность отключения масштабирования для чтения предоставляется для обеспечения обратной совместимости. Невозможно отключить горизонтальное увеличение масштаба для чтения для управляемых экземпляров уровня "критически важный для бизнеса".

Портал Azure

Для База данных SQL Azure можно управлять параметром горизонтального масштабирования чтения на панели базы данных вычислений и хранилища, доступной в разделе "Параметры". Использование портал Azure для включения или отключения горизонтального масштабирования чтения недоступно для Управляемый экземпляр SQL Azure.

PowerShell

Внимание

Модуль PowerShell Azure Resource Manager по-прежнему поддерживается, но вся дальнейшая разработка сосредоточена на модуле Az.Sql. Исправление ошибок для модуля Azure Resource Manager будет выпускаться как минимум до декабря 2020 г. Аргументы команд в модулях Az и Azure Resource Manager практически идентичны. Дополнительные сведения о совместимости см. в статье Введение в новый модуль Azure PowerShell Az.

Для управления масштабированием для чтения в Azure PowerShell требуется выпуск от декабря 2016 Azure PowerShell или более поздней версии. Последнюю версию Azure PowerShell см. здесь.

В База данных SQL Azure можно отключить или повторно включить горизонтальное масштабирование чтения в Azure PowerShell путем вызова командлета Set-AzSqlDatabase и передачи требуемого значения (EnabledилиDisabled) для -ReadScale параметра. Отключение горизонтального масштабирования чтения для Управляемый экземпляр SQL недоступно.

Чтобы выключить для имеющейся базы данных функцию масштабирования для чтения (замените элементы в угловых скобках правильными значениями для среды и удалите эти угловые скобки):

Set-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Disabled

Чтобы выключить для новой базы данных функцию масштабирования для чтения (замените элементы в угловых скобках правильными значениями для среды и удалите эти угловые скобки):

New-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Disabled -Edition Premium

Чтобы повторно включить для имеющейся базы данных функцию масштабирования для чтения (замените элементы в угловых скобках правильными значениями для среды и удалите эти угловые скобки):

Set-AzSqlDatabase -ResourceGroupName <resourceGroupName> -ServerName <serverName> -DatabaseName <databaseName> -ReadScale Enabled

REST API

Чтобы создать базу данных с выключенным масштабированием для чтения или изменить параметр для существующей базы данных, используйте следующий метод со свойством readScale, для которого задано значение Enabled или Disabled, как в следующем примере запроса.

Method: PUT
URL: https://management.azure.com/subscriptions/{SubscriptionId}/resourceGroups/{GroupName}/providers/Microsoft.Sql/servers/{ServerName}/databases/{DatabaseName}?api-version= 2014-04-01-preview
Body: {
   "properties": {
      "readScale":"Disabled"
   }
}

Дополнительные сведения см. в разделе Базы данных. Создание или обновление.

tempdb Использование базы данных в реплике только для чтения

База tempdb данных на первичной реплике не реплицируется в реплики только для чтения. Каждая реплика имеет собственную базу данных tempdb, созданную при формировании реплики. Это гарантирует обновление tempdb и может изменяться во время выполнения запроса. Если ваша рабочая нагрузка только для чтения зависит от использования объектов tempdb, вы должны создавать эти объекты как часть той же рабочей нагрузки при подключении к реплике только для чтения.

Использование горизонтального масштабирования чтения с геореплицированными базами данных

Геореплицированные вторичные базы данных имеют ту же архитектуру HA, что и первичные базы данных. Если вы подключаетесь к геореплицированной базе данных-получателю с поддержкой масштабирования чтения, сеансы с ApplicationIntent=ReadOnly поддержкой горизонтального масштабирования направляются в одну из реплик высокой доступности так же, как они направляются в базу данных-источнике. Сеансы без ApplicationIntent=ReadOnly перенаправления на первичную реплику геореплицированной вторичной, которая также доступна только для чтения.

Таким образом, создавая геореплику, вы можете предоставить несколько дополнительных реплик только для чтения для первичной базы данных для чтения и записи. Каждая дополнительная геореплика предоставляет еще один набор реплик только для чтения. Геореплики можно создавать в любом регионе Azure, включая регион первичной базы данных-источника.

Примечание.

Не существует автоматического циклического перебора или какой-либо другой маршрутизации с балансировкой нагрузки между репликами геореплицированной вторичной базы данных, кроме георепликации уровня "Гипермасштабирование" более чем с одной репликой HA. В этом случае сеансы с намерением только для чтения распределяются по всем репликам HA геореплики.

Поддержка функций для реплик только для чтения

Ниже приведен список действий некоторых функций в репликах только для чтения:

  • Аудит доступных только для чтения реплик включен автоматически. Дополнительные сведения об иерархии папок хранения, соглашения об именовании и формате журнала см. в разделе База данных SQL Формат журнала аудита.
  • Аналитика производительности запросов использует данные из хранилище запросов, которые в настоящее время не отслеживают действия в реплике только для чтения. Аналитика производительности запросов не отображает запросы, выполняемые на реплике только для чтения.
  • Автоматическая настройка зависит от хранилища запросов, как подробно описано в документации по автоматической настройке. Автоматическая настройка работает только для рабочих нагрузок, выполняющихся на первичной реплике.

Следующие шаги