Что такое общие методы для развертывания крупномасштабных систем?

(международное) преобразование на строке не будет работать, таким образом, я не протестирую его. Преобразовать. ToInt32 отражается как тестирование значения к пустому указателю и ЗАТЕМ вызову международного Синтаксического анализа, так должен в целом иметь тенденцию быть медленнее, чем международный Синтаксический анализ ().

5
задан skaffman 5 October 2009 в 10:01
поделиться

3 ответа

Насколько я понимаю, вы в основном спрашиваете о лучших практиках и инструментах для релиз-инжиниринга AKA-релевантность - важно знать "термин искусства" для предмет, потому что это значительно упрощает поиск дополнительной информации.

Система управления конфигурацией (CMS - также известная как система контроля версий или система контроля версий) незаменима для современной разработки программного обеспечения; если вы используете одну или несколько IDE, также хорошо иметь хорошую интеграцию между ними и CMS, хотя это больше проблема для целей разработки, чем для целей развертывания / обновления.

С точки зрения релевантности, ключевой момент о CMS заключается в том, что она должна иметь хорошую поддержку «ветвления» (под любым именем), потому что выпуски должны производиться из «ветки выпуска» где весь разрабатываемый код и все его зависимости (код и данные) находятся в стабильном «снимке», из которого по желанию может быть воспроизведена точная идентичная конфигурация.

Потребность в хорошей поддержке ветвления может быть более очевидной, если вы должны поддерживать несколько веток (настроенных для разных целей, платформ и т. д.), но даже если ваши выпуски всегда строго в единой линейной последовательности, передовой опыт по-прежнему диктует создание ветки выпуска. «Хорошая поддержка ветвления» включает в себя простоту слияния (и «разрешение конфликтов», когда в файл вносятся разные изменения), «выбор вишни» (взятие одного патча или набора изменений из одной ветки или заголовка / ствола и его применение к другая ветвь) и т. д.

На практике вы начинаете процесс выпуска с создания ветки выпуска; затем вы запускаете исчерпывающее тестирование в этой ветке (обычно НАМНОГО больше, чем то, что вы запускаете каждый день в непрерывной сборке, включая обширное регрессионное тестирование, интеграционное тестирование, нагрузочное тестирование, проверку производительности и т. д., и, возможно, даже более дорогостоящие процессы обеспечения качества, в зависимости от ). Если и когда исчерпывающее тестирование и контроль качества обнаруживают дефекты в версии-кандидате (включая регрессии, снижение производительности и т. Д.), Они должны быть исправлены; в большой команде разработка head / trunk может продолжаться, пока выполняется QA, откуда возникает потребность в простоте выбора вишен / слияния / и т. д. (независимо от того, хотите ли вы выполнить исправление на голове или в ветке выпуска, его еще нужно слить с другой стороной ;-).

И последнее, но не менее важное: вы » re НЕ получает полной отдачи от вашей CMS, если вы каким-то образом не отслеживаете с ее помощью «все», от чего зависят ваши выпуски - проще всего было бы иметь копии или жесткие ссылки на все двоичные файлы для инструментов, необходимых для создания вашего выпуска, и т. д., но это часто может оказаться непрактичным; поэтому, по крайней мере, отслеживайте точные выпуски, версии, исправления и номера тех инструментов, которые используются (операционная система, компиляторы, системные библиотеки, инструменты, которые предварительно обрабатывают изображения, звуковые или видеофайлы в окончательной форме и т. д. и т. д.). Ключ заключается в том, чтобы при необходимости точно воспроизвести среду, необходимую для восстановления точной версии, предложенной для выпуска (иначе вы сойдете с ума, отслеживая тонкие ошибки, которые могут зависеть от изменений сторонних инструментов. поскольку их версии меняются; -).

После CMS, Второй по важности инструмент для обновления - это хорошая система отслеживания проблем, в идеале хорошо интегрированная с CMS. Это также важно для процесса разработки (и других аспектов управления продуктом), но с точки зрения процесса выпуска важность средства отслеживания проблем заключается в возможности легко документировать, какие именно ошибки были исправлены, какие функции были добавлены, удалены и т. Д. или изменены, и какие изменения в производительности (или других наблюдаемых пользователем характеристиках) ожидаются в новом предстоящем выпуске. Для этой цели ключевой «передовой практикой» в разработке является то, что каждый набор изменений, который фиксируется в CMS , должен быть связан с одной (или несколькими) проблемой в системе отслеживания проблем: в конце концов, должна быть какая-то цель этого изменения (исправить ошибку, изменить функцию, оптимизировать что-то или какой-то внутренний рефакторинг, который должен быть невидим для пользователя программы); аналогично, каждая отслеживаемая проблема, помеченная как «закрытая», должна быть связана с одним (или несколькими) наборами изменений (если только закрытие не относится к типу «не будет исправлять / работать должным образом»; проблемы, связанные с ошибками и т. д. в сторонних компонентах , которые были исправлены сторонним поставщиком, с ними легко справиться аналогичным образом, если вам удастся также отслеживать все сторонние компоненты в CMS, см. выше; если вы этого не сделаете, по крайней мере, должен быть текст файлы в CMS, документирующие сторонние компоненты и их развитие, снова см. выше, и их необходимо изменить, когда какая-то отслеживаемая проблема на стороннем компоненте закрывается).

Автоматизация различных процессов обновления (включая сборку, автоматическое тестирование, и задачи развертывания) является третьим по важности приоритетом - автоматизированные процессы намного более продуктивны и повторяемы, чем просьба какого-нибудь бедного человека вручную выполнить список шагов (для достаточно сложных задач, конечно, рабочий процесс автоматизации может потребоваться " ввести человека в петлю "). Как вы догадываетесь, здесь могут помочь такие инструменты, как Ant SCons и т. Д. И т. Д.), Но неизбежно (если только вам не повезет с очень простыми и понятными процессами). ) вы обнаружите, что обогатите их специальными скриптами и т. д. (поможет какой-нибудь мощный и гибкий скриптовый язык, такой как perl, python, ruby ​​и т. д.). «Механизм рабочего процесса» также может быть полезен, когда рабочий процесс выпуска достаточно сложен (например, с участием определенных людей или их групп » s прошел гладко (включая сохранение и резервное копирование БД в ее новом состоянии, если необходимо), система снова открыта для общего использования.

Если вам нужно обновить «живую» систему без простоев, это может произойти где угодно от легкого неудобства до систематического кошмара. В лучшем случае транзакции достаточно короткие, и синхронизация между состоянием, установленным транзакциями, может быть немного задержана без ущерба ... и у вас есть разумное изобилие ресурсов (ЦП, хранилище и т. Д.). В этом случае вы запускаете две системы параллельно - старую и новую - и просто убедитесь, что все новые транзакции нацелены на новую систему, позволяя старым завершиться в старой системе. Отдельная задача периодически синхронизирует «новые данные в старой системе» с новой системой, поскольку транзакции в старой системе завершаются. В конце концов вы можете определить, что никакие транзакции не выполняются в старой системе, и все изменения, которые там произошли, синхронизируются с новой - и в это время вы можете окончательно выключить старую систему. (Вы, конечно же, должны быть готовы к «обратной синхронизации», если потребуется откат изменения.)

Это «простой, приятный» крайний вариант для обновления системы в реальном времени; с другой стороны, вы можете оказаться в такой чрезмерно ограниченной ситуации, что можете доказать, что задача невозможна (вы просто не можете логически удовлетворить все заявленные требования с данными ресурсами). Длительные сеансы, открытые в старой системе, которые просто не могут быть прерваны - ограниченные ресурсы, которые делают невозможным параллельную работу двух систем - основные требования для синхронизации каждой транзакции в реальном времени и т. Д. все может сделать вашу жизнь несчастной (и, как я заметил, в крайнем случае, может сделать поставленную задачу абсолютно невыполнимой). Две лучшие вещи, которые вы можете сделать с этим: (1) убедитесь, что у вас достаточно ресурсов (это также спасет вашу кожу, когда какой-то сервер неожиданно выйдет из строя ... у вас будет еще один, чтобы запустить его, чтобы встретить чрезвычайную ситуацию! -); (2) учитывать это затруднительное положение с самого начала, при первоначальном определении архитектуры всей системы (например: предпочитать краткосрочные транзакции долгоживущим сеансам, которые просто не могут быть "моментальным снимком", закрыты и легко перезапущены из моментального снимка. ", - один хороший архитектурный указатель; -).

(1) убедитесь, что у вас достаточно ресурсов (это также спасет ваш скин, когда какой-то сервер неожиданно выйдет из строя ... у вас будет еще один, чтобы запустить его, чтобы встретить чрезвычайную ситуацию! -); (2) учитывать это затруднительное положение с самого начала, при первоначальном определении архитектуры всей системы (например: предпочитать краткосрочные транзакции долгоживущим сеансам, которые просто не могут быть «моментальными снимками», закрыты и беспрепятственно перезапущены из моментального снимка. ", - один хороший архитектурный указатель; -).

(1) убедитесь, что у вас достаточно ресурсов (это также спасет ваш скин, когда какой-то сервер неожиданно выйдет из строя ... у вас будет еще один, чтобы запустить его, чтобы встретить чрезвычайную ситуацию! -); (2) учитывать это затруднительное положение с самого начала, при первоначальном определении архитектуры всей системы (например: предпочитать краткосрочные транзакции долгоживущим сеансам, которые просто не могут быть «моментальными снимками», закрыты и беспрепятственно перезапущены из моментального снимка. ", - один хороший архитектурный указатель; -).

10
ответ дан 18 December 2019 в 13:16
поделиться

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

Я расскажу вам, как я это делаю.

Для настроек конфигурации и общего развертывания кода и содержимого я использую комбинацию NAnt, CI-сервера и dashy (инструмент автоматического развертывания). Вы можете заменить dashy на любую другую «вещь», которая автоматизирует загрузку на ваш сервер (возможно, capistrano ).

Для сценариев БД мы используем RedGate SQL Compare для получения сценариев, а затем для большинства изменения, я фактически вношу их вручную , где это необходимо. Это потому, что некоторые изменения немного сложны, и мне удобнее делать это вручную. Вы можете использовать этот инструмент, чтобы сделать это за вас (или, по крайней мере, сгенерировать скрипты).

В зависимости от вашего языка, есть некоторые инструменты, которые могут создавать сценарии для обновления БД (я думаю, что кто-то на этом форуме написал один; надеюсь, он ответит), но у меня нет опыта с ними. Однако я бы хотел кое-что добавить.

Трудности

Я забыл ответить на один из ваших вопросов.

Самая большая проблема при обновлении любого значительно сложного / распределенного сайта - это синхронизация БД. Вам нужно подумать, будет ли у вас какое-либо время простоя, и если вы это сделаете, что произойдет с базами данных. Вы все закроете, чтобы транзакции не обрабатывались? Или вы перенесете все на один сервер, обновите БД B, а затем синхронизируете БД A и B, а затем обновите БД B? Или что-то еще?

Что бы вы ни выбрали, вам нужно выбрать это и либо сказать: «Хорошо для каждого обновления, будет X простоев», или что-то еще. Просто зафиксируйте это.

Худшее, что вы можете сделать, это привести к сбою чьей-либо транзакции в середине обработки, потому что вы обновляли этот сервер; или оставить в рабочем состоянии только часть вашей системы.

3
ответ дан 18 December 2019 в 13:16
поделиться

Хорошие вопросы. Идентификатор задания - это в основном конструкция оболочки. В ядре есть поддержка в виде сигналов, которые участвуют в управлении заданиями, и способа, которым ядро ​​точно знает, каким процессам отправлять сигналы управления заданиями.

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

Чтобы ответить на ваш последний вопрос, оболочка запускает все процессы, сначала выполняя вилку (2) , а затем выполнение execve (2) . Единственная разница с & заключается в том, что оболочка не выполняет wait (2) (или родственный вариант), и поэтому программа может продолжать работу «в фоновом режиме». На самом деле в Unix мало различий между передним планом и фоном.

Группа процессов - это ассоциация, определяемая оболочками, так что ядро ​​знает об одном процессе «переднего плана», который обрабатывает набор различных «фоновых» процессов. Это в основном важно для того, чтобы фоновые процессы генерировали сигнал, если они решат внезапно прочитать данные с терминала. (Такой терминал, вероятно, подключен к стандартному вводу.) Это приведет к тому, что «задание» сгенерирует сигнал, и оболочка предложит пользователю что-то сделать.

Попробуйте (спящий 5; читать x) & и через 6 секунд наберите return или что-нибудь, чтобы оболочка проснулась. Вот когда вы видите что-то вроде ...

[1] + Stopped (sleep 5; read x)

... и затем вы набираете fg , чтобы вывести его на передний план.

Первоначально, В Unix были конвейеры, и у него были и , но не было возможности переместить команду или конвейер между передним планом и фоном, и не было способа помочь фоновому процессу, который внезапно решил прочитать стандартный ввод.

Job control и его поддержка ядром были добавлены Биллом Джоем и другими в ранних версиях BSD и csh (1). Они были построчно подобраны коммерческим Unix и клонированы для аналогичного рабочего ядра Linux.


Что касается вопросов о группах процессов и ps (1) ...

Первоначально в Unix были конвейеры, и у него были и , но не было возможности переместить команду или конвейер между передним планом и фоном, а также не было способа помочь фоновому процессу, который внезапно решил прочитать стандартный ввод .

Управление заданиями и его поддержка ядром были добавлены Биллом Джоем и другими в ранних версиях BSD и csh (1). Они были построчно подобраны коммерческим Unix и клонированы для аналогичного рабочего ядра Linux.


Что касается вопросов о группах процессов и ps (1) ...

Первоначально в Unix были конвейеры, и у него были и , но не было возможности переместить команду или конвейер между передним планом и фоном, а также не было способа помочь фоновому процессу, который внезапно решил прочитать стандартный ввод .

Управление заданиями и его поддержка ядром были добавлены Биллом Джоем и другими в ранних версиях BSD и csh (1). Они были построчно подобраны коммерческим Unix и клонированы для аналогичного рабочего ядра Linux.


Что касается вопросов о группах процессов и ps (1) ...

Управление заданиями и поддержка его ядром были добавлены Биллом Джоем и другими в ранних версиях BSD и csh (1). Они были построчно подобраны коммерческим Unix и клонированы для аналогичного рабочего ядра Linux.


Что касается вопросов о группах процессов и ps (1) ...

Управление заданиями и поддержка его ядром были добавлены Биллом Джоем и другими в ранних версиях BSD и csh (1). Они были построчно подобраны коммерческим Unix и клонированы для аналогичного рабочего ядра Linux.


Что касается вопросов о группах процессов и ps (1) ... Для поддержки управления заданиями в оболочках состояние процесса ядра включает идентификатор группы процессов и идентификатор сеанса. Группа процессов и задание - это одно и то же, но номер задания - это просто дескриптор, создаваемый оболочкой. Процесс является лидером сеанса, если идентификатор сеанса такой же, как pid, и процесс является лидером группы процессов, если pgid совпадает с pid. Я считаю, что с + , которые печатает ps (1) , происходит нечто более тонкое. Каждый терминал знает, какова его группа процессов переднего плана, поэтому я считаю, что процесс получает +, если pid == pgid && (pgid - это pg переднего плана для его управляющего терминала).

Таким образом, ядро ​​сохраняет несколько элементов состояния: пид, пгид, сид, и процесс может иметь управляющий терминал, а терминал может иметь идентификатор pgid переднего плана. Эти учетные данные в основном предназначены для поддержки управления заданиями, но также используются для отмены доступа к терминалу, когда пользователь выходит из системы.

Управление версиями означает, что у нас фактически в любой момент времени есть несколько одновременных версий сообщений, базы данных, статических ресурсов и Java-апплета.

Это особенно важно в случае «отката». Если вы обнаружите ошибку при загрузке нового программного обеспечения, и вдруг вы не можете позволить себе загрузку, у вас будет кризис, если вы не выполнили версию, и вам просто нужно будет загрузить старую программу, если она есть.

Теперь, когда Я сказал, что развертывание написано по сценарию: - сначала развертываются статические ресурсы (+ java-апплет) - далее идет база данных, несколько конфигураций сосуществуют, так как они версированы - программное обеспечение ставится в очередь для загрузки в «прохладном» временном окне (когда наш трафик находится на самом низком уровне, например, ночью)

И, конечно же, мы заботимся о проблемах обратной / прямой совместимости с внешними серверами, которые не следует недооценивать.

1
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: