2016-09-19 3 views
3

У меня есть база данных SQL Server 2014, настроенная как синхронная группа доступности AlwaysOn.Грязные чтения в SQL Server AlwaysOn

Оба сервера установлены в режим доступности Synchronous commit с таймаутом сеанса 50 секунд. Вторичным является Read-intent only читаемый вторичный.

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

Ожидается ли такое поведение? Если да, есть ли что-то, что я могу сделать, чтобы убедиться, что чтения из вторичного являются актуальными?

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

+0

Вероятно лучше для HTTP://dba.stackexchange.com/ – Liam

+0

Это не «грязное чтение», это просто латентность. Читайте здесь: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2011/12/22/alwayson-readable-secondary-and-data-latency/ – dean

+1

См. Http://dba.stackexchange.com/questions/84420/does-synchronous-commit-availability-mode-обеспечить-согласованность между репликами. Короче: да, это ожидается, и если вы не можете терпеть * любую * латентность, прочитайте с первичной.Вы могли бы придумать свой собственный механизм для обеспечения того, чтобы ваши чтения были актуальными (таблица времени с триггером или подобным), но в большинстве случаев это было бы больше неприятностей, чем его ценность. Не следует, в любом случае, слепо смешивать реплики в одной рабочей нагрузке в ожидании их синхронизации. –

ответ

2

Там нет никакого способа, вы можете получить грязное чтение, если вы не используете не-блокировку намека ..

При включении Только для чтения Второстепенных в AlwaysOn..Internally SQL использует rowversioning для хранения Предыдущей версии строки ..

дальше вы используете синхронный режим фиксации, что обеспечивает записи журнала поручены первым на вторичном, то на первичном ..

то, что вы видите, это задержка данных ..

whitePaper Это DEA Ls с этим scenario..Below актуальна часть, которая помогает понять больше ..

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

Задержка данных существует, даже если вы настроили вторичную реплику в синхронный режим. Хотя это правда, что синхронная реплика помогает гарантировать потерю данных в идеальных условиях (то есть RPO = 0) путем упрощения записей журнала транзакций о совершенной транзакции перед отправкой ACK в первичный, это не гарантирует, что поток REDO на вторичной реплике действительно применил связанные записи журнала к страницам базы данных.

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

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

Смежные вопросы