Поделиться через


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

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

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

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

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

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

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

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

Примечание.

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

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

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

Примечание.

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

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

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

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

Примечание.

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

Чтобы отслеживать задержку распространения данных, см. «Мониторинг и устранение неполадок реплики в режиме только для чтения».

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

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

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

Server=tcp:<server>.database.windows.net;Database=<mydatabase>;ApplicationIntent=ReadOnly;User ID=<myLogin>;Password=<password>;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=<password>;Trusted_Connection=False; Encrypt=True;

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

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

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

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

Примечание.

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

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

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

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

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

Имя. Цель
sys.dm_db_resource_stats Предоставляет метрики использования ресурсов за последний час, включая ЦП, операции ввода-вывода данных и использование записи журнала относительно ограничений цели службы.
sys.dm_os_wait_stats Предоставляет совокупную статистику ожидания для экземпляра ядра базы данных.
sys.dm_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.resource_stats Динамические sys.elastic_pool_resource_stats управленческие представления в логической базе данных master возвращают данные об использовании ресурсов первичной реплики.

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

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

В базе данных 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, повторите запрос. Кроме того, не выполняйте операции, изменяющие метаданные объекта (изменения схемы, обслуживание индекса, обновление статистики и т. д.) на первичной реплике, пока на вторичных репликах выполняются длительные запросы.

Совет

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

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

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

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

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

Примечание.

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

Портал 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 требуется версия Azure PowerShell, начиная с декабря 2016 года, или более поздняя. Последнюю версию 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, вы должны создавать эти объекты как часть той же рабочей нагрузки при подключении к реплике только для чтения.

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

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

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

Примечание.

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

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

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

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

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