gifts2017

Параллельность выгрузок

Опубликовал Осипов Сергей (fixin) в раздел Администрирование - Распределенная БД (УРИБ, УРБД)

Рассказываю свой опыт, как добился параллельности выгрузки из центральной базы РИБ сразу в 70 узлов.

 

У клиента распределенная база розницы из 70 узлов. Особенность – несимметричность выгрузки – на точки идет большой объем информации – номенклатура, цены, поставки товаров.

От точек приходит мало информации – только продажи.

 

Поэтому загрузка проходит быстро, практически за 30 минут.

А вот выгрузка идет довольно долго, порой 3 часа.

 

Хотелось выгружать данные параллельно, но при попытке запуска двух выгрузок сразу получал сообщение о блокировке транзакций.

 

Пришлось обратиться за помощью клуба на мисту.

Модератор форума Fragster подсказал мне решение, которое оказалось рабочим. Спасибо ему за это!

 

В справочнике настроек обмена для узла нужно указать единичку в количестве элементов при загрузке и выгрузке данных:

 

Когда-то давно я тоже столкнулся с блокировками, обмены мешали нормальной работе, я ставил в этом поле значение 200, блокировок было меньше. Оказывается, нужно было идти до конца, до единицы. По умолчанию там стоит ноль, то есть обмен целиком проходит в одной транзакции.

Тут же транзакция фиксируется после каждого прочитанного/выгруженного объекта. Таким образом, база не держит долгие транзакции и можно получить параллельность.

 

После этого я запустил выгрузки на две точки и убедился, что она прошла нормально.

 

Затем я сделал пять настроек выполнения обмена, в каждую забросил по 14 точек:

 

 

На всякий случай и в самой настройке обмена ставлю размер порции обмена 1 (не изучал, что приоритетнее):

 

 

Обмены стартуют одновременно, расписание у каждого одинаковое:

 

 

В истории обмена посмотрел – все выгрузки успешные, с зелеными флажками:

 

 

На выгрузку в пять потоков отвожу час. На самом деле, проходит минут за 40, причем некоторые потоки заканчиваются раньше, другие позже – в зависимости от количества выгружаемых данных.

 

Выгрузка в пять потоков довольно сильно нагружает процессор, практически на 100%. Можно снизить количество потоков или стартовать каждый поток со сдвигом в 10-20 минут.

 

По крайней мере здесь есть выбор, которого нет при последовательных обменах.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Вадим Назаров (NazarovV) 16.08.13 11:15
все гениальное - просто! Спасибо Вам за эту публикацию, как никогда кстати!
2. Осипов Сергей (fixin) 16.08.13 12:01
(1) сам несказанно рад. тупил год на решением проблемы, чего только не хотел сделать. А решение вот оно где оказывается.
3. Вадим Назаров (NazarovV) 16.08.13 12:28
(2) fixin, мне до сих пор стыдно(
4. Антонио (Fragster) 16.08.13 12:41
Я не только на мисте, я и тут есть
Liris; iov; Rustig; +3 Ответить
5. Анатолий Бычин (tolyan_ekb) 16.08.13 12:57
Изредка следил за твоими исканиями по мелькавшим темам. Молодец, у тебя получилось ))
6. Антонио (Fragster) 16.08.13 13:18
Опять же главное - сделать обмен вида 1 база - 7 баз - 7х10 баз - так и не реализовано, а это очень сильно снижает время выгрузок (если одни и те же данные ходят во много узлов), 7 "промежуточных" баз можно вынести на отдельный сервер, чтобы они не мешали работе основного.
7. Осипов Сергей (fixin) 16.08.13 13:22
(6) да. но это из пушки по воробьям. Меня устроила выгрузка в пять потоков на 70 точек.
Грузит, конечно, сервак на 100%, но быстро. Терпимо.

Да, спасибо большое за решение. ;-)

