Как подружить новое ПО и старое «железо»?

Рано или поздно любая современная компания столкнется с необходимостью обновлять ПО. Для примера, самое частое проявление такой необходимости — обновление «1С». Но есть гораздо более сложные ситуации. Как правило, это обновление ПО для высоконагруженных операционных систем, которые невозможно отключить даже на пару минут.

Как подружить новое ПО и старое «железо»?
© It-world

Но помимо простого обновления ПО, нужно обновлять и «железо» плюс поддерживать работу всех коннекторов к другим системам компании. Рост сложности всего комплекса обновления растет в геометрической прогрессии в зависимости от объема компании и важности обновляемого ПО.

Я, Андрей Шишкин, СТО в группе компаний X-Com, поделюсь нашим опытом запуска нового ПО, разработанного подрядчиками по нашему ТЗ.

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

Начало

Имеем довольно старую систему, написанную больше 10 лет назад, работающую на кластере в 18 серверов. На момент запуска этой системы разумнее было купить именно кластер серверов, чем несколько мощных машин. В современных реалиях ситуация уже чуть иная.

Серверы функционируют нон-стоп под нагрузкой. Днем идет трафик на магазины, обновление цен и остатков. Приоритет отдается скорости работы сайтов, чтобы клиенты не страдали. Но днем же мы получаем весьма немалую нагрузку от разных ботов и парсеров. Иногда такие парсеры запускаются одновременно, и нашим серверам приходится очень несладко.

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

В начале 2022 года руководство приняло решение о необходимости запуска некоторого числа новых сервисов для клиентов. Но старое ПО этого не позволяло делать на уровне архитектуры. Да и планируемые нагрузки были кратно выше текущих. Поэтому я принял решение писать новую платформу, а переключение на нее делать поэтапным, по мере ввода соответствующих модулей.

Уверен, что такая же ситуация есть у многих компаний. Старое ПО не просто морально устарело, а перестает удовлетворять требованию бизнеса. У ИТ-отдела всегда возникает дилемма: внедрять «костыли» до последнего вздоха или вводить новое ПО. Я рекомендую поднимать вопрос нового ПО в следующих случаях:

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

Важно! Внедрение нового ПО должно опережать темп развития компании.

«Железо»

Если с этапами разработки ПО все было просто, то вот вопрос «железа» оставался не решенным до последнего.

Запускать на старом «железе» мы не могли. Оно по-прежнему функционирует под нагрузкой и обеспечивает работу бизнеса. Влезать в него ради проведения экспериментов слишком рискованно.

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

Ни то, ни другое нам было недоступно, и вот что я решил.

Заказал разработку базы данных, приближенную к требованиям для новой системы, чтобы спрогнозировать нагрузки. Если смотреть на нагрузку в разрезе работы программного кода, то основной «затык» происходит именно на уровне БД. Поэтому мы путем нескольких заходов нашли ту архитектуру, которая нас устроила. К слову, я 10-кратно увеличил требования по нагрузкам относительно требований, которые были по бизнесу. Это позволяет заложить резервы и под рост бизнеса, и под наши ошибки в расчетах. Нагрузочные тесты делали через эмуляцию трафика.

По «железу» решение было следующим. Компания выделила бюджеты на закупку новых серверов. Но вот какие именно покупать — мы не знали. Просто так набрать мощности «пальцем в небо» мы не могли, слишком высоки риски приобрести не то и просто потратить несколько миллионов.

Единственным вариантом остается облако. Выбрали «Яндекс Облако». Мы в целом не так чтобы сильно анализировали рынок облачных решений, нам требовалось облако только для этапа разработки и на первое время после запуска всей платформы. Выбор на «Яндекс» пал только потому, что наш подрядчик имел опыт работы с ним.

Цель следующая — в облаке мы можем оперативно настраивать мощности по мере развития платформы и вывода готовых модулей в «боевую» нагрузку. А как только вся разработка закончится и будет проведена опытная эксплуатация, мы сможем понять, какое в итоге «железо» нам нужно закупать.

Что делать со старым «железом»?

Мы его не списываем. Часть серверов в итоге пойдет в работу в новую архитектуру. Разумеется, нам понадобится провести регламентные работы по его подготовке, проверить диски, память, возможно, поменять ЦП и т. п.

Часть серверов пустим для локальных нужд. Прокачаем среду разработки, заменим «железо» на других проектах, найдем иное применение. Ну а с частью «железа» все же простимся. Выбросим или продадим — еще не знаем. Это нам предстоит решить до конца 2023 года.

В целом подход обновления «железа» через работу в облаке применим практически во всех случаях, когда нужно что-то решить с текущим «железом». Это дает вам:

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

И многое другое.

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

Также я пока не вижу смысла использовать облака для файлового хранилища. У нас есть выделенный сервер для хранения фототоваров. Его мы никуда переносить пока что не собираемся.

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

Эксплуатация

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

И старое и новое ПО сейчас работают в параллели. Старое «железо» и облако также под параллельной нагрузкой. Это нам нужно для «боевой» имитации нагрузки, чтобы подготовить новое ПО к запуску в режиме рубильника.

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

Резерв по «железу» мы заложили с запасом. По текущим прогнозам, нам его хватит лет на пять. Но даже если бизнес будет расти с опережением, у нас остается возможность как горизонтального, так и вертикального масштабирования (заложили это и в архитектуре «железа», и в архитектуре программного кода).