Руководства по миграции
Чек-лист миграции
Dry run, валидация, cutover, откат — чек-лист на день переключения.
Чек-лист миграции
Чек-лист на день переключения дополняет per-source гайд. Можно копировать в launch-тикет.
До начала
- Прочитан per-source гайд (database, Algolia, Elasticsearch, Meilisearch, Typesense).
- Заведены организация, проект и минимум один API-ключ — см. API-ключи.
- Схема описана и отревьюирована (имена, типы, кандидаты
query_by/filter_by/sort_by). - Решена модель арендатора: single или per-tenant индекс. См. Изоляция арендаторов.
- Решена модель cutover: dark-launch или окно отката. См. обзор.
- 100 запросов из аналитики готовы для валидации.
Dry run
В staging-проекте минимум за 48 часов до cutover.
- Создан индекс AACsearch в staging с выбранной схемой.
- Прогнан экспорт из источника — замерено время на полный корпус.
- Прогнан импорт в AACsearch — замерены ingest lag и время полного flush.
-
searchIndex.getHealth.driftPercent< 5 %. - 100-query валидация. Классификация identical / mostly-same / drift.
- Триаж drift: фикс в схеме (чаще всего), в
query_by_weightsили в курации. - Повторный dry run после фиксов — drift падает.
- Запомнили время полного импорта (нужно для реального cutover).
Валидация
После dry run, до flip-а прода:
- Doc count:
count(*)источника =searchIndex.getHealth.actualDocCount. - Все 100 запросов возвращают результаты (нет неожиданно пустых).
- Top-5 для ≥ 80 % запросов стабилен между прогонами (нет случайного порядка).
- Facet counts на сэмпл-запросе совпадают между staging и источником ±1 %.
- Filter-запросы (
price < X,category = Y) возвращают те же документы. - Sort-запросы (
createdAt:desc) — те же порядки. - Негативный тест изоляции: scoped-токен арендатора A, поиск известного документа B → 0 хитов. См. Изоляция арендаторов.
- Пустой query (без
q) — фасеты без хитов, без 5xx. - Unicode-query (диакритика, кириллица, CJK) — ожидаемые результаты.
- Очень длинный query (>500 символов) — gracefully.
- Query с операторами (
"phrase match",-excluded) — как в документации.
Pre-cutover
В сутки до:
- Cutover назначен на тихое окно (бизнес знает когда).
- Информированы: инженерия, саппорт, ops, customer-success.
- Если есть статусная страница — черновик maintenance-notice готов, не опубликован.
- Путь отката проверен: старый поднимет трафик при flip-back.
- Мониторинг подключён — см. Мониторинг. Четыре сигнала должны алертить.
- On-call расписан на окно + 4 часа после.
- Финальный импорт из источника в прод-индекс. (Если у вас delta sync — последний полный, перед началом delta.)
- Doc count в проде совпадает.
Cutover
Окно само.
- T-0: Все за клавиатурой. Статусная страница опубликована.
- T-0+0: Финальный delta sync из источника (если применимо).
- T-0+5: Doc count в AACsearch = источник.
- T-0+5: Flip feature flag / конфига маршрутизации поиска на AACsearch.
- T-0+10: 100-query валидация в проде.
- T-0+15: Четыре сигнала мониторинга — зелёные.
- T-0+15: Sentry / error tracker — без новых классов ошибок.
- T-0+30: Baseline
latencyMsиз прод-телеметрии. Сравнение с источником. - T-0+60: Статусная страница — operational. Внутренний нотис разослан.
Если шаг падает — откат.
После cutover
- Первый час: on-call ревью search-аналитики — zero-result, click-through.
- Первые 4 часа: старый читает. Спот-чек top-результатов на сэмпле живых запросов.
- Первые 24 часа: ревью алертов. Тюнинг шумных.
- Первые 7 дней: старый — тёплый (без записей). Готовы flip-back.
- День 7: decom старого. Снять флаг отката из приложения.
- День 14: post-migration ретро. Что работало, что нет, что фиксить.
Откат
Во время/сразу после cutover миграция явно плоха (битые результаты, ошибки > 0.1 %, latency × 2):
- Flip feature flag обратно на старый. Секунды.
- Проверить: старый обслуживает трафик, результаты корректные.
- Расследование offline — не повторять cutover до root cause.
- Коммуникация: статусная страница, внутренний нотис, ретро запланировано.
Откатный флаг — одна строчка конфига. Если нужен code deploy — слишком медленно; чините до cutover, не во время.
Что значит «всё хорошо» к 7-му дню
- Zero-result rate такой же (или ниже) старого.
- CTR на top-3 такой же или лучше.
- p95 latency на уровне старого или ниже.
- В фидбеке нет новых паттернов («поиск ощущается иначе» без специфики — ОК; «не находит вчера проданный товар» — нет).
- Четыре сигнала держат зелёный 96+ часов.
Зелёные — выводим старый по графику. Жёлтые на 7-й день — продлеваем окно отката; fallback, который может ещё пригодиться, не выводим.