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

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

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

 

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

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

 

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

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

 

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

 

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

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

 

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

 

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

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

 

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

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

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

 

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

См. также

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

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

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

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

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

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