01Схема серверов
Пять ролей, семь коробок. Каждая роль отвечает ровно за одно.
Погонщик ×3
Самодостаточный цех: сам штампует холодные болванки, сам держит горячий запас, сам гоняет прогоны. Ничего ценного не хранит — умер, заменили, потерь нет.
- Ядра
- 8 (16 потоков)
- Память
- 64 ГБ (задано)
- Диски
- 2 × 1 ТБ NVMe, зеркало
Склад ×1
Пассивная архивация и хранение упакованных образов. Плюс эталоны, учёт завода и резерв. В прогонах не участвует.
- Ядра
- 16 (упаковка ест ядра)
- Память
- 64 ГБ
- Диски
- 2 × 2 ТБ NVMe + полка
Почтовик ×2
Приём кодов и выдача их клиентам по договору. Отдельный продукт, не часть завода. Требование — бесперебойность.
- Ядра
- 8
- Память
- 64 ГБ
- Диски
- 2 × 1 ТБ NVMe, зеркало
Сейф ×2
Не сервер, а дисковая полка. Копии архивов, паспортов, учёта и кода завода у двух разных хостеров. Наружу не смотрит.
- Объём
- от 5 ТБ
- Режим
- только дописывать
- Цена
- ≈ €13/мес каждая
Как связаны
- Погонщик → Склад. Готовые машины уезжают на упаковку. Единственный тяжёлый поток в схеме — см. раздел «Стены».
- Склад → Сейф. Упакованные архивы и паспорта, ночным ходом, без права стирать.
- Погонщик → Почтовик. Запрос кода при регистрации. Байты, нагрузки нет.
- Все → Склад. Учёт: статусы машин, журналы прогонов, карточки аккаунтов. Единицы мегабайт.
- Эталоны лежат копией на каждом погонщике — иначе пришлось бы возить болванки по сети, а это десять терабайт в сутки.
02Погонщик изнутри
Один сервер делает всё: штамповку, разогрев и прогоны. Считаем, что во что упирается.
| Что стоит на сервере | Штук | Память | Комментарий |
|---|---|---|---|
| Активные прогоны | 4 | 32 ГБ | сам конвейер |
| Горячая включённая | 1 | 8 ГБ | страховка на сорванное оживление |
| Горячие офлайн | 3 | — | разогреты и погашены, стоят только диска |
| Сборка болванок | 1 | 8 ГБ | занимает память лишь треть времени |
| Сам сервер | — | 8 ГБ | система и служебное |
| Итого | 9 | 56 из 64 ГБ | ровно 7 мест, всё занято |
Раньше схему «3 прогона + 3 горячих» отклонили: боялись, что разогрев новой машины поверх активных прогонов даст запаздывающие и смазанные кадры — ровно то, ради чего ферму и разносят по серверам. Горячий офлайн снимает это возражение полностью: разогрев уже произошёл заранее, запуск такой машины — это просто включение, без всплеска. Схема становится корректной.
Диски
Тринадцать машин по ~20 ГБ, местный запас холодных болванок и готовые, ждущие отправки — около 400 ГБ. Терабайтного зеркала хватает с запасом.
На действующем сервере Маков зеркала фактически нет: массивы объявлены парными, а диск в каждом один. На новых коробках эту ошибку повторять нельзя — смерть диска на погонщике означает потерю всех машин в работе.
03Три стадии: колд · хот · прогон
Где проходит граница между ними и что каждая оставляет после себя.
| Стадия | Что в неё входит | Чем заканчивается | Срок годности |
|---|---|---|---|
| Колд | уникальное железо, чистая система, связка ключей. Ничего про страну, ничего про сеть | заморозка, сеть в карантине | бессрочно |
| Хот | всё, что привязывает машину к стране: туннель, проверка утечек, часовой пояс и язык, персона, почта, паспорт | машина гасится — память не держит | 2 часа |
| Прогон | включение готовой, быстрая проверка что туннель жив и адрес тот же, дальше регистрация и вход | аккаунт или провал | один спринт, один адрес |
Смысл границы: всё дорогое и медленное — подбор чистого выхода в сеть, страна, персона — делается заранее и остаётся на диске. Прогону остаётся только включить машину.
Всё остальное в стадии «хот» вечно — оно лежит на диске. А туннель нет. Значит выключенный горячий запас обязан расходоваться за два часа. При четырёх-пяти потоках запас из трёх машин оборачивается за двадцать минут — укладываемся с огромной форой. А вот запас в десять машин «на всякий случай» бессмысленен: половина протухнет.
Если горячая простояла дольше двух часов, при старте придётся заново поднимать туннель и проверять утечки — это ещё полторы минуты, и выигрыш почти исчезает. Просроченная горячая не экономит ничего.
Сколько занимает взять машину
| Откуда берём | До готовности | Чем платим |
|---|---|---|
| Горячая включённая | секунды | слот памяти всё время ожидания |
| Горячая выключенная (в пределах 2 часов) | 40–90 сек | только одна загрузка |
| Горячая просроченная | ~2,5 мин | загрузка + туннель заново |
| Холодная, полное оживление | ~3 мин | загрузка + 100 сек ожидания сети |
«Дополнительные проверки» на входе в прогон изобретать не нужно — они в коде: адрес выхода прощупывается через туннель с тремя попытками, при молчании перестилается приёмник и проба повторяется.
04Замеры: из чего состоит сборка
Медиана по пятнадцати последним сборкам действующего завода. Не оценка — журнал.
| Шаг | Секунд | Доля | Чем грузит |
|---|---|---|---|
| Копирование с эталона + правка железа | 153 | 48% | диск · машина выключена |
| Настройка внутри системы | 62 | 19% | лёгкое · машина работает |
| Правка меток диска | 33 | 10% | диск · машина выключена |
| Загрузка | 27 | 8% | всплеск процессора |
| Заморозка | 23 | 7% | диск |
| Вход и связка ключей | 18 | 6% | лёгкое |
| Правка учётной записи | 6 | 2% | ничто |
| Вся сборка | 322 | 5,4 мин | — |
Больше половины сборки машина вообще не запущена. Копирование, правка меток и заморозка — 209 секунд из 322, и всё это время память не занята. Работает машина только последние две минуты. Поэтому штамповка на том же сервере, что и прогоны, обходится куда дешевле, чем кажется.
Остальные этапы, для сравнения
| Этап | Длительность | Память занята |
|---|---|---|
| Сборка холодной болванки | 5,4 мин | ~40% времени |
| Оживление (разогрев горячей) | 3–4 мин | всё время |
| Вход в устройство | 7–35 мин, обычно 12–15 | всё время |
| Полный прогон до готового аккаунта | 25–30 мин | всё время |
05Три нагрузки — кто чем платит
Самый практичный вывод всего расчёта.
Диск ← копирование
16 ГБ за 153 секунды — это ~200 МБ/с. Диск NVMe тянет две-три тысячи. Сборка съедает около десяти процентов дисковых возможностей. Даже три параллельных — треть, и прогонам это не мешает: они диск почти не трогают.
Процессор ← загрузки
Дорого не копирование, а загрузка: 27 секунд по два-четыре ядра. На цех выходит 432 загрузки в сутки — одна каждые 3,5 минуты, то есть примерно 15% времени что-то грузится. Шестнадцать потоков это переваривают, если одновременных загрузок не больше двух-трёх.
Память ← время
Память покупается длительностью. Прогон держит слот полчаса, горячий в ожидании — часами, а сборка всего две минуты. Поэтому главные едоки — прогоны и горячий запас, а штамповка на их фоне мелочь.
Итоговый порядок: память съедают прогоны и горячий запас, процессор — загрузки, диск — копирование. И только диск относится к штамповке, а по нему запас десятикратный.
06Единственное узкое место — память
Железо задано: 64 ГБ. Считаем, что из этого выходит.
При 64 ГБ схема «3 прогона + 3 горячих + штамповка» сходится ровно в ноль:
| При 64 ГБ | Память |
|---|---|
| 3 прогона + 3 горячих онлайн | 48 ГБ |
| Сам сервер | 8 ГБ |
| Одна сборка в работе | 8 ГБ |
| Итого | 64 из 64 ГБ — запас нулевой |
Вторая параллельная сборка уже не влезает. А нужна как раз примерно одна непрерывная: 216 болванок в сутки × 5,4 минуты = девятнадцать машино-часов, сборщик почти не простаивает.
Начинать с четырёх потоков, а не пяти. Каждый старт прогона съедает болванку — включая неудачный. Пять потоков дают 232 старта в сутки, то есть сборщику 21 час работы из 24 — загрузка 87%, запаса нет. Четыре потока дают 186 стартов и 70% загрузки — конструкция начинает дышать. Пятый поток добавляет 20% выхода, но забирает весь запас прочности. Включать его стоит, когда всё остальное отлажено.
| Схема | Потоков | Аккаунтов в сутки | Запас памяти |
|---|---|---|---|
| 3 цеха × 4 потока | 12 | ~560 | сборщик на 70% |
| 3 цеха × 5 потоков | 15 | ~700 | сборщик на 87%, впритык |
| 5 цехов × 4 потока | 20 | ~930 | цель достигнута |
07Склад: упаковка и хранение
Пассивная архивация. В прогонах не участвует, но именно здесь самая большая цифра.
Работа
Упаковка одного аккаунта — 10–20 минут сжатия. При 648 в сутки это 162 машино-часа в день, то есть нужно семь упаковщиков круглосуточно. Восьми ядер не хватит — 16 ядер минимум. Памяти много не нужно, а вот диск нужен быстрый и просторный как перевалочная площадка.
Хранение
Архив аккаунта весит 1,4 ГБ — это уже с учётом того, что одинаковые куски системы не дублируются.
| Период | Объём | Порядок цены |
|---|---|---|
| Сутки | 907 ГБ | — |
| Неделя | 6,4 ТБ | полка на 5 ТБ забивается за 5,5 дней |
| Месяц | 27 ТБ | ≈ €60–80 в месяц |
| Год | 331 ТБ | ≈ €700 в месяц и растёт |
Без неё расходы растут бесконечно. Рабочий вариант: держать полный образ 30 дней (27 ТБ, ≈€60–80 в месяц), а дальше оставлять от аккаунта только паспорт с ключами и доступами — мегабайты вместо гигабайтов. Тогда расходы встают на месте вместо бесконечного роста.
08Почтовик
Отдельный продукт: аренда ящиков по договору. Здесь — только место в раскладке.
Масштаб: 27 тысяч новых адресов в сутки, 50–150 тысяч приходящих кодов, 50–100 тысяч адресов живут одновременно. Из этого следует, что адрес живёт два-три дня и выгорает — это проток, а не склад, и размер не растёт бесконечно.
Приём почты
150 тысяч в сутки = 2 письма в секунду, десяток в пик. Обычный почтовый сервер держит сотни в секунду. Запас стократный, узким местом не будет никогда.
База состояния
До миллиона записей в сутки — лёгкая нагрузка. Накопление ≈50 ГБ в год. Терабайт покрывает годы. Важна не ёмкость, а скорость диска и память под указатели.
Выдача клиентам
Весь риск здесь, и он конструктивный, не железный. Если клиенты опрашивают — 16 тысяч запросов в секунду. Если уведомляем сами — два. Разница в восемь тысяч раз.
Уведомлять, а не давать опрашивать · приём и выдача разными процессами через очередь · база отдельной сущностью с первого дня · ничего не держать в памяти процесса · почтовые записи сразу на два приёмника · учёт по клиентам с первого дня · срок хранения писем с первого дня · копия базы на вторую машину в реальном времени.
У почты есть штатный запасной приёмник: если основной лежит, отправитель сам повторяет и отдаёт запасному. Письма не теряются в принципе — приходят с задержкой, и стоит это ноль. Ломается не приём, а выдача — её и дублируем парой узлов у разных хостеров.
09Сейф — почему отдельно от почтовика
Требования противоположны, поэтому одной коробкой их не закрыть.
Почтовик
Живой сервис. Обязан торчать наружу и быть доступен круглосуточно. Данных почти нет — письма транзитные. Требование: бесперебойность.
Сейф
Холодный склад. Может быть выключен полсуток. Наружу смотреть не должен вообще. Требование: сохранность и объём.
Сложить их вместе — значит поставить самое ценное за самой атакуемой дверью. Плюс разные судьбы: почтовик растёт как продукт, архив вечен и его не трогают.
Сейф стоит держать в режиме «только дописывать» — тогда ни взлом завода, ни ошибочная команда не сотрут архивы, можно лишь добавить новые. Две полки у разных хостеров: две полки в одном дата-центре — это один пожар, а не резерв.
10Стены схемы
Три места, где конструкция упирается при 648 аккаунтах в сутки. Все три — про одно и то же.
| Где | Сколько | Что это значит |
|---|---|---|
| Подвоз болванок по сети | 10,4 ТБ/сут | гигабитный канал на 100% круглосуточно |
| Отдача готовых машин | 11,7 ТБ/сут | та же стена, зеркально |
| Рост архивов | 907 ГБ/сут | 331 ТБ в год |
Все три стены — про то, что мы возим и храним целые машины. При трёх аккаунтах в сутки это нормально, при шестистах разваливается. Лекарство одно: возить рецепты и паспорта, а не диски.
- Штамповку — на сами цеха. 216 болванок в сутки × 5,4 минуты = девятнадцать машино-часов, то есть примерно один непрерывно работающий сборщик. Это ровный фоновый ручеёк, а не пик, ради избавления от которого затевался разнос. Эталоны кладём копией на каждый цех: 186 ГБ разово вместо десяти терабайт в сутки.
- Архив — паспорт, а не образ. Машина нужна, чтобы аккаунт создать и получить доверие. Дальше аккаунт работается без неё. Значит хранить надо ключи, доступы, отпечаток железа и рабочую сессию — мегабайты вместо пятнадцати гигабайт.
Заморозка не переезжает вместе с машиной. На приёмнике обязательна повторная заморозка, иначе оживление не найдёт точку отката.
11Что решить до покупки железа
- Аккаунты после создания живут дальше как рабочие активы? Если аккаунт выпускает адреса каждый день, он не товар на полке, а работающий станок — тогда образ вообще не надо архивировать: из машины извлекается рабочая сессия, машина сносится, станок крутится дальше. От ответа зависит, нужен сейф на 5 терабайт или на 500, а это разница между €13 и €700 в месяц.
- Пятьдесят-сто тысяч адресов «в моменте» — это запас на полке или одновременные аренды? Разница в десять раз по нагрузке на выдачу.
- Только адреса Apple или свои домены тоже? Свои безлимитны и стоят копейки, но не несут доверия Apple. Скорее всего продукт двухуровневый — и от этого зависит вся учётная часть.
- Срок хранения полных образов. Тридцать дней — рабочая отправная точка, но это решение про деньги, а не про технику.