Это вопрос, который пришёл по электронной почте от бывшего студента, и я резюмирую его так: каковы семантика усечения журнала в распределённой группе доступности?
Поскольку я не эксперт по группам доступности (я просто знаю достаточно, чтобы быть опасным, ха-ха), я попросил Джонатана подключиться, так как он определённо эксперт по группам доступности! Я буду сокращать до AG термин группа доступности и DAG для распределённой группы доступности в объяснении ниже. Для предстоящего обсуждения неважно, имеют ли рассматриваемые AG синхронные или асинхронные реплики.
Усечение журнала (пометка возможно нескольких VLF как доступных для повторного использования) может пометить VLF как пригодный для повторного использования только в том случае, если ничто не может нуждаться в использовании каких-либо записей журнала в этом VLF. Примером из множества вещей, которые могут нуждаться в записи журнала, является транзакция, которая ещё не зафиксирована (потому что она может откатиться) — если запись журнала будет потеряна из-за перезаписи при повторном использовании VLF, транзакция не сможет откатиться.
В простой AG, с первичной репликой и вторичной репликой, VLF на первичной реплике может быть помечен для повторного использования только после того, как этот VLF будет зафиксирован на диске (записан на диск журнала) на первичной реплике и зафиксирован на диске на вторичной реплике, а затем сохранён в резервной копии на одной из реплик. (Обратите внимание, что фиксация на диске на вторичной реплике НЕ означает, что записи журнала должны быть воспроизведены с REDO, а только то, что они были записаны на диск — это распространённое заблуждение как в AG, так и в зеркальном отображении базы данных).
С DAG всё немного сложнее.
Представьте, что у нас есть DAG от AG1 к AG2. AG1 имеет первичную реплику и вторичную реплику. AG2 имеет первичную реплику и вторичную реплику. Первичная реплика AG2 по сути является ещё одной вторичной репликой AG1 и функционирует как пересыльщик журнала для своей собственной вторичной реплики. Можно думать о DAG как об AG из AG.
Итак, журнал передаётся следующим образом:
- Первичная реплика AG1 -> Вторичная реплика AG1
- Первичная реплика AG1 -> Первичная реплика AG2 -> Вторичная реплика AG2
Из моего простого примера с AG выше можно было бы подумать, что VLF на первичной реплике AG1 может быть помечен для повторного использования, как только этот VLF будет зафиксирован на диске на первичной реплике, зафиксирован на диске на вторичной реплике AG1, зафиксирован на диске на первичной реплике AG2, а затем сохранён в резервной копии на любой реплике AG1.
Но это не так. Есть дополнительный нюанс.
VLF на первичной реплике AG2 не может быть помечен для повторного использования до тех пор, пока этот VLF не будет зафиксирован на диске на вторичной реплике AG2. Если этот VLF не может быть помечен для повторного использования на первичной реплике AG2, то он не может быть помечен для повторного использования на первичной реплике AG1. И поэтому журнал на первичной реплике может вырасти.
Итог: в DAG VLF в первичной реплике AG1 не может быть помечен для повторного использования до тех пор, пока он не будет зафиксирован на диске на своих собственных вторичных репликах и на всех других вторичных репликах в топологии DAG (а затем сохранён в резервной копии где-нибудь в AG1). Это просто расширение обычной семантики очистки журнала в AG.

Комментариев нет:
Отправить комментарий