LINUX.ORG.RU
ФорумAdmin

Развёртывание в суровый научный продакшн

 ,


0

4

(Ломоносовы наших дней, как сказать production по-русски?)

У нашей лаборатории есть сервер. Когда-то его брали, чтобы запустить на нём веб-интерфейс для научного кода, разработанного в нашей же исследовательской группе. Код написан в «лучших» традициях научного программирования, для работы требует FFTW и BLAS, а также базу данных MySQL со строго определённым содержимым. Веб-интерфейс сделан на Perl5, всё это более-менее хорошо работает.

Прошло время. Обстоятельства потребовали разместить на этом же сервере: NextCloud, ещё научный код (Python3, 1,3-гигабайтное виртуальное окружение), MediaWiki для другой исследовательской группы, а сейчас ещё и статический сайт для третьей исследовательской группы.

NextCloud из архива, как ни странно, есть не просит (но им почти не пользуются) и даже может сам себя обновлять без особых проблем. Научный код активно сопротивляется попыткам его опакетить и поэтому живёт прямо в системах контроля версий. (Было хуже. Когда мы начинали, научный код жил в виде папки на общем диске.) Он даже работает в двух экземплярах на разных поддоменах, один - для обкатки новых функций, другой - стабильная версия для всего мира. MediaWiki не простая, а семантическая, поэтому в дистрибутивную копию MW пришлось распаковать zip-архивы с расширениями. Коллегам со статическим сайтом нужен доступ по SFTP, чтобы сайт изредка редактировать. Всему этому нужны свои файлы конфигурации для nginx.

Как это всё разворачивать, чтобы ничего не забыть и не сойти с ума? Читал про Ansible, cdist, Chef, CFEngine, Puppet, но это скорее про организацию целой кучи машин; некоторые из них запускают специальный сервер обновления конфигурации. Для нашего одного VPS это из пушки по воробьям. Мне проще и безопаснее подключиться по SSH с аутентификацией по ключу, чем разбираться, как обезопасить ещё один сервер.

Сейчас всё сделано через пачку sh-скриптов общей длиной менее 500 строк кода, аккуратно написанных так, чтобы они были идемпотентными. Если что-то падает, безопасно исправить ошибку и перезапустить скрипт с самого начала. Чтобы убедиться, что скрипты работоспособны, почти все изменения в состояния сервера я сначала вношу в скрипт, а потом запускаю скрипт, чтобы их применить.

Но сложность скриптов только растёт, и там уже происходит очень много всего: пользователей создать, файлы распаковать, конфигурацию подложить, базу создать, права раздать, сертификаты получить. Как сделать систему, которую, если что, сможет поддерживать другой человек?

★★★★★
Ответ на: комментарий от adn

Боты тоже были. Без них, к сожалению pvp не взлетает.

Вы даже в терминологии в своей сфере плаваете, это PvPvE.

не можешь. даже не пытайся со своим жалким 100 rps.

Чекаут (оформление заказа) с оплатой через банки является одним из самых нагруженных запросов которые существуют в современном вебе.

Никакие игрульки с обновлением большей части инфы по UDP с этим не сравнятся. Я знаю о чем говорю тк том числе и писал мозги ботам.

Obezyan
()
Ответ на: комментарий от Obezyan

Чекаут (оформление заказа) с оплатой через банки является одним из самых нагруженных запросов которые существуют в современном вебе.

Ты вроде сам писал эффект Даннинга-Крюгера. Вот ты как раз хрестоматийное ему подтвеждение. Знаний и опыта ноль, но самомнение зашкаливает.

adn ★★★★
()
Ответ на: комментарий от adn

Вам бы на секунду допустить мысль что человек за 20 лет мог поучаствовать и в GameDev и в eCommerce, и может сравнивать, но видимо это слишком сложная мысль для девопса. Впрочем, я и не питал иллюзий.

Obezyan
()
Ответ на: комментарий от Obezyan

Вам бы на секунду допустить мысль что человек за 20 лет мог поучаствовать и в GameDev и в eCommerce, и может сравнивать

Блин, кто в 2000х не работал eCommerce? Мне просто тоже есть с чем сравнивать. Но если ты считаешь 100 rps с latency 100 ms верхом инженерного искусства, то это очень много говорит о твоей квалификации в архитектуре высоконагруженных сервисов.

adn ★★★★
()
Ответ на: комментарий от adn

Но если ты считаешь 100 rps с latency 100 ms верхом инженерного искусства, то это очень много говорит о твоей квалификации в архитектуре высоконагруженных сервисов.

Для чекаута - да, считаю. Для геймдева - нет, там совершенно другой подход тк нет third party services от которых зависит результат (ответ). В геймдеве самое тяжёлое это гарантированные сообщения по TCP которыми должны каждый тик обновляться определённые обьекты. Но это вообще не та нагрузка на апи как в екоммерсе.

В геймдеве проблема масштаба, в екоммерсе проблема зависимости от третьесторонних систем. Мне буквально приходилось работать с командами разработки крупнейших мировых платежных систем чтобы ускорить процесс обработки, при этом результат обкатывался на моем клиенте после чего раскатывался на весь мир клиентам этого платежного сервиса (b2b). А в геймдеве главное отделить зерна от плевел, зерна по TCP, плевелы по UDP, геноцид тикающих объектов и битовые маски на все что можно вплоть до разрушаемости зданий.

Obezyan
()
Ответ на: комментарий от adn

disaster recovery plan (что делать когда это все умрет)

Тут надо смотреть конкретную ситуацию, общего описания недостаточно. Единственное что точно нужно это бекапы.

завидую тебе. ты живешь в идеальном мире

Да нет, вполне реальном. Если сервис вида «готовая коробка» то менять в нём обычно ничего не нужно. Ну ладно, может иногда совсем редко что-то. Если сервис собственной разработки то конечно поддержка требуется.

firkax ★★★★★
()
Ответ на: комментарий от adn

Я не понимаю этих меряний rps. Если у тебя софт горизонтально масштабируется то всё упирается в мощность железа. Твоё же 40k rps и 10m юзеров сомневаюсь что все были в монолитном игровом мире с бесшовной физикой. Да и сами rps могут быть совершенно разные, где-то http с отдачей тяжёлых отрендеренных веб-страниц, где-то http но уже лёгкое апи, где-то другие протоколы с не-вебом.

Разве что уровень ответственности за падение сервиса обозначить, но тут лучше не rps а количество одновременных юзеров.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Я не понимаю этих меряний rps.

я не планировал - меня просто выбесило про 100 rps.

Если у тебя софт горизонтально масштабируется то всё упирается в мощность железа.

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

10m юзеров сомневаюсь что все были в монолитном игровом мире с бесшовной физикой.

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

adn ★★★★
()
Ответ на: комментарий от gagarin0

в итоге какой стек технологий использовали ?

там много разных логических частей было, но если кратко, то балансеры/proxy на nginx, nodejs (c какой-то хитрой асинхронной библиотекой), кластер kafka и vector для обмена сообщениями и метриками между компанентами, несколько кластеров sentinel, кластер mongodb (с хитрым движком), кластер postgres (patroni), rabbitmq для очередей и clickhouse для аналитики. Ну и внешняя CDN-ка и dns в cloudflare, которые динамически управлялись сиcтемой оркестрации (nomad+consul). frontend на unity.

adn ★★★★
()
Ответ на: комментарий от adn

vector

собственно я ради этого и спрашивал, имею с ним положительный опыт в трансформации и роутинге событий

особенно я преуспел в трансформации сообщений при помощи lua, удобно и дешево оказалось.

забавный конечно зоопарк у вас, вы использовали schema registry (реестр схем jsonschema/avro) где хранились описания формата данных которые могут ходить по «шине» событий?

gagarin0
()
Ответ на: комментарий от gagarin0

вы использовали schema registry (реестр схем jsonschema/avro) где хранились описания формата данных которые могут ходить по «шине» событий?

неа :( У нас конечное количество этих событий было, которые отправлялись в соответствующие топики. (очень дубовое решение, я знаю)

собственно я ради этого и спрашивал, имею с ним положительный опыт в трансформации и роутинге событий

vector очень классный и безумно удобный после использования fluentd.

adn ★★★★
()
Последнее исправление: adn (всего исправлений: 1)
Ответ на: комментарий от adn

неа :(

где-то два года назад стало модным для кафки

https://docs.confluent.io/platform/current/schema-registry/index.html

https://instaclustr.medium.com/exploring-karapace-the-open-source-schema-registry-for-apache-kafka-part-3-introduction-3b4450768450

Schema Registry provides a centralized repository for managing and validating schemas for topic message data, and for serialization and deserialization of the data over the network. Producers and consumers to Kafka topics

кстати, в сторону dapr или triggermash не смотрели? (в trigger mash довольно интересные решения, но проект с прошлого года отправился в архив)

gagarin0
()
Ответ на: комментарий от firkax

Опиши подробнее что скрывается за словом «разворачивать».

Предположим, завтра кто-нибудь из наших студентов напишет ещё полезное научное ПО на каком-нибудь shiny, и его тоже придётся ставить на этот сервер. В отрыве от контекста это дело пяти минут: R установить, пакеты установить, shiny запустить. Но если так это и оставить, оно даже перезагрузку сервера не переживёт, не говоря уже об обновлениях ОС и системных библиотек.

Я так понимаю у тебя уже есть сервер и на нём всё и так развёрнуто. Ты второй хочешь такой же? Или «разворачивать» = «обновлять»?

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

AITap ★★★★★
() автор топика
Ответ на: комментарий от AITap

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от Obezyan

apt-get install fftw3 fftw3-dev libblas-dev …

Это да, сделали. Портировать саму программу на GNU/Linux уже было довольно весело. До сих пор среди флагов компиляции находится -D stricmp=strcasecmp -D 'itoa(i,s,_)=sprintf((s),"%d",(i))', потому что эти нестандартные конструкции встречаются где-то в коде.

Создать git репозитарий

Забыл сказать, скрипты с самого начала живут в Fossil-репозитории.

Начать уже писать документацию, что, для чего и как поднято и положить в этот репозитарий.

В нём же живёт README.md с описанием поднятых процессов. Возможно, стоит зайти с другой стороны и переписать описание на уровне сервисов («сайт с физической моделью», «сайт с ML моделью», «Wiki»…), а не серверов (nginx, MariaDB, gunicorn…).

AITap ★★★★★
() автор топика
Ответ на: комментарий от AITap

на каком-нибудь shiny

за вас все уже сделали

https://hub.docker.com/r/rocker/shiny

Второй такой же не хочу.

вам нужен второй сервер, перед тем как выкатывать изменения на «живой» сервер

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

gagarin0
()
Ответ на: комментарий от Bad_ptr

А как быть с обновлениями? На текущем VPS стоит стабильная версия популярного дистрибутива, регулярно скачивает обновления безопасности. Если надо обновить ядро, присылает мне письмо, я перезагружаю, когда всем удобно. Если разделить систему на контейнеры, один из них точно будет требовать серьёзных обновлений безопасности (который с nginx и закрытыми ключами TLS от всех доменов), как и хост (чьё ядро).

Получается, нужно будет плюс к обновлениям хоста регулярно пересобирать образ одного или нескольких контейнеров? Или настраивать на всех троих автоматические обновления?

AITap ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Но если «другой человек» это не голая абстракция, а часть задачи, то нужно переходить на другой уровень

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

AITap ★★★★★
() автор топика
Ответ на: комментарий от firkax

Кстати, nextcloud (как и практически всё где в названии есть слово cloud) это какое-то ненужно и я бы постарался его вычеркнуть из списка заранее.

Он неидеален, но против удобства других людей не попрёшь. Коллегам на нём оказалось удобно делать опросы и совместно редактировать всякую чушь на Markdown. Возможно, Cryptpad был бы лучше, но системные требования в сочетании с Node.js and Docker engine настораживают ещё больше, чем шматок кода на PHP.

AITap ★★★★★
() автор топика
Ответ на: комментарий от gagarin0

https://hub.docker.com/r/rocker/shiny

Контейнеры rocker хороши, особенно r2u, но неидеальны. Например, в r-devel-san как вырубили AddressSanitizer 7 лет назад, так обратно и не включили. Если пакет выгоняют с CRAN за проблемы с GCC-ASan, придётся искать другой контейнер, ну, или собрать R самому.

вам нужен второй сервер, перед тем как выкатывать изменения на «живой» сервер

100% таким же второй сервер всё равно не будет, как минимум, из-за доменов и соответствующих TLS-ключей. (А системный администратор нашего заведения недавно умер. Есть ли у кого-то пароль от всего, на чём держится факультет, доподлинно неизвестно, но нас уверяют, что DNS-записи изменить смогут, если очень потребуется.)

Но можно взять виртуалку и пропускать на ней запуск certbot. Должно подойти в качестве тестовой среды.

AITap ★★★★★
() автор топика
Ответ на: комментарий от firkax

Но, конечно, не докер которые некоторые выше советовали. В идеале freebsd jail, но если не хочешь менять ОС, то можно попробовать LXC

Исходя из опыта использования LXC и podman, делаю выводы, что они решают немного разные задачи. LXC - это как виртуалка, но более тонкая, ей не нужно работать за целый процессор и железо. В остальном на нём получалось делать примерно то же, что раньше делал на виртуалке. Podman использует те же технологии, но во всю фокусируется на запуске специализированных образов (программа X, а не просто там Debian или Fedora), а его виртуалки могут быть временными, иногда даже одноразовыми. Очень удобно, когда у человека на другом конце планеты всё ломается, когда он делает вот так, и есть готовый образ контейнера, в котором вот так можно сделать.

А к чему ближе FreeBSD Jail?

AITap ★★★★★
() автор топика
Последнее исправление: AITap (всего исправлений: 1)
Ответ на: комментарий от AITap

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

firkax ★★★★★
()
Ответ на: комментарий от AITap

А системный администратор нашего заведения недавно умер.

светлая память

Если пакет выгоняют с CRAN за проблемы с GCC-ASan, придётся искать другой контейнер, ну, или собрать R самому.

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

  1. guix

  2. nix

  3. lxc

  4. docker

вам нужно понять, какой инструмент использовать, я рекомендую первый, guix

100% таким же второй сервер всё равно не будет, как минимум, из-за доменов и соответствующих TLS-ключей.

Эту проблему решили давно

https://github.com/nginx-proxy/acme-companion

gagarin0
()
Ответ на: комментарий от AITap

Возможно, стоит зайти с другой стороны и переписать описание на уровне сервисов («сайт с физической моделью», «сайт с ML моделью», «Wiki»…), а не серверов (nginx, MariaDB, gunicorn…).

Да, судя по уточнениям все остальное у вас есть. Осталось описать какие сервисы используются в каждом разделе, дать ссылку на их конфиги в виде файлов в вашей базе знаний, а также коротко описать в каких каталогах они должны лежать и какими командами происходит start, stop, restart.

Т.к. у вас вполне стандартный набор сервисов то подобной документации будет достаточно.

Obezyan
()
Ответ на: комментарий от AITap

Не слушайте советов девопсов, они советуют то что делает их существование осмысленным, но не решает поставленную задачу. Вы же не хотите чтобы у вас завелись девопсы? :)

Obezyan
()
Ответ на: комментарий от AITap

посмотрите на marimo.io оно типо conda но с приместью литературщины Кнутия(об этом не слова в их питчах) типо нотебучье но исходно правильное - как раз предназначенное для и лёкого и прозначного самаходного

qulinxao3 ★☆
()