7.7. Точки синхронизации и последовательное резервное копирование
Чтобы обеспечить согласованность двоичного резервного копирования кластера, Shardman реализует механизм точек синхронизации.
Для достижения согласованной видимости распределённых транзакций используется метод глобальных снимков на основе физических часов. Точно так же можно получить согласованный снимок для резервных копий, при этом время, соответствующее глобальному снимку, должно быть сопоставлено с набором LSN
для каждого узла. Такой набор согласованных LSN в кластере называется точкой синхронизации.
В кластере Shardman каждый узел может генерировать свой собственный независимый локальный CSN, что не гарантирует глобального упорядочения значений по времени. Поэтому нельзя взять этот произвольный локальный CSN в качестве основы для точки синхронизации. Вместо этого Shardman в качестве основы для точки синхронизации выбирает только те CSN, которые соответствуют записям фиксации распределённых транзакций. Эти CSN обладают свойством глобального упорядочения и могут использоваться для получения точки синхронизации. Основные особенности этого механизма описаны ниже.
Запись фиксации каждой завершённой транзакции в Shardman содержит назначенный CSN
для этой транзакции. Это значение вместе с LSN
этой записи образует пару значений (CSN, LSN)
. Каждый из узлов кластера хранит определённое количество таких пар в оперативной памяти в специальной структуре — карте CSNLSNMap
. CSNLSNMap
— это кольцевой буфер. Каждый элемент карты представляет собой пару (CSN, LSN)
. Размер карты задаётся параметрами конфигурации csn_lsn_map_size. Пара (CSN, LSN)
может быть добавлена в карту, только если на узле нет транзакций, которые могут получить CSN меньше добавленного. Это важное условие гарантирует монотонный рост CSN и LSN в CSNLSNmap, но не гарантирует, что каждая запись фиксации попадёт в карту.
Когда пользователь отправляет запрос на создание точки синхронизации, в каждой CSNLSNMap
выполняется поиск максимально возможного CSNg
, для которого есть запись (CSN n, LSN)
в каждом узле и условие CSNn <= CSNg верно. Свойство монотонного роста каждой CSNLSNMap
гарантирует, что каждая найденная пара (CSNn, LSN)
соответствует состоянию глобальных данных в момент времени, соответствующий CSNg
. Если такое значение CSNg
не найдено, операция получения точки синхронизации завершится ошибкой и может быть повторена позже. Если такое значение CSNg
найдено, то точка синхронизации генерируется в виде особого типа записи WAL
, которая дублируется на всех узлах кластера.
Получив точку синхронизации и взяв из неё LSN для каждого узла в кластере, можно сделать резервную копию каждого узла, которая обязательно должна содержать этот LSN
. Также можно восстановить этот LSN, используя механизм восстановления на момент времени (PITR).