(5) да, стремлюсь к идеалу.
8. Росинфо 1 (rosinfo1) 16.08.13 14:01
Что-то не понял как 14 узлов в одну настройку обмена запихнуть??? У меня один узел соответствует одной настройке, потом цикл по справочнику с настройками запускается и стартует последовательно. Правда у меня всего 5 узлов.
9. Осипов Сергей (fixin) 16.08.13 14:03
(8) не путайте "настройка выполнения обмена" (сюда именно запихиваются 14 узлов) и "настройка обмена"
10. Gudvin Pupkin (Slotty) 16.08.13 14:29
Хм. Сам как то бился над решением данного вопроса. Fragster, fixin - молодцы.
11. Алексей Новоселов (a-novoselov) 16.08.13 14:42
Вроде бы элементарное решение, сам до него за пару часов додумался, когда проблемы возникли и другие действия не помогали... Но, видимо, не всем сразу в голову может прийти. Молодец что написал в помощь молодым!
12. Осипов Сергей (fixin) 16.08.13 14:48
(11) а прикинь, я год парился. и не новичок.
кстати, у меня розница переделана была в режим управляемых блокировок. но думаю, что и в обычном режиме должна норм работать.
13. Росинфо 1 (rosinfo1) 16.08.13 15:26
Что-то все равно не понятно где в спр. "настройка выполнения обмена" указать 14 узлов, узел же указывается в шапке справочника "настройка обмена". Если 70 обменов следовательно 70 элементов справочника "настройка обмена", далее цикл переборка каждого элемента справочника и запуск обмена, или я что-то не понимаю ?
14. Росинфо 1 (rosinfo1) 16.08.13 15:37
Еще вопрос. У Вас обмен файлами через ФТП ресурс настроен, или как-то по другому? Файлы каждого магазина в отдельной папочке на ФТП ресурсе, или по названиям ищите (если что не так пойдет)? Потом из Розницы в какую базы выгружаете? Просто мне предстоит настроить 15 магазинов розницы РИБ, а потом выгрузку из центрального узла в Комплексную автоматизацию. Хочу все типовыми средствами делать. Думаю как бы на "грабли не наступить".
15. Росинфо 1 (rosinfo1) 16.08.13 16:11
C настройкой спр. "настройка выполнения обмена" разобрался, почему то табличная часть "Выполняемые действия" была скрыта в демо-базе Розница 1.0
16. Осипов Сергей (fixin) 16.08.13 16:29
(14) у нас VPN, обмен происходит через расшаренный каталог центрального сервера. То бишь никакого ФТП.
17. Алексей Попов (Aleskey_K) 16.08.13 17:27
я думаю, что обмен по 1 элементу, это слишком мелко. почему не использовать блоки по 5-10 элементов, найти эту золотую середину? Или тут смысл немного в другом ?
18. Сергей Маслов (LexSeIch) 16.08.13 17:38
Мир этому дому!
Спасибо за предложенное решение! Думаю скоро пригодится.
19. Осипов Сергей (fixin) 16.08.13 17:48
(17) лучшее - враг хорошего. И так работает. Вот на 200 не работало. ;-)
Ну их нафиг, эти транзакции, рассадник блокировок.
(18) спасибо.
20. Вадим Назаров (NazarovV) 17.08.13 18:01
(14) rosinfo1, у нас 12 магазинов, обмен был настроен по ftp... выгружал последовательно, параллельно тупило( после этой статьи попробовал - все ок, выгрузка\загрузка проходят за 30-40 секунд, тормозов замеченно не было... удачи в настройке!
21. ivanov660 ivanov660 (ivanov660) 19.08.13 07:05
Наверное не сравнивали время выгрузки при различных настройках 200 и 1? Если сопоставимы тогда гуд.
Мы же делаем выгрузки последовательно растягивается конечно часа на 2-3 (8 точек). Надо попробовать, интересно посмотреть на результат. Больше всего конечно напрягают взаимные блокировки в случае параллельности...
22. Петр Чечин (stoptime) 19.08.13 11:27
22 магазина файлы ходят эпические, так как картинок много. Супер это решило проблемму.
дед локи ушли
23. Яков Коган (Yashazz) 19.08.13 14:12
"Не изучал...", "Спросил совета...". Метод тыка, ё-моё.
Лучше б товарищ Fragster сам словил означенные плюсы.
24. Осипов Сергей (fixin) 19.08.13 14:47
(23) коллеги, давайте относиться к вещам реалистично. Товарищ Фрагстер много знает и спасибо ему за это.
Но если бы я не постарался, вы ды до сих пор не знали, что есть такая методика. Не думаю что в планах товарища Фрагстера было публиковать такую статью на ИС.
Так что плюсы мои заслуженные. ;-)
25. Антонио (Fragster) 19.08.13 16:44
Можете купить мне на пиво обработку за 1000 рублей :)
http://infostart.ru/public/197614/
26. Осипов Сергей (fixin) 19.08.13 17:06
27. Владимир Семенов (kruglay) 20.08.13 14:55
оказывается все так просто, спасибо за совет
28. Павел Баркетов (gallam99) 21.08.13 21:52
(0)
Без обид конечно, но эта информация давно есть в инете:

"Количество элементов в транзакции" – определяет максимальное число элементов данных, которые помещаются в сообщение в рамках одной транзакции базы данных. Если значение параметра равно 0 (значение по умолчанию), то все данные помещаются в рамках одной транзакции. Такой режим является рекомендуемым, так как гарантирует согласованность данных, помещаемых в сообщение. Но при создании сообщения в многопользовательском режиме могут быть конфликты блокировок между транзакцией, в которой данные помещаются в сообщение, и транзакциями, выполняемыми другими пользователями. Для снижения вероятности возникновения таких конфликтов можно задать значение этого параметра, отличное от значения по умолчанию. Чем меньше значение параметра, тем меньше вероятность конфликта блокировок, но выше вероятность помещения в сообщение несогласованных данных.

Я так понимаю, по фразе "элементов в транзакции при выгрузке данных" в яндексе эта статья на втором месте)))
29. Осипов Сергей (fixin) 22.08.13 10:49
(28) привет, КЭП. В интернете есть все. Вопрос в том, чтобы применить то что есть в интернете.
Не замечаете своей логической ошибки?
30. Антонио (Fragster) 22.08.13 10:51
(28) gallam99, Это даже в синтакс помощнике есть, если что...
31. Осипов Сергей (fixin) 22.08.13 11:05
(30) коллега, я не в первый раз подымаю эту тему. И никто ничего не мог сказать, пока я не провел эксперимент и не внедрил. Одно дело знать, что это влияет на блокировки, другое дело быть уверенным, что будет параллельность.
Так что не надо выдавать неочевидные факты за очевидные.
32. Павел Баркетов (gallam99) 22.08.13 11:42
(29) "Вы год бились по вашим словам", а то что написано в туче материалов не прочитали, досадно.
И второе, прежде чем говорить об этой "супер находке", надо бы предупредить людей о проблеме "согласованности данных", на которую они могут наступить. И должны это учитывать для конкретной ситуации.
У нас был практический опыт организации параллельных загрузок/выгрузок и не только в разрезе периферийных БД, а в размере объектов одной периферийной БД (и это возможно).
Проще было проанализировать на чем у вас блокировка (какой ресурс блокируется) и можно было бы ли его расшить, тем более, что узел присутствует в таблице регистрации изменений (логических проблем быть не должно).
kruglay; krv2k; anchovy; CratosX; +4 Ответить 1
33. Осипов Сергей (fixin) 22.08.13 12:26
(32) вам проще одно, мне другое. Проблема рассогласования данных решается проще, чем построение хитрых схем параллельности. ;-)

Видите ли, на практике все упирается в стоимость решения. Это решение дешевое и довольно надежное.
34. PlatonovStepan (Jogeedae) 26.08.13 07:56
вообще, при выгрузке данных для узла блокируется только этот узел, так что не вижу проблемы в параллельной выгрузке данных для N-Узлов.
саму проблему ожидания завершения транзакции для одного объекта выгружаемого в N-узлов одновременно не решили :), да это и не под силу в рамках платформы :).
проблема согласованности данных по-моему мнимая, к тому же самоустраняющаяся в следующем сообщении.
Зайдя сюда решил было что вы одно сообщение раздаёте всем узлам, хорошо что не так :)
И ещё одно, пока есть процессы выгрузки сообщений, возможно, не стоит начинать приём сообщений? Если данные интенсивно мигрируют не только вертикально, но и горизонтально.
35. Павел Парамонов (anchovy) 27.08.13 11:19
(34) Jogeedae, При определении состава сообщения блокируется вся ТРИ, иначе блокировки при параллельных выгрузках не возникали бы. Это баг, не убирающийся управляемыми блокировкаии. Я пробовал устанавливать режим управляемых блокировок в РИБ Розница - ничего не дало.
36. Змей Змеевич (Zmey_72) 09.09.13 07:12
Спасибо за проделанную работу. Очень пригодилось!
37. Алексей Карвацкий (AVK_Alex) 10.09.13 10:28
Вот так вот. На очередном примере подтверждается старинная русская поговорка: "Хорошего понемногу".
Транзакции в небольшом количестве - добро, в большом - уже зло :)
38. Вика Козлова (natarezn) 16.10.14 13:03
Вы такой молодец! объяснили
39. Вика Козлова (natarezn) 16.10.14 13:04
У меня стоит 200 как у Вас. база слетает по часам. невозможно сделать выгрузки. сбоит
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа