Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Always On Синхронный режим  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
Добрый день.

Имеются два инстанса с Always On в синхронном режиме. Вторичная нода используется для чтения.
Есть проблема, что клиентское приложение меняет данные в таблице, потом делает селект к ноде для чтения и иногда измененных данных там нет. При запросе к основном ноде - данные имеются. Грязное чтение не используется.
Для асинхронного режима такое поведение не удивило бы, но в синхронном вроде такого не должно быть. Есть некоторая вероятность, что проблема на стороне приложения, но пока рассматриваю причины на стороне MS SQL Server.

Возможно не совсем верно понят механизм подтверждения транзакции в синхронном режиме.
"В режиме синхронной фиксации транзакции не отправляют клиенту подтверждение, пока вторичная реплика не зафиксирует журнал на диск."

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

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

Изначально механизм синхронной фиксации был понят, как отправка подтверждения транзакции после записи на вторичных нодах в БД и на диск, но похоже тут скорее шла речь про запись в логи для дальнейшей накатки изменений на БД, больше со стороны отказоустойчивости.
Кто-то сталкивался\проверял как точно работает синхронный режим? И насколько там действительно могут запаздывать изменения на вторичной ноде после подтверждения транзакции?
28 окт 20, 16:47    [22222423]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Синхронный режим означает только подтверждение записи в лог на вторичных репликах.

Никакого контроля, когда транзакции из лога применятся на торичной реплике, нет. Они могут применяться более-менее сразу, а могут на часы или дни запаздывать. Это все, кстати, видно в дашбоде Awlways On и dmv.

Сообщение было отредактировано: 28 окт 20, 16:51
28 окт 20, 16:54    [22222436]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Danion
Member

Откуда: Москва
Сообщений: 225
Гавриленко Сергей Алексеевич
Синхронный режим означает только подтверждение записи в лог на вторичных репликах.
Это все, кстати, видно в дашбоде Awlways On и dmv.

Понятно, значит всё таки вариант, что не поняли, когда реально идёт подтверждение.
А можно поподробнее с дашбордом always on? Если не во время сбоя, то там обычно всегда статус synchronized и no data loss. Или там нужно дополнительные столбцы включить?
28 окт 20, 17:05    [22222441]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
Danion,

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

Сообщение было отредактировано: 28 окт 20, 17:42
28 окт 20, 17:46    [22222481]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
В асинхронном режиме подтверждение фиксации также присылается на первичную реплику и это дает возможность усечения журнала транзакций после резервного копирования. Но транзакция обрабатывает фиксацию на первичной не дожидаясь этого подтверждения.
28 окт 20, 17:50    [22222486]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
msLex
Member

Откуда:
Сообщений: 8455
Владислав Колосов
Danion,

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

Выше уже писали. Единственное, что гарантирует синхронный режим, это синхронную доставку транзакции до лога вторичной реплике в момент коммита. Никакого синхронного коммита на вторичную реплику нет.
28 окт 20, 17:51    [22222488]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
msLex,

я о чем и написал - транзакция на первичной не фиксируется, пока не получит сообщение о доставке.

https://docs.microsoft.com/ru-ru/sql/database-engine/availability-groups/windows/availability-modes-always-on-availability-groups?view=sql-server-ver15#SyncCommitAvMode

Как синхронизация работает на вторичной реплике
4. Получив подтверждение от вторичной реплики, первичная реплика завершает обработку фиксации и отправляет клиенту сообщение с подтверждением.


Какому клиенту? Вторичной реплике или SPID?

Сообщение было отредактировано: 28 окт 20, 18:07
28 окт 20, 18:10    [22222508]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Владислав Колосов
msLex,

я о чем и написал - транзакция на первичной не фиксируется, пока не получит сообщение о доставке.

https://docs.microsoft.com/ru-ru/sql/database-engine/availability-groups/windows/availability-modes-always-on-availability-groups?view=sql-server-ver15#SyncCommitAvMode

Как синхронизация работает на вторичной реплике
4. Получив подтверждение от вторичной реплики, первичная реплика завершает обработку фиксации и отправляет клиенту сообщение с подтверждением.
Еще раз. Чтобы на первичной реплике произошел commit, достаточно, чтобы весь лог транзакции попал на вторичные реплики в лог. После этого лог на вторичной реплике может применяться неопределенное и ничем не ограниченное количество времени, и только после того, как лог применится, эти данные можно будет прочитать.

Сообщение было отредактировано: 28 окт 20, 18:10
28 окт 20, 18:14    [22222515]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
Гавриленко Сергей Алексеевич,

а, против этого у меня нет возражений. Восстановление лога как раз может занять время.
28 окт 20, 18:16    [22222516]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
msLex
Member

Откуда:
Сообщений: 8455
Владислав Колосов
Гавриленко Сергей Алексеевич,

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

Из-за чего вот это не верно


Владислав Колосов
после завершения фиксации на первичной реплике на вторичной реплике вы можете читать на ней зафиксированные данные
28 окт 20, 18:22    [22222519]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 627
Гавриленко Сергей Алексеевич
Еще раз. Чтобы на первичной реплике произошел commit, достаточно, чтобы весь лог транзакции попал на вторичные реплики в лог. После этого лог на вторичной реплике может применяться неопределенное и ничем не ограниченное количество времени, и только после того, как лог применится, эти данные можно будет прочитать.


А в чем может быть проблема наката самих данных на вторичной реплике после фиксации записи в журнале транзакций на вторичной реплике?
И вообще, где можно почитать про то, что происходит на вторичной реплике после фиксации транзакции в журнале, как комитятся сами данные?
В BOL нашел только описание процесса до фиксации в журнале транзакций
21 ноя 20, 00:11    [22236285]     Ответить | Цитировать Сообщить модератору
 Re: Always On Синхронный режим  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Oblom
А в чем может быть проблема наката самих данных на вторичной реплике после фиксации записи в журнале транзакций на вторичной реплике?
Не хватает ресурсов, например. Или самый смак -- то, что на первичной реплике меняло в n-дцать потоков, на вторичке применяется в один
Oblom
И вообще, где можно почитать про то, что происходит на вторичной реплике после фиксации транзакции в журнале, как комитятся сами данные?
В BOL нашел только описание процесса до фиксации в журнале транзакций
Идет асинхронный процесс redo, который читает лог, меняет данные в базе реплики в соответствии с тем, что в логе, и делает чекпоинт... если в логе встретит соответствующую команду.

Сообщение было отредактировано: 21 ноя 20, 02:13
21 ноя 20, 02:17    [22236306]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить