Улучшение репликации - улучшенная очистка базы данных распространения

Tags: базы данных, database, SQL Server 2017, репликация

Репликационная база данных распространения - это, пожалуй, самый важный объект во всей топологии репликации. Помимо хранения метаданных репликации и истории для агентов репликации, база данных распространения в случае транзакционной репликации также предоставляет промежуточное хранилище для транзакций и команд, которые будут отправлены подписчикам. Эти транзакции и команды хранятся в таблицах MSRepl_Transactions и MSRepl_Commands. В топологии транзакционной репликации, которая включает в себя высокоактивную базу данных Publisher (и Publication), то есть публикатора с большим количеством транзакций в секунду, таблицы MSRepl_Commands и MSRepl_Transactions в базе данных распространения могут значительно увеличиться.

Задание Distribution Cleanup, которое выполняется каждые 10 минут на сервере дистрибьютора, отвечает за очистку транзакций и команд на основе указанного периода хранения транзакции, который по умолчанию составляет 72 часа. Кроме того, работа по очистке распределения также выполняет очистку просроченных подписей на дистрибьюторе, что является дорогостоящей операцией, особенно с учетом того, что она работает каждые 10 минут.

ПРИМЕЧАНИЕ. Если одна и та же база данных публикаций имеет несколько публикаций с транзакциями или снимками, а агенты распространения для этих публикаций настроены на запуск с различными интервалами (например, один из них настроен на еженедельный запуск, второй - на ежедневный, а третий - непрерывная работа), возможно, что очистка не удалит данные, чей срок жизни превышает 72 часа. Это происходит из-за того, что Distribution Cleanup вычисляет @max_cleanup_xact_seqno на основе базы данных Publisher, а не отдельных агентов распространения для публикаций в этой базе данных издателя.

В случае высокой активности среды задание очистки должно будет удалить существенно большой набор истекших транзакций и команд. В задании очистки используется цикл while для удаления записей из MSRepl_Commands и MSRepl_Transactions в партиях 2000 и 5000 строк, соответственно. В зависимости от того, насколько велики таблицы MSRepl_Commands и MSRepl_Transactions, деятельность по очистке может быть громоздкой и трудоемкой, что приводит к нескольким проблемам производительности, таким как блокировка блокировки и иногда сбои агента репликации. Эти жестко закодированные размеры пакетов работают хорошо, когда размер таблиц репликации мал, но плохо выполняются, когда эти таблицы репликации становятся большими, скажем, как 200-300 миллионов строк.

Новая реализация процедуры позволяет пользователям параметризовать размеры пакетов внутри хранимой процедуры очистки и вводит новый адаптивный подход для определения размеров пакетов для каждой итерации.

Эта процедура будет по умолчанию отмечать любые размеры пакетов, которые явно указаны в качестве параметров. Если параметры не заданы, тогда процедура начнется с размеров пакетов по умолчанию из 2000 и 5000 строк и увеличения / уменьшения размеров пакетов в зависимости от производительности предыдущей итерации операции удаления. Если время, затрачиваемое на запрос удаления, увеличивается на 50% по сравнению с предыдущим исполнением, значение размера пакета увеличивается на 20% до максимального значения 50000 строк на пакет, а если эффективность операции удаления уменьшается на 20%, по сравнению с предыдущей итерацией размер пакета уменьшается на 50% до значения по умолчанию 2000/5000 строк для каждого пакета для MSReplCommands и MSRepl_Transactions соответственно.

Новая реализация также отделяет задачу очистки подписки от основной работы по очистке рассылки, переместив очистку подписки на задание очистки Expired Subscription, которое выполняется у публикатора. Задание очистки Expired Subscription, которая выполняется один раз в день, устанавливает соединение с сервером базы данных распространения для выполнения хранимой процедуры подписки на очистку.

Наконец, в старой версии задание очистки сообщает количество строк на основе последней итерации цикла while, а не кумулятивные значения для удаленных строк. Это было изменено, чтобы накапливать и сообщать о совокупных числах. Кроме того, скорость очистки, отображаемая в сообщении, была изменена с “строк в секунду” на “строк в миллисекунду”, поскольку это обеспечивает более точную скорость. Например, если прошедшее время меньше секунды, существующая процедура сообщает, что 0 записей удаляются за 0 секунд. Это было изменено так, что мы увидели бы что-то вроде «n» записей, удаленных за «m» миллисекунд.

Чтобы поддержать улучшение, в хранимую процедуру sp_adddistributiondb, было добавлено два параметра @deletebatchsize_xact и @deletebatchsize_cmd. Эти параметры управляют размерами пакета удаления для таблиц MSRepl_Transactions и MSRepl_Commands соответственно. Кроме того, SSMS была обновлена для поддержки изменений.

Это улучшение было впервые выпущено в SQL Server 2017, а затем было добавлено в SQL Server 2012 SP4 и SQL Server 2016 SP2. Оно будет доступно в следующей версии обслуживания для SQL Server 2014.



No Comments

Add a Comment