Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Дано: Источник - Приемник , транзакционная репликация(поин то поинт). Необходимо обеспечить минимальное отставание в данных при приемника относительно источника. Транзакционная репликация предполагает строгий порядок применения транзакций. В лоб многопоточную загрузку данных не применить, нужно писать координатор, сортировщик и т.д и т.п.

Обсуждаю с коллегами вопрос относительно доработки многопоточной загрузки(применения данных на приемнике) данных для транзакционной репликации. Понятно что плюсы всего этого значительное ускорение за счет многопоточной загрузки данных.(есть варианты даже для систем с естественным низким уровнем параллелизма) Но возникает вопрос, а нужно ли это кому либо , есть ли вообще такие потоки данных? Понятно один из кейсов когда были простои и накопились большие очереди. Ну а кроме этого в обычном режиме бывает ли так, что один поток не справляется с загрузкой из источника в приемник? То есть по сути в одной системе многопоточно пишут данные , но пишут их в транзакциях с чтениями(то есть не непрерывно, биллинг не в счет) и не всегда многопоточно а с другой стороны агент из очереди непрерывно в один поток применяет данные на приемнике.
21 ноя 19, 12:59    [22021675]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7771
МуМу,

скорость канала передачи данных закончится намного раньше, чем скорость записи на диск.
21 ноя 19, 13:37    [22021720]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
invm
Member

Откуда: Москва
Сообщений: 9350
https://docs.microsoft.com/en-us/sql/relational-databases/replication/agents/replication-distribution-agent?view=sql-server-ver15
-SubscriptionStreams [0|1|2|...64]
Is the number of connections allowed per Distribution Agent to apply batches of changes in parallel to a Subscriber, while maintaining many of the transactional characteristics present when using a single thread.
21 ноя 19, 13:44    [22021730]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50855
МуМу
Понятно что плюсы всего этого значительное ускорение за счет многопоточной загрузки данных.

какая наивность... В реальности даже этого плюса нет. Ну и минусы с лихвой его перекрывают.
21 ноя 19, 14:45    [22021806]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Dimitry Sibiryakov, а если конкретней?
21 ноя 19, 18:04    [22022051]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
invm, ну че то там написано, про потоки:) Как они обеспечивают последовательность применения версий при многопоточности? Надо видимо развернуть завтра и самому проверить, раньше точно не было.
21 ноя 19, 18:05    [22022053]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Владислав Колосов, область применения в локальных сетях с хорошими каналами, сеть точно не станет узким местом. Приведу сразу пример - возможность итерационной обрезки БД, обслуживание индексов и статистик на реплике с последующим переключением.(и да я знаю про индексы онлайн и т.п.)
21 ноя 19, 18:08    [22022056]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50855
МуМу
а если конкретней?

Масштабирование производительности при увеличении числа коннектов нелинейно. Оно заканчивается на считанных единицах. А вот минусы - именно то нарушение последовательности транзакции о котором ты спрашиваешь.
22 ноя 19, 14:36    [22022851]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Хм, неужели все так грустно. Для своей репликации мы уже написали. По сути необходим координатор сортировщик.Концептуально нужно в транзакциях проверять ключи на пересечение, далее их сортировать и ставить как можно ниже(именно пересекающиеся, но сортировать все равно нужно что бы деадлоков не было) в транзакции а потом комитить транзакции в порядке как было в источнике. Но есть не заморачиваться с транзакционной целостностью в каждый конкретный момент времени то еще все проще. Рассмотрю пример для 10-и потоков. Берешь например 10 транзакций, объединяешь в одну. Потом сортируешь по признаку Table,UK,Version(TranId) , далее группируешь равномерно по потокам в таком порядке, главное что бы один UK со всеми версиями попадал в один поток гарантированно. И запускаешь в 10-и потоках. В этом случае основное правило не должно быть пересечение между потоками - в таком случае их гарантированно не будет. Единственный момент что в таком случае нельзя запускать новые потоки пока все не отработают, в противном случае возможно пересечение и нарушение хронологии.

Вообщем вот пример примитивной реализации достижение максимального параллелизма(даже естественный равен 1-е) например для задачи ускорения перекачки накопившейся очереди.

Подумываю может сделать примочку реализующий правильный параллелизм для типовой транзакционной репликации?
Но впрочем надо будет проверить, может в новых версиях все сделано правильно.
22 ноя 19, 14:58    [22022910]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Добавлю от себя что правильно реализованная процедура сортировки и группировки в потоки ничтожно мала относительно самого времени применения изменений.
22 ноя 19, 15:07    [22022934]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50855
МуМу
Берешь например 10 транзакций, объединяешь в одну. Потом сортируешь по признаку Table,UK,Version(TranId) , далее группируешь равномерно по потокам в таком порядке, главное что бы один UK со всеми версиями попадал в один поток гарантированно. И запускаешь в 10-и потоках.

Одна транзакция вставила запись в мастер-таблицу. Вторая - ссылающуюся не неё деталь. Тебе потребуется много удачи чтобы не нарваться на FK violation.
23 ноя 19, 15:52    [22023588]     Ответить | Цитировать Сообщить модератору
 Re: Нужна(насколько?) ли для транзакционной репликации многопоточная загрузка данных?  [new]
МуМу
Member

Откуда:
Сообщений: 1134
Я же написал , про то что данный вариант, самый простой и не предполагает транзакционную целостность до тех пор пока все потоки не выполнятся. Если нужна хронология, необходим вариант описанный ранее.
24 ноя 19, 10:58    [22023857]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить