|
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). |
19.02.2017, 18:11 | #6 |
Модератор
|
Ну в каком-то формате (или гарантированный даунтайм или временная ограниченная работоспособность) - пострадать придется. Полчаса-час простоя раз в неделю или месяц корпорация допускает?
__________________
-ТСЯ или -ТЬСЯ ? |
|
16.02.2017, 12:07 | #7 |
Moderator
|
Я все-таки наивно спрошу - а как вы обновление делаете ? Весь modelstore переливаете, ставите свою model или просто проект перекидываете ? Просто по моим наблюдениям, если у вас уже все в production достаточно давно (раз база данных большая), вероятность конфликта обновлений не высока, и в 99% случаев можно тупо перекидывать XPO и потом делать Incremental CIL...
|
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
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:09 | #9 |
Участник
|
Цитата:
Иначе бы не было вот такого Ax 2012 R2. Поле "не извлечено" В общем все грустно. |
|
16.02.2017, 12:23 | #10 |
Участник
|
Про Дикси понятно. Скрипты мы тоже писали на больших проектах еще для 3.0. Но это действительно хакерство и не для всех.
Как MS официально предполагает делать синхронизацию? Кроме скриптов больше никак не ускорить?
__________________
Ivanhoe as is.. |
|
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, 22:26 | #16 |
Участник
|
Цитата:
По поводу 7ки на яммере МС писали что и сейчас весь downtime уходит на синхронизацию, мол они работают над этим но пока ничего не придумали |
|
|
За это сообщение автора поблагодарили: Logger (1). |
20.02.2017, 11:01 | #17 |
Участник
|
Цитата:
Сообщение от trud
Документ "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.
Я, может, крамольную вещь скажу, но в моей практике очень часто бывает нужно обновлять рабочее приложение без одновременного перезапуска всех АОСов. Это связано с тем, что обычно АОСы делятся на различные группы по функциональной нагрузке:
При обновлении рабочего приложения, как правило, переносится функционал, который влияет на одну-две-три группы АОСов с т.з. используемых подмножеств функционала приложения, но очень редко - на все группы сразу. Да, может, это нельзя в каждом случае математически точно обосновать, но из опыта поддержки того или иного приложения обычно это достаточно очевидно. И вот наиболее удобным был бы способ обновления рабочего приложения, который позволял бы разнести во времени перезапуск различных групп АОСов. Скажем, online-интеграциям через WCF-сервисы может быть без разницы, что обновились какие-то формочки для Windows-клиента Аксапты, а АОСам разноски розницы - без разницы, что обновилась логика сводного планирования. Но штатного варианта по сути выполнять две разные версии приложения на разных группах АОСов, к сожалению, нет. |
|
|
За это сообщение автора поблагодарили: EVGL (10), trud (2), sukhanchik (5), ax_mct (5). |
16.02.2017, 13:06 | #18 |
Участник
|
А на что у вас тратится время при синхронизации ?
Можно выделить несколько причин замедления : 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). |
20.02.2017, 10:10 | #19 |
Участник
|
Промежуточное резюме: все упирается в синхронизацию - от 20 минут. Готовых стандартных решений для 2012 нет, в 7ке есть надежда на лучшее.
__________________
Ivanhoe as is.. |
|
20.02.2017, 10:19 | #20 |
Участник
|
Цитата:
Из моего скромного опыта с 2012-й основное время уходит на запросы к метаданных SQL Server. Думаю рыть надо в сторону их ускорения (запросы к системных вьюхам и.т.п.) |
|