16.02.2017, 11:00 | #1 |
Участник
|
Перенос доработок на Prod
AX 2012. Какие способы сократить downtime вы используете? На практике.
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: macklakov (5). |
16.02.2017, 11:27 | #2 |
Участник
|
отделить и распаралелить процессы синхронизации базы и накатывания доработок.
|
|
|
За это сообщение автора поблагодарили: Ivanhoe (2). |
16.02.2017, 11:43 | #3 |
Участник
|
И у меня вопрос: почему один и тот же код начинает работать по-разному со включенным и отключенным CIL? Я всегда делаю инкрементный CIL после накатывания доработок. Или этого мало?
|
|
16.02.2017, 11:54 | #4 |
Участник
|
В CIL реально есть вещи, которые работают по другому, при чем как by design, так и в следствие ошибок.
Про синхронизацию БД - есть ли какие-то варианты ее сократить? Как глобальная корпорация с офисами по миру (да и просто с отгрузками 24х7) может выделить 20-30 минут для синхронизации базы? Я уже молчу про ТБ базы.
__________________
Ivanhoe as is.. |
|
16.02.2017, 12:05 | #5 |
Участник
|
Цитата:
в Дикси было минимум ночь. база там была 30-40Тб. сократить время синхронизации можно. но за счет того, что изменение схемы делается ТОЛЬКО админскими скриптами, а не из аксапты. это очень сложно. но можно. и не каждому стоит советовать такое. например, в той же Дикси, создание/изменение/удаление индексов со стороны аксапты было запрещено админами. тут очень много клиентской специфики. попробуй таки поговорить с людьми из Дикси. они вменяемые. на самом верхнем логическом уровне - распараллеливать операции. со всеми вытекающими последствиями работы с паралелльными потоками. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
16.02.2017, 12:07 | #6 |
Moderator
|
Я все-таки наивно спрошу - а как вы обновление делаете ? Весь modelstore переливаете, ставите свою model или просто проект перекидываете ? Просто по моим наблюдениям, если у вас уже все в production достаточно давно (раз база данных большая), вероятность конфликта обновлений не высока, и в 99% случаев можно тупо перекидывать XPO и потом делать Incremental CIL...
|
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
16.02.2017, 12:23 | #7 |
Участник
|
Про Дикси понятно. Скрипты мы тоже писали на больших проектах еще для 3.0. Но это действительно хакерство и не для всех.
Как MS официально предполагает делать синхронизацию? Кроме скриптов больше никак не ускорить?
__________________
Ivanhoe as is.. |
|
16.02.2017, 12:28 | #8 |
Участник
|
Цитата:
Сообщение от fed
Я все-таки наивно спрошу - а как вы обновление делаете ? Весь modelstore переливаете, ставите свою model или просто проект перекидываете ? Просто по моим наблюдениям, если у вас уже все в production достаточно давно (раз база данных большая), вероятность конфликта обновлений не высока, и в 99% случаев можно тупо перекидывать XPO и потом делать Incremental CIL...
1. допустимый downtime 2. необходимость делать копию данных -1 день на тестовом приложении 3. скорость исправления ошибки на prod 4. количество изменений Я про большую БД не говорил - это mazzy У меня даже на запускаемых проектах, где БД не сильно большая всё упирается в синхронизацию. Т.е. перенести теми же проектами + компиляция я могу за 15 минут на выделенный AOS, потом перезапуск всех AOS, тут даже днем на большом предприятии можно найти время. А вот сделать синхронизацию - минут 20. А если пользователи должны работать - то не прогнозируемо, т.к. блокировки начинаются.
__________________
Ivanhoe as is.. |
|
16.02.2017, 13:06 | #9 |
Участник
|
А на что у вас тратится время при синхронизации ?
Можно выделить несколько причин замедления : 1. Медленное обращение к метаданным SQL сервера - когда долго идет сканирование каие таблички есть в наличии и.т.п. 2. Долгое создание индексов 3. Долгое создание полей. 4. Долгое пересоздание табличек при изменении длины строковых полей. Предлагаю рассмотреть каждый фактор и дальше уже решать что делать. По п.1 - можно пошаманить с SQL - как ускорить процесс. Например, на форуме была тема где это обсуждалось применительно к ораклу - там шаманили с материализованными вьюхами и.т.п. Долгая синхронизация Возможно для SQL тоже можно что-то такое применить. Или иной способ. Мне тоже не нравится как долго он делает сканирование - сравниваю скорость синхронизации на 2009-й под Ораклом и на 2012 R3 под SQL - намного дольше начитывает данные о табличках. Т.е. явно подтормаживает обращение в системным вьюхам содержащим инфу а табличках, их полях и индексах. Наверняка этот процесс можно ускорить - надо покопать соответствующие ресурсы по SQL серверу. По п.2 можно индексы отдельно создавать - онлайн. Если база большая то БД скорее всего в Enterprise версии, так что позволит это сделать. По п.3 надо смотреть - не готов что-то советовать. По п.4 Тоже решаемо. Описывал способ решения тут: Длина номера фактуры, накладной больше 20 символов. делается несложно. Джоб для правки SQLDictionary : X++: static void SQLDictionaryFix(Args _args) { int strSize = 20; //pkoz 28.10.2013 AsciiIo Source; dialog dialog = new dialog(""); dialogfield fileName; filenameopen _fileName; container OneRec; InvoiceId invoiceID; container con; // pkoz 15.06.2006 --> custTable custTable; custSettlement _custSettlement; // pkoz 15.06.2006 <-- identifiername tableName; identifiername fieldName; TableId TableId; FieldId FieldId; SQLDictionary SQLDictionary; SQLDictionary SQLDictionary2; ; // appl.setDefaultCompany("904"); // appl.setDefaultCompany("905"); fileName = dialog.addFieldValue(typeId(filenameopen),_filename,"Файл с данными"); // fileName.value(@"c:\_\Estate.csv"); // fileName.value(@"c:\_\SQLDictionaryFix.csv"); //pkoz 28.10.2013 // fileName.value(@"c:\_\FK2.csv"); //pkoz 28.10.2013 fileName.value(@"c:\_\FK_126468_myach.csv"); //pkoz 21.09.2015 dialog.run(); if ( dialog.closedOk()) { _filename = filename.value(); // pkoz, 11.04.2014 --> if ( Box::yesNo_Net(strFMT("Длина %1 ?", strSize), DialogButton::No) != DialogButton::Yes) { return; } // pkoz, 11.04.2014 <-- Source = SysDataIntegration::openFile(_filename,"R",";"); if ( source) { ttsBegin; while(source.status() == IO_status::Ok) { // [invoiceID] = source.read(); con = source.read(); if (con) { tableName = GRD_ConPeekStr( con, 1); fieldName = GRD_ConPeekStr( con, 2); TableId = tablename2Id( tableName ); if ( !TableId ) { warning(strFMT("Не определили TableId по %1 и %2", tableName, fieldName )); continue; } fieldId = fieldName2id( TableId, fieldName ); if ( !fieldId ) { warning(strFMT("Не определили fieldId по %1 и %2", tableName, fieldName )); continue; } SQLDictionary = null; select forUpdate SQLDictionary where SQLDictionary.name == fieldName && SQLDictionary.tabId == TableId && SQLDictionary.fieldId == fieldId ; if ( !SQLDictionary ) { warning(strFMT("Не определили SQLDictionary по %1 и %2", tableName, fieldName )); continue; } if ( SQLDictionary.fieldType != Types::RString && SQLDictionary.fieldType != Types::String && SQLDictionary.fieldType != Types::VarString ) { warning(strFMT("Поле в SQLDictionary не строковое по %1 и %2", tableName, fieldName )); continue; } if ( SQLDictionary.strSize > strSize ) { warning(strFMT("Поле в SQLDictionary уже длиннее по %1 и %2", tableName, fieldName )); continue; } SQLDictionary.strSize = strSize; SQLDictionary.update(); info(strFMT("Обновили по %1 и %2", tableName, fieldName )); } } ttsCommit; } } info( "ок" ); } Еще как вариант, если много модификаций переносится, то может имеет смысл не скопом все накатывать а разбить процесс на несколько обновлений - чтобы каждый раз небольшие изменения в БД вносились. Можно ведь сперва БД изменять пошагово, а потом уже накатить/включить бизнеслогику. Последний раз редактировалось Logger; 16.02.2017 в 13:50. |
|
|
За это сообщение автора поблагодарили: mazzy (2), macklakov (5), trud (1), Ace of Database (3), Ivanhoe (5), Товарищ ♂uatr (1). |
16.02.2017, 13:09 | #10 |
Участник
|
Цитата:
Иначе бы не было вот такого Ax 2012 R2. Поле "не извлечено" В общем все грустно. |
|
16.02.2017, 13:32 | #11 |
Участник
|
Цитата:
что, может быть, и оправдано в общем случае, когда все таблицы на одном диске в одном сегменте. когда все в одном все равно узким местом будет диск. и давать параллельные команды - бессмыслено. все сильно меняется, если разные таблицы/индексы назначены на разные физические диски, если используются сегментация данных. тогда возможна ситуация, когда часть дисков простаивает, на них можно дать параллельные задания и это реально уменьшит общее время. но тут начинаются: вопросы логической целостности при параллельных заданиях, вопросы как разбито на физические устройства, deadlock и прочее. аксапта ничего не знает о физическом уровне. и это хорошо. но соответственно и синхронизация, запускаемая из аксапты, не может быть достаточно интелектуальной. нужно делать отдельные скрипты... примерно так. |
|
19.02.2017, 14:25 | #12 |
Участник
|
Цитата:
Кстати в АХ7 реализована наконец-то параллельная синхронизация, т.е. выполняется побыстрее при 100% загрузке процессора Документ "Microsoft Dynamics AX 2012 White Paper: Deploying Customizations Across Microsoft Dynamics AX 2012 Environments" описывает довольно экзотические способы снижения downtime "Import a model store with minimal downtime", интерестно так кто нибудь делает? Цитата:
To reduce downtime, we recommend that you import the metadata into a new schema next to the old one, and then switch to the active schema. This methodology lets users continue using the system until the AOS instance needs to be restarted so that the new schema can be applied.
Последний раз редактировалось trud; 19.02.2017 в 14:31. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
19.02.2017, 15:00 | #13 |
Участник
|
Цитата:
Сообщение от trud
Все же думаю алгоритм немного кривоват, а не "физические диски". т.е. самый простой случай - запускаем синхронизацию без каких то изменений в структуре данных. она работает минут 20
Кстати в АХ7 реализована наконец-то параллельная синхронизация, т.е. выполняется побыстрее при 100% загрузке процессора а можно подробнее про параллельную синхронизацию в акс7 или ссылку? похоже, я пропустил. |
|
19.02.2017, 15:50 | #14 |
Участник
|
|
|
19.02.2017, 17:48 | #15 |
Модератор
|
Цитата:
P.S. Ждать пока задеплоятся все отчеты - совсем необязательно
__________________
-ТСЯ или -ТЬСЯ ? Последний раз редактировалось Vadik; 19.02.2017 в 17:51. |
|
19.02.2017, 17:50 | #16 |
Модератор
|
А толку с нее ? В продуктиве MS сам деплоит, и резервирует на все про все 5 часов. По факту - последнее время управляются за 2.5-3
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: trud (1). |
19.02.2017, 18:11 | #17 |
Модератор
|
Ну в каком-то формате (или гарантированный даунтайм или временная ограниченная работоспособность) - пострадать придется. Полчаса-час простоя раз в неделю или месяц корпорация допускает?
__________________
-ТСЯ или -ТЬСЯ ? |
|
19.02.2017, 22:26 | #18 |
Участник
|
Цитата:
По поводу 7ки на яммере МС писали что и сейчас весь downtime уходит на синхронизацию, мол они работают над этим но пока ничего не придумали |
|
|
За это сообщение автора поблагодарили: Logger (1). |
20.02.2017, 03:47 | #19 |
Участник
|
Цитата:
Кстати вчера вышел Update4, теперь обещают greatly reduced Цитата:
Apply deployable packages with reduced downtime.
Currently, the average downtime needed to apply a single package in an environment deployed through LCS is 5 hours. With this feature, the package application is optimized so that the downtime is greatly reduced. |
|
20.02.2017, 08:15 | #20 |
Модератор
|
Таки там с двух сторон пилят - и платформу, и LCS (в январе кажется начали независимые шаги типа накатывания бинарных обновлений на AOS-ы исполнять параллельно). У нас и на Update 2 процесс ускорился с 5 до 3 часов
Цитата:
Кстати а вот вопрос - если после обновления надо что-нибудь поотлаживать на копии текущей рабочей БД, сколько времени по факту занимает получение такой копии? я так понимаю создается запрос в поддержку на получение копии БД, который может выполняться 1 бизнес день?, потом еще сколько то на развертывание этой копии.. и т.д. Как вы решаете такое?
__________________
-ТСЯ или -ТЬСЯ ? |
|