Репликация, отслеживание изменений, изменение данных в группах доступности AlwaysOn
Область применения: SQL Server
Репликация SQL Server, сбор измененных данных (CDC) и отслеживание изменений (CT) поддерживаются в группах доступности AlwaysOn. Группы доступности AlwaysOn помогают обеспечить высокий уровень доступности и другие возможности восстановления базы данных.
Общие сведения о репликации с группами доступности
Перенаправление издателя
Когда опубликованная база данных знает о группах доступности AlwaysOn, распространитель, предоставляющий доступ агента к базе данных публикации, настраивается с redirected_publishers записями. Эти записи перенаправляют первоначально настроенные пары «издатель-база данных», позволяя при соединении издателя с базой данных публикации указывать имя прослушивателя группы доступности. Соединения, установленные по именам прослушивателей группы доступности, будут разорваны при отработке отказа. Но после перезапуска агента репликации и отработки отказа соединение будет автоматически перенаправлено на новую базу данных-источник.
В группе доступности база данных-получатель не может быть издателем. Повторная публикация поддерживается только при сочетании репликации транзакций с группами доступности AlwaysOn.
Если опубликованная база данных является членом группы доступности, а издатель перенаправляется, то он должен перенаправляться на имя прослушивателя группы доступности, связанное с группой доступности. Он не может быть перенаправлен на отдельный узел.
Примечание.
После отработки отказа на вторичную реплику монитор репликации не может изменить имя экземпляра публикации SQL Server и будет продолжать отображать сведения о репликации под именем исходного первичного экземпляра SQL Server. После отработки отказа нельзя ввести трассировочный токен с помощью монитора репликации, но трассировочный токен, введенный в новый издатель с помощью Transact-SQL, отображается в мониторе репликации.
Общие изменения агентов репликации для поддержки групп доступности
Три агента репликации были изменены для поддержки групп доступности AlwaysOn. Агенты средства чтения журналов, моментального снимка и слияния теперь опрашивают базу данных распространителя на наличие перенаправленного издателя и используют возвращенное имя прослушивателя группы доступности, если был объявлен перенаправленный издатель, для соединения с издателем базы данных.
Если по умолчанию агенты направляют запрос к распространителю, чтобы определить, был ли перенаправлен исходный издатель, то соответствие текущей цели или перенаправления будет проверено до возврата перенаправленного сервера агенту. Рекомендуется использовать именно такое поведение. Но если запуск агента происходит часто, то связанная с хранимой процедурой проверки нагрузка может отнимать слишком много ресурсов. В агенты чтения журнала, моментальных снимков и слияния добавлен новый параметр командной строки BypassPublisherValidation. Если указан этот параметр, то перенаправляемый издатель сразу возвращается агенту, при этом хранимая процедура проверки не выполняется.
Ошибки, возвращаемые хранимыми процедурами проверки, записываются в журналы агента. Ошибки с уровнем серьезности 16 и выше приводят к прекращению работы агента. Агенты имеют специальное средство повтора, которое позволяет им обрабатывать отключение от опубликованной базы данных, когда она перемещается на новый первичный источник.
Изменения в агенте чтения журнала
В агент чтения журналов внесены следующие изменения.
Согласованность реплицированной базы данных
Когда опубликованная база данных является членом группы доступности, средство чтения журналов по умолчанию не будет обрабатывать записи журнала, которые еще не были записаны на диск во всех вторичных репликах группы доступности. Это гарантирует, что при отработке отказа все строки, реплицированные на подписчик, также будут присутствовать в новой базе данных-источнике.
Если у издателя есть только две реплики доступности (одна первичная и одна вторичная) и происходит отработка отказа, исходная первичная реплика останется в отключенном состоянии, так как модуль чтения журналов не переместится вперед до тех пор, пока все базы данных-получатели не будут вновь в сети или отказавшие вторичные реплики не будут удалены из группы доступности. Модуль чтения журналов, работающий теперь с базой данных-получателем, не будет перемещаться вперед, так как состояние Always On не может фиксировать изменения в базе данных-получателе. Чтобы разрешить модулю чтения журналов переместиться вперед и сохранить возможность аварийного восстановления, удалите исходную первичную реплику из группы доступности с помощью инструкции ALTER AVAILABITY GROUP <имя_группы> REMOVE REPLICA. Затем добавьте новую вторичную реплику к группе доступности.
Флаг трассировки 1448
Флаг трассировки 1448 разрешает средству чтения журнала репликации перемещаться вперед даже в том случае, если асинхронные вторичные реплики не подтвердили получение изменения. Даже если этот флаг трассировки включен, средство чтения журнала всегда ожидает синхронные вторичные реплики (они могут использоваться в режиме асинхронной фиксации, как описано здесь, так что средство чтения журнала может продолжать работу). Средство чтения журнала не будет превышать минимальное время ожидания для синхронных вторичных реплик. Этот флаг трассировки применяется к экземпляру SQL Server, а не только к группе доступности, базе данных доступности или экземпляру средства чтения журналов. Этот флаг трассировки вступает в силу немедленно, без перезагрузки. Он не может быть активирован раньше времени или при сбое асинхронной вторичной реплики.
Хранимые процедуры, поддерживающие группы доступности
sp_redirect_publisher
Хранимая процедура sp_redirect_publisher служит для указания перенаправленного издателя для существующей пары "издатель-база данных". Если база данных издателя входит в группу доступности, то перенаправленный издатель — это имя прослушивателя группы доступности.
sp_get_redirected_publisher
Хранимая процедура sp_get_redirected_publisher используется агентами репликации для опроса распространителя и определения наличия для пары "издатель-база данных" заданного перенаправленного издателя. Эта хранимая процедура служит двум целям. Во-первых, она позволяет агенту определить, был ли перенаправлен исходный издатель. Во-вторых, она может также инициировать вызов хранимой процедуры проверки на распространителе (sp_validate_redirected_publisher), которая выполняет проверку пригодности целевого узла перенаправления для использования в качестве издателя указанной базы данных.
Для выполнения этой хранимой процедуры необходимо членство в роли сервера sysadmin , роли базы данных db_owner распространителя или в списке доступа к публикации для конкретной публикации, связанной с базой данных издателя.
sp_validate_redirected_publisher
Эта хранимая процедура пытается проверить, что текущий издатель способен к размещению опубликованной базы данных. Ее можно вызвать в любое время, чтобы проверить, способен ли текущий узел поддерживать репликацию.
sp_validate_replicate_hosts_as_publishers
В то время как для агентов полезно убедиться в том, что текущая база данных-источник может функционировать в качестве издателя репликации для базы данных издателя, для установки действительности всей топологии репликации в базе данных доступности AlwaysOn необходима возможность более общей проверки. Хранимая процедура sp_validate_replica_hosts_as_publishers предназначена для выполнения этой задачи.
Эта хранимая процедура всегда запускается вручную. Для вызова этой процедуры необходимо членство в роли sysadmin на распространителе, роли dbowner базы данных распространителя или в списке доступа к публикации для публикации базы данных издателя. Кроме того, имя входа вызывающего должно быть действительным именем входа для всех узлов реплик доступности и обладать особыми правами для базы данных доступности, связанной с базой данных издателя.
Система отслеживания измененных данных
Базы данных, включенные для отслеживания измененных данных (CDC), могут использовать группы доступности AlwaysOn, чтобы гарантировать, что база данных остается доступной в случае сбоя, но изменения в таблицах баз данных продолжают отслеживаться и откладываться в таблицах изменений CDC. Порядок настройки групп доступности CDC и AlwaysOn не важен. Базы данных с поддержкой CDC можно добавить в группы доступности AlwaysOn, а базы данных, которые являются членами группы доступности AlwaysOn, можно включить для CDC. В обоих случаях настройка CDC всегда выполняется в текущей или целевой первичной реплике. CDC использует агент чтения журнала и имеет те же ограничения, которые были описаны в подразделе Изменения в агенте чтения журнала ранее в этом разделе.
Система отслеживания измененных данных без репликации
Если в базе данных включена функция захвата изменений данных, однако не предусмотрена ее репликация, процесс захвата, используемый для сбора изменений из журнала и их сохранения в таблицах изменений CDC, работает на узле CDC в качестве собственного задания агента SQL.
Чтобы возобновить сбор изменений после отработки отказа, хранимую процедуру sp_cdc_add_job необходимо запустить в новой базе данных-источнике и создать локальное задание отслеживания.
В следующем примере создается задание отслеживания.
EXEC sys.sp_cdc_add_job @job_type = 'capture';
Система отслеживания измененных данных с репликацией
Если для базы данных включены функции репликации и отслеживания изменений данных, средство чтения журнала выполняет процесс заполнения таблиц изменений CDC. В этом случае методы, используемые репликацией для использования групп доступности AlwaysOn, гарантируют, что изменения продолжают собираться из журнала и помещаются в таблицы изменений CDC после отработки отказа. Для CDC в этой конфигурации больше ничего делать не нужно, чтобы обеспечить заполнение таблиц изменений.
Очистка системы отслеживания измененных данных
Чтобы обеспечить соответствующую очистку в новой базе данных-источнике, необходимо также создать локальное задание очистки. В следующем примере создается задание очистки.
EXEC sys.sp_cdc_add_job @job_type = 'cleanup';
Примечание.
После отработки отказа следует создать задания в новой первичной реплике. Задания CDC, запущенные в старой базе данных-источнике, должны быть отключены, когда локальная база данных становится базой данных-получателем. Если после этого реплика снова станет первичной, необходимо повторно включить задания CDC в реплике. Для включения и отключения заданий используйте параметр @enabled процедуры sp_update_job (Transact-SQL). Дополнительные сведения о создании заданий CDC см. в статье sys.sp_cdc_add_job (Transact-SQL).
Добавление ролей CDC для первичной реплики базы данных AlwaysOn
Если для CDC включена таблица, то можно связать роль базы данных с экземпляром отслеживания. Если указана роль, то пользователь, который будет использовать функции с табличным значением CDC для доступа к изменениям, должен иметь не только права доступа к столбцам отслеживаемой таблицы, но и быть членом именованной роли. Если указанная роль еще не существует, то она будет создана. Если роли баз данных автоматически добавляются в базу данных-источник AlwaysOn, то роли также добавляются в базы данных-получатели группы доступности.
Клиентские приложения, использующие информацию об изменениях CDC и режим Always On
Клиентским приложениям, которые вызывают функции с табличными значениями или обращаются к связанным серверам, для доступа к данным таблицы изменений также необходима возможность обнаружения соответствующего CDC-хоста после отработки отказа. Имя прослушивателя группы доступности — это механизм, предоставляемый группами доступности AlwaysOn, чтобы прозрачно разрешить перенацеливать подключение на другой узел. Как только имя прослушивателя группы доступности связано с группой доступности, оно становится доступным для строк подключения TCP. Через имя прослушивателя группы доступности поддерживаются два разных сценария соединений.
Один гарантирует, чтобы запросы на соединение всегда направлялись на активную первичную реплику.
Второй — чтобы запросы на соединение направлялись на вторичную реплику только для чтения.
При использовании для поиска вторичной реплики в режиме только для чтения необходимо определить список маршрутизации для группы доступности. Дополнительные сведения см. ниже в подразделе Настройка реплик доступности для маршрутизации только для чтения.
Примечание.
Существует задержка распространения, связанная с созданием имени прослушивателя группы доступности и его использованием клиентскими приложениями для доступа к реплике базы данных группы доступности.
Воспользуйтесь следующим запросом, чтобы определить, было ли имя прослушивателя группы доступности определено для размещения CDC-базы данных группой доступности. Запрос возвращает имя прослушивателя группы доступности, если оно уже создано.
SELECT dns_name FROM sys.availability_group_listeners AS l INNER JOIN sys.availability_databases_cluster AS d ON l.group_id = d.group_id WHERE d.database_name = N'MyCDCDB';
Перенаправление нагрузки по запросам на вторичные реплики для чтения
Хотя во многих случаях клиентское приложение всегда хочет подключиться к текущей первичной реплике, это не единственный способ использовать группы доступности AlwaysOn. Если группа доступности определяется с доступными для чтения репликами-получателями, то информацию об изменениях также можно собирать с вторичных узлов.
Во время настройки группы доступности атрибут ALLOW_CONNECTIONS, связанный с SECONDARY_ROLE, используется для указания типа поддерживаемого вторичного доступа. При настройке с параметром ALL все соединения с получателем будут разрешены, но лишь подключения с доступом только для чтения будут завершаться успешно. При настройке с параметром READ_ONLY необходимо указать цель только для чтения при соединении с базой данных-получателем, чтобы соединение завершилось успешно. Дополнительные сведения см. в разделе Настройка доступа только для чтения в реплике доступности (SQL Server).
Чтобы определить, требуется ли намерение только для чтения для подключения к вторичной реплике, доступной для чтения, воспользуйтесь следующим запросом.
SELECT g.name AS AG, replica_server_name, secondary_role_allow_connections_desc FROM sys.availability_replicas AS r JOIN sys.availability_groups AS g ON r.group_id = g.group_id WHERE g.name = N'MY_AG_NAME';
Для поиска вторичной реплики можно использовать имя прослушивателя группы доступности или явное имя узла. Если используется имя прослушивателя группы доступности, то доступ будет перенаправлен любой подходящей вторичной реплике.
При использовании параметра sp_addlinkedserver для создания связанного сервера и доступа к получателю в параметре @datasrc указывается имя прослушивателя группы доступности или явное имя сервера, а в параметре @provstr — намерение только для чтения.
EXEC sp_addlinkedserver @server = N'linked_svr', @srvproduct=N'SqlServer', @provider=N'MSOLEDBSQL', @datasrc=N'AG_Listener_Name', @provstr=N'ApplicationIntent=ReadOnly', @catalog=N'MY_DB_NAME';
Клиентский доступ к информации об изменениях CDC и доменным именам входа
Рекомендуется использовать доменные имена входа для клиентского доступа к информации об изменениях в базах данных, которые являются членами групп доступности AlwaysOn. Чтобы обеспечить непрерывный доступ к информации об изменениях после отработки отказа, пользователь домена должен иметь привилегии доступа на всех узлах, поддерживающих реплики в группе доступности. Если пользователь базы данных добавляется в базу данных первичной реплики и пользователь связан с доменным именем входа, пользователь базы данных распространяется на базу данных-получателя и продолжает быть связанным с указанным доменным именем входа. Если новый пользователь базы данных связан с именем входа SQL Server, пользователь базы данных-получателя будет распространен без имени входа. Хотя связанное имя входа проверки подлинности SQL Server может использоваться для доступа к данным об изменениях в основном месте, где пользователь базы данных был первоначально определен, этот узел является единственным, где будет возможен доступ. Имя входа проверки подлинности SQL Server не сможет получить доступ к данным из любой базы данных-получателя, а также из новых баз данных-источника, отличных от исходной базы данных, в которой был определен пользователь базы данных.
Отключение системы отслеживания измененных данных
Если вам нужно отключить запись измененных данных (CDC) в базе данных, которая входит в группу доступности AlwaysOn, и вы находитесь в SQL Server 2016 с пакетом обновления 2 (SP2 ) или более поздней версии, вам не нужно выполнять никаких дополнительных действий для автоматического усечения журнала. Если вы используете более раннюю версию, чем SQL Server 2016 с пакетом обновления 2 (SP2) и отключите CDC в базе данных, которая является частью группы доступности, необходимо выполнить одно из следующих действий, чтобы предотвратить блокировку усечения журнала после отключения CDC:- Перезапустите службу SQL Server на каждом экземпляре вторичной реплики.
- Удалите базу данных из всех экземпляров вторичной реплики группы доступности, а затем добавьте ее обратно в каждый экземпляр реплики группы доступности с помощью автоматического или ручного заполнения.
Отслеживание изменений
Базы данных с включенной функцией отслеживания изменений могут быть частью группы доступности AlwaysOn. Дополнительная настройка не требуется. Клиентские приложения по отслеживанию изменений, использующие функции с табличными значениями (возвращающие табличное значение функции) или связанные серверы, для доступа к данным таблицы изменений также требуют возможность обнаружения первичной реплики после отработки отказа. Если клиентское приложение подключается посредством имени прослушивателя группы доступности, запросы на соединение всегда направляются на текущую первичную реплику.
Примечание.
Данные отслеживания изменений должны получаться из первичной реплики. Попытка доступа к информации об изменениях из вторичной реплики приведет к следующей ошибке.
Сообщение 22117, уровень 16, состояние 1, строка 1
Для баз данных, которые являются членами вторичной реплики (то есть баз данных-получателей), отслеживание изменений не поддерживается. Вместо выполнения запросов отслеживания изменений в первичной реплике вы можете создать моментальный снимок базы данных группы доступности из вторичной реплики и использовать его для запросов данных об изменениях. Моментальный снимок базы данных является статическим и доступным только для чтения представлением базы данных SQL Server (базы данных-источника), поэтому данные об отслеживании изменений в нем будут отражать тот момент, когда этот моментальный снимок был создан для базы данных группы доступности из вторичной реплики.
Примечание.
Если отработка отказа выполняется в базе данных с включенной Отслеживание изменений, время восстановления новой первичной реплики может занять больше времени, чем обычно, так как Отслеживание изменений требует полного перезапуска базы данных.
Условия, ограничения и вопросы использования репликации
В этом разделе описываются рекомендации по развертыванию репликации с помощью групп доступности AlwaysOn, включая предварительные требования, ограничения и рекомендации.
Необходимые компоненты
При использовании репликации транзакций и базы данных публикации в группе доступности издатель и распространитель должны запускать по крайней мере SQL Server 2012 (11.x). Подписчик может использовать более низкий уровень SQL Server.
При использовании репликации слиянием и базы данных публикации в группе доступности:
Push-подписка: издатель и распространитель должны запускать по крайней мере SQL Server 2012 (11.x).
Подписка по запросу: издатель, распространитель и базы данных подписчиков должны находиться по крайней мере в SQL Server 2012 (11.x). Это связано с тем, что агент слияния на подписчике должен иметь сведения о том, как группа доступности может выполнить отработку отказа на базу данных-получатель.
Экземпляры издателя должны удовлетворять всем предварительным условиям, необходимым для участия в группе доступности AlwaysOn. Дополнительные сведения см. в статье Предварительные требования, ограничения и рекомендации для групп доступности Always On (SQL Server).
Ограничения
Поддерживаемые сочетания репликации в группах доступности AlwaysOn:
Репликация | Publisher | Распространитель1 | Подписчик |
---|---|---|---|
Транзакций | Да Примечание. Не включает поддержку двунаправленной и возвратной репликации транзакций. |
Да | Да |
Одноранговая сеть2 | Да | Да3 | Да |
Слияние | Да | No | No |
Моментальный снимок | Да | No | Да |
Обновляемые подписки для репликации транзакций | No | No | No |
1 База данных распространителя не поддерживается для использования с зеркальным отображением базы данных.
2 Требуется SQL Server 2019 CU13 и выше.
Для 3 требуется SQL Server 2019 CU 17 или более поздней версии.
Рекомендации
База данных распространителя не поддерживается для использования с зеркальным отображением базы данных, но поддерживается с группами доступности AlwaysOn с определенными ограничениями, см . раздел "Настройка группы доступности распространения". Конфигурация репликации работает совместно с экземпляром SQL Server, на котором настроен распространитель. Именно по этой причине база данных распространителя не может участвовать в репликации или зеркальном отображении. Чтобы обеспечить высокий уровень доступности для распространителя, можно также использовать отказоустойчивый кластер SQL Server. Дополнительные сведения см. в статье Экземпляры отказоустойчивого кластера AlwaysOn (SQL Server).
Отработка отказа подписчика в базу данных-получатель — это ручная процедура для объединения подписчиков репликации. Процедура, по существу, идентична методу, используемому для переключения на зеркальную базу данных подписчика. Подписчики репликации транзакций не нуждаются в специальной обработке при участии в группах доступности AlwaysOn. Подписчики должны работать под управлением SQL Server 2012 (11.x) или более поздней версии для участия в группе доступности. Дополнительные сведения см. в разделе Подписчики репликации и группы доступности AlwaysOn (SQL Server)
Метаданные и объекты, которые существуют за пределами базы данных, не распространяются на вторичные реплики. Это касается имен входа, заданий, связанных серверов и так далее. Если после отработки отказа в базе данных-источнике нужны метаданные и объекты, их необходимо скопировать вручную. Подробные сведения см. в статье Управление именами входа для заданий, использующих базы данных в группе доступности Always On.
Распределенные группы доступности
База данных издателя или база данных распространителя в группе доступности не может быть настроена в составе распределенной группы доступности. Для правильной настройки и использования базе данных издателя в группе доступности и базе данных распространителя в группе доступности требуется конечная точка прослушивателя. При этом невозможно настроить конечную точку прослушивателя для распределенной группы доступности.
Связанные задачи
Репликация
Запись измененных данных
Включение и отключение отслеживания измененных данных (SQL Server)
Администрирование и мониторинг отслеживания измененных данных (SQL Server)
Отслеживание изменений
См. также
Подписчики репликации и группы доступности AlwaysOn (SQL Server)
Предварительные требования, ограничения и рекомендации для групп доступности AlwaysOn (SQL Server)
Обзор групп доступности Always On (SQL Server)
Группы доступности Always On: взаимодействие (SQL Server)
Экземпляры отказоустойчивого кластера AlwaysOn (SQL Server)
Отслеживание измененных данных (SQL Server)
Сведения о Отслеживание изменений (SQL Server)
Репликация SQL Server
Отслеживание изменений данных (SQL Server)
sys.sp_cdc_add_job (Transact-SQL)