Инициализация группы доступности Always On с помощью автоматического заполнения
Область применения: SQL Server
В SQL Server 2016 добавлена функция автоматического заполнения групп доступности. При создании группы доступности с автоматическим заполнением SQL Server автоматически создает вторичные реплики для каждой базы данных в группе. Вам больше не потребуется вручную выполнять операции резервного копирования и восстановления вторичных реплик. Чтобы включить автоматическое заполнение, создайте группу доступности с помощью T-SQL или используйте последнюю версию SQL Server Management Studio.
Дополнительные сведения см. в разделе Автоматическое заполнение для вторичных реплик.
Необходимые компоненты
В SQL Server 2016 для работы автоматического заполнения пути к файлам данных и файлам журналов должны быть одинаковыми на всех экземплярах SQL Server, входящих в группу доступности. В SQL Server 2017 можно использовать разные пути, но корпорация Майкрософт рекомендует использовать одинаковые пути, если все реплики размещаются на одной и той же платформе (например, Windows или Linux). В кроссплатформенных группах доступности используются разные пути для реплик. Дополнительные сведения см. в разделе Разметка диска.
Заполнение группы доступности осуществляется через конечную точку зеркального отображения базы данных. Откройте правила брандмауэра для входящего трафика на порту конечной точки зеркального отображения на каждом сервере.
Базы данных в группе доступности должны использовать модель полного восстановления. База данных должна иметь актуальную полную резервную копию и резервную копию журнала транзакций. Эти файлы резервных копий не используются для автоматического заполнения, но они необходимы до включения базы данных в группу доступности.
Создание группы доступности с помощью автоматического заполнения
Чтобы создать группу доступности с помощью автоматического заполнения, задайте SEEDING_MODE=AUTOMATIC
.
В следующем примере показано создание группы доступности в двухузловом отказоустойчивом кластере Windows Server. Перед запуском сценариев обновите значения для имеющейся среды.
Создайте конечные точки. Каждому серверу необходима конечная точка. В следующем скрипте создается конечная точка, которая использует TCP-порт 5022 для прослушивателя. Задайте
<endpoint_name>
иLISTENER_PORT
в соответствии с окружением и выполните следующий сценарий на обоих серверах.CREATE ENDPOINT [<endpoint_name>] STATE=STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL) FOR DATA_MIRRORING ( ROLE = ALL, AUTHENTICATION = WINDOWS NEGOTIATE, ENCRYPTION = REQUIRED ALGORITHM AES ) GO
Создайте группу доступности. В следующем скрипте создается группа доступности. Обновите значения в угловых скобках
<>
для имени группы, имен серверов и доменных имен и запустите сценарий на первичном экземпляре SQL Server.CREATE AVAILABILITY GROUP [<availability_group_name>] FOR DATABASE db1 REPLICA ON'<*primary_server*>' WITH (ENDPOINT_URL = N'TCP://<primary_server>.<fully_qualified_domain_name>:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), SEEDING_MODE = AUTOMATIC), N'<secondary_server>' WITH (ENDPOINT_URL = N'TCP://<secondary_server>.<fully_qualified_domain_name>:5022', FAILOVER_MODE = AUTOMATIC, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), SEEDING_MODE = AUTOMATIC); GO
Присоедините экземпляр сервера-получателя к группе доступности и предоставьте группе разрешение на создание баз данных. Измените следующий сценарий, указав значения для вашего окружения в угловых скобках
<>
, и запустите этот сценарий на экземпляре вторичной реплики SQL Server.ALTER AVAILABILITY GROUP [<availability_group_name>] JOIN GO ALTER AVAILABILITY GROUP [<availability_group_name>] GRANT CREATE ANY DATABASE GO
SQL Server автоматически создаст реплику базы данных на сервере-получателе. Если размер базы данных слишком велик, синхронизация базы данных займет некоторое время. Если база данных находится в группе доступности, настроенной для автоматического заполнения, можно отправить запрос к системному представлению sys.dm_hadr_automatic_seeding
на отслеживание хода заполнения. Следующий запрос возвращает одну строку для каждой базы данных в группе доступности, настроенной для автоматического заполнения.
SELECT start_time,
ag.name,
db.database_name,
current_state,
performed_seeding,
failure_state,
failure_state_desc
FROM sys.dm_hadr_automatic_seeding autos
JOIN sys.availability_databases_cluster db
ON autos.ag_db_id = db.group_database_id
JOIN sys.availability_groups ag
ON autos.ag_id = ag.group_id
Запрет автоматического заполнения в группе доступности
Чтобы временно запретить первичной реплике заполнение дополнительных баз данных на вторичной реплике, у группы доступности можно отменить разрешение на создание баз данных. Выполните следующий запрос на экземпляре, где размещена вторичная реплика, чтобы запретить группе доступности создавать реплики базы данных.
ALTER AVAILABILITY GROUP [<availability_group_name>]
DENY CREATE ANY DATABASE
GO
Включение автоматического заполнения в существующей группе доступности
Можно задать автоматическое заполнение в существующей базе данных. Следующая команда изменит группу доступности так, чтобы она использовала автоматическое заполнение. Выполните следующую команду на первичной реплике.
ALTER AVAILABILITY GROUP [<availability_group_name>]
MODIFY REPLICA ON '<secondary_node>'
WITH (SEEDING_MODE = AUTOMATIC)
GO
Предыдущая команда принудительно перезапустит заполнение для базы данных при необходимости. Например, если заполнение завершается сбоем из-за нехватки дискового пространства на вторичной реплике, выполните команду ALTER AVAILABILITY GROUP ... WITH (SEEDING_MODE=AUTOMATIC)
, чтобы перезапустить заполнение после пополнения свободного места.
Остановка автоматического заполнения
Чтобы остановить автоматическое заполнение для группы доступности, запустите следующий сценарий на первичной реплике.
ALTER AVAILABILITY GROUP [<availability_group_name>]
MODIFY REPLICA ON '<secondary_node>'
WITH (SEEDING_MODE = MANUAL)
GO
При запуске этого сценария будут отменены все реплики, находящиеся в режиме заполнения, а SQL Server не сможет автоматически инициализировать реплики в этой группе доступности. В то же время синхронизация уже инициализированных реплик остановлена не будет.
Мониторинг автоматического заполнения группы доступности
Использование системных административных представлений для мониторинга заполнения
Следующие системные представления отображают состояние автоматического заполнения SQL Server.
sys.dm_hadr_automatic_seeding
На первичной реплике выполните запрос к sys.dm_hadr_automatic_seeding
для проверки состояния процесса автоматического заполнения. Представление возвращает одну строку для каждого процесса заполнения. Например:
SELECT start_time,
completion_time
is_source,
current_state,
failure_state,
failure_state_desc
FROM sys.dm_hadr_automatic_seeding
sys.dm_hadr_physical_seeding_stats
На первичной реплике выполните запрос к sys.dm_hadr_physical_seeding_stats
DMV для просмотра физической статистики по каждому процессу заполнения, выполняющемуся в данный момент. Следующий запрос возвращает строки во время выполнения заполнения:
SELECT * FROM sys.dm_hadr_physical_seeding_stats;
Для определения узких мест производительности в процессе автоматического заполнения можно использовать два столбца: total_disk_io_wait_time_ms и total_network_wait_time_ms. Эти два столбца также присутствуют в расширенном событии hadr_physical_seeding_progress.
total_disk_io_wait_time_ms представляет время, которое поток резервного копирования или восстановления затрачивает на ожидание ответа диска. Это значение определяется накопительным образом с момента начала операции заполнения. Если диски не готовы для чтения или записи потока резервного копирования, поток резервного копирования или восстановления переходит в спящее состояние и активируется каждую секунду для проверки готовности диска.
total_network_wait_time_ms интерпретируется по-разному для первичной и вторичной реплики. Для первичной реплики значение этого счетчика представляет время управления сетевым потоком. Для вторичной реплики это значение представляет время, в течение которого поток восстановления ожидает доступности сообщения для записи на диск.
Диагностика инициализации базы данных с помощью автоматического заполнения в журнале ошибок
При добавлении базы данных в группу доступности, настроенную для автоматического заполнения, SQL Server выполняет резервное копирование VDI в конечной точке группы доступности. Просмотрите журнал ошибок SQL Server на наличие сведений о завершении резервного копирования и синхронизации.
Диагностика работоспособности уровня базы данных с помощью расширенных событий
Автоматическое заполнение поддерживает новые расширенные события для отслеживания изменения состояния, сбоев и статистики производительности во время инициализации.
Например, этот скрипт создает сеанс расширенных событий, который фиксирует события, связанные с автоматическим заполнением:
CREATE EVENT SESSION [AlwaysOn_autoseed] ON SERVER
ADD EVENT sqlserver.hadr_automatic_seeding_state_transition,
ADD EVENT sqlserver.hadr_automatic_seeding_timeout,
ADD EVENT sqlserver.hadr_db_manager_seeding_request_msg,
ADD EVENT sqlserver.hadr_physical_seeding_backup_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_failure,
ADD EVENT sqlserver.hadr_physical_seeding_forwarder_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_forwarder_target_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_progress,
ADD EVENT sqlserver.hadr_physical_seeding_restore_state_change,
ADD EVENT sqlserver.hadr_physical_seeding_submit_callback
ADD TARGET package0.event_file(
SET filename=N'autoseed.xel',
max_file_size=(5),
max_rollover_files=(4)
)
WITH (
MAX_MEMORY=4096 KB,
EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,
MAX_EVENT_SIZE=0 KB,
MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
)
GO
ALTER EVENT SESSION AlwaysOn_autoseed ON SERVER STATE=START
GO
В таблице ниже перечислены расширенные события, связанные с автоматическим заполнением.
Имя | Описание |
---|---|
hadr_db_manager_seeding_request_msg | Заполнение сообщения запроса. |
hadr_physical_seeding_backup_state_change | Изменение состояния на стороне резервного копирования при физическом заполнении. |
hadr_physical_seeding_restore_state_change | Изменение состояния на стороне восстановления при физическом заполнении. |
hadr_physical_seeding_forwarder_state_change | Изменение состояния на стороне сервера пересылки при физическом заполнении. |
hadr_physical_seeding_forwarder_target_state_change | Изменение состояния на стороне цели сервера пересылки при физическом заполнении. |
hadr_physical_seeding_submit_callback | Событие обратного вызова при фиксации физического заполнения. |
hadr_physical_seeding_failure | Событие сбоя физического заполнения. |
hadr_physical_seeding_progress | Событие хода выполнения физического заполнения. |
hadr_physical_seeding_schedule_long_task_failure | Событие сбоя длительной задачи с расписанием физического заполнения. |
hadr_automatic_seeding_start | Происходит при отправке операции автоматического заполнения. |
hadr_automatic_seeding_state_transition | Происходит при изменении состояния операции автоматического заполнения. |
hadr_automatic_seeding_success | Происходит при успешном выполнении операции автоматического заполнения. |
hadr_automatic_seeding_failure | Происходит при сбое операции автоматического заполнения. |
hadr_automatic_seeding_timeout | Происходит при истечении времени ожидания операции автоматического заполнения. |
Другие замечания по устранению неполадок
Мониторинг автоматического заполнения
Выполните запрос sys.dm_hadr_physical_seeding_stats
о текущих выполняющихся процессах автоматического заполнения. Представление возвращает одну строку для каждой базы данных. Например:
SELECT local_database_name,
role_desc,
internal_state_desc,
transfer_rate_bytes_per_second,
transferred_size_bytes,
database_size_bytes,
start_time_utc,
end_time_utc, estimate_time_complete_utc,
total_disk_io_wait_time_ms,
total_network_wait_time_ms,
is_compression_enabled
FROM sys.dm_hadr_physical_seeding_stats
Устранение неполадок, связанных с ошибкой отображения базы данных в группе доступности, настроенной для автоматического заполнения
Если база данных не отображается в составе группы доступности с включенным автоматическим заполнением, скорее всего, произошел сбой автоматического заполнения. Это делает невозможным добавление базы данных в группу доступности на первичной или вторичной репликах. Выполните запрос sys.dm_hadr_automatic_seeding
на первичной и вторичной репликах. Например, выполните следующий запрос, чтобы определить состояние сбоя автоматического заполнения.
SELECT start_time,
completion_time,
is_source,
current_state,
failure_state,
failure_state_desc,
error_code
FROM sys.dm_hadr_automatic_seeding
Автоматическое заполнение и вопросы производительности
SQL Server использует фиксированное количество потоков для автоматического заполнения. На первичном экземпляре SQL Server использует один поток на каждый LUN для считывания изменений. На вторичном экземпляре SQL Server использует один поток на каждый LUN для инициализации базы данных.
Установите флаг трассировки 9567 на первичной реплике для включения сжатия потока данных во время автоматического заполнения. Это позволит значительно сократить время передачи автоматического заполнения, но приведет к увеличению загрузки ЦП. Дополнительные сведения см. в разделе Tune compression for availability group(Настройка сжатия для группы доступности).
Когда не следует использовать автоматическое заполнение
В некоторых случаях автоматическое заполнение может оказаться неоптимальным решением для инициализации вторичной реплики. Во время автоматического заполнения SQL Server выполняет резервное копирование по сети для инициализации. Этот процесс может быть медленным, если размер баз данных слишком велик или вторичная реплика является удаленной. В ходе резервного копирования нельзя усекать журнал транзакций для этих баз данных, поэтому длительная инициализация в базе данных может привести к значительному увеличению размера журнала транзакций. Перед добавлением базы данных в группу доступности с помощью автоматического заполнения нужно оценить размер базы данных, объем загрузки и расстояние между репликами.