diff --git a/README.md b/README.md index 27f8fa9..4eaf307 100644 --- a/README.md +++ b/README.md @@ -1340,9 +1340,260 @@ P_reject = 0.70 × 0.886 × 0.181 = 0.112 = 11.2%

(К началу)

-## Геораспределённая миграция +## Геораспределенная миграция + +**Механизм кросс-датацентровой миграции** + +Кросс-датацентровая миграция данных позволяет переносить данные между географически распределенными кластерами futriix без остановки работы системы. Миграция основана на асинхронной репликации с использованием CDC (Change Data Capture) и устойчивой очереди изменений. + +Миграция данных между датацентрами реализована на основе асинхронной репликации с **CDC (Change Data Capture)** и включает следующие ключевые компоненты: + +1. Change Queue — устойчивая очередь изменений (до 100 000 записей), сохраняемая на диск. Каждое изменение получает уникальный LSN (Log Sequence Number) для отслеживания прогресса. + +2. Checkpoint System — система чекпоинтов, позволяющая возобновить миграцию с места остановки. Чекпоинты сохраняются каждые 30 секунд и содержат информацию о последнем LSN и обработанных документах. + +3. Delta Sync — после основной миграции система продолжает синхронизировать изменения, произошедшие во время миграции, обеспечивая консистентность данных. + +4. Валидация — после завершения миграции выполняется выборочная проверка данных (по умолчанию 10% документов) с использованием SHA-256 контрольных сумм. + +
+ +**Жизненный цикл миграции:** + +```sh +Idle → Preparing → Migrating → Delta Sync → Validating → Completed +``` +**Режимы работы:** + +1. manual — полностью ручное управление +2. semi_auto — основная миграция вручную, дельта-синхронизация автоматическая +3. auto — полностью автоматическая непрерывная миграция + +
+ +**Команды управления:** + + * migration start [db] [collection] — запуск миграции + * migration status [task_id] — статус миграции + * migration list — список всех задач + * migration pause/resume/cancel — управление задачей + * migration stats — статистика + * migration config — конфигурация + * migration queue — состояние очереди изменений + +
+ +**Компоненты системы** + +| Компонент | Описание | Настройки | +|-----------|----------|-----------| +| **Source DC** | Исходный датацентр с данными для миграции | `migration.source.*` | +| **Target DC** | Целевой датацентр для приема данных | `migration.target.*` | +| **Change Queue** | Устойчивая очередь изменений (CDC) | `100k записей, LSN` | +| **Data Transfer** | Параллельная передача данных с сжатием | `workers, compression` | +| **Checkpoint & Resume** | Чекпоинты для возобновления миграции | `checkpoint_interval_sec` | +| **Delta Sync** | Синхронизация изменений после основной миграции | `interval_sec, max_lag_sec` | +| **Validation** | Проверка целостности данных | `sample_percent, max_errors` | + +**Графическое изображение жизненного цикла миграции** + +### Жизненный цикл миграции + +| Этап | Описание | Переход к следующему этапу | Действия пользователя | +|------|----------|---------------------------|----------------------| +| **IDLE** | Начальное состояние, миграция не запущена | `migration start` | Запуск новой миграции | +| **PREPARING** | Сбор метаданных, анализ структуры данных, подсчёт документов | Автоматически после завершения подготовки | Мониторинг прогресса | +| **MIGRATING** | Основная передача данных из источника в приёмник | Автоматически после завершения передачи | `migration pause`, `migration status` | +| **DELTA_SYNC** | Синхронизация изменений, произошедших во время миграции | Автоматически после синхронизации | `migration pause`, `migration status` | +| **VALIDATING** | Проверка целостности данных (контрольные суммы) | Автоматически после валидации | `migration status` | +| **COMPLETED** | Миграция успешно завершена | — | `migration validate`, `migration list` | + +### Обработка исключительных состояний + +| Текущий этап | Исключительное состояние | Переход | Описание | +|--------------|--------------------------|---------|----------| +| **MIGRATING** | Приостановка пользователем | → **PAUSED** | Пользователь выполнил `migration pause` | +| **DELTA_SYNC** | Приостановка пользователем | → **PAUSED** | Пользователь выполнил `migration pause` | +| **PAUSED** | Возобновление пользователем | → **MIGRATING** | Пользователь выполнил `migration resume` | +| **PAUSED** | Отмена пользователем | → **FAILED** | Пользователь выполнил `migration cancel` | +| **MIGRATING** | Критическая ошибка | → **FAILED** | Сетевой сбой, отказ узла, таймаут | +| **DELTA_SYNC** | Критическая ошибка | → **FAILED** | Сетевой сбой, отказ узла, таймаут | +| **PREPARING** | Критическая ошибка | → **FAILED** | Недоступность источника или цели | +| **VALIDATING** | Ошибка валидации | → **COMPLETED** | Ошибки логируются, миграция завершается | + +### Таблица переходов состояний + +| Из состояния | Событие | В состояние | +|--------------|---------|-------------| +| IDLE | `migration start` | PREPARING | +| PREPARING | Подготовка завершена | MIGRATING | +| PREPARING | Ошибка | FAILED | +| MIGRATING | Передача завершена | DELTA_SYNC | +| MIGRATING | `migration pause` | PAUSED | +| MIGRATING | Ошибка | FAILED | +| DELTA_SYNC | Синхронизация завершена | VALIDATING | +| DELTA_SYNC | `migration pause` | PAUSED | +| DELTA_SYNC | Ошибка | FAILED | +| VALIDATING | Валидация завершена | COMPLETED | +| VALIDATING | Ошибка валидации | COMPLETED | +| PAUSED | `migration resume` | MIGRATING | +| PAUSED | `migration cancel` | FAILED | +| COMPLETED | — | — | +| FAILED | `migration resume` (после исправления) | MIGRATING | +| FAILED | `migration cancel` | FAILED | + +### Временные метрики этапов + +| Этап | Типичная длительность | Факторы влияния | +|------|----------------------|-----------------| +| **PREPARING** | 1-10 секунд | Количество баз данных и коллекций | +| **MIGRATING** | Зависит от объёма данных | Размер документов, пропускная способность сети, `batch_size`, `workers` | +| **DELTA_SYNC** | Зависит от количества изменений | Интенсивность записи во время миграции, `interval_sec` | +| **VALIDATING** | 5-30% от времени миграции | `sample_percent`, размер документов | +| **PAUSED** | Неограниченно | Время до возобновления пользователем | +### Поток данных + +| Этап | Действие | Данные | +|------|----------|--------| +| 1 | Сбор метаданных | Список БД, коллекций, индексов | +| 2 | Подготовка данных | Сериализация документов | +| 3 | Сжатие | Snappy/LZ4/Zstd | +| 4 | Передача | HTTP с повторными попытками | +| 5 | Применение | Вставка/обновление в target DC | +| 6 | Дельта-синхронизация | CDC изменения | +| 7 | Валидация | SHA-256 контрольные суммы | +| 8 | Завершение | Обновление статуса | + +**Режимы работы** + +| Режим | Описание | Автоматизация | +|-------|----------|---------------| +| **manual** | Полностью ручное управление | Нет | +| **semi_auto** | Основная миграция вручную, дельта автоматическая | Частичная | +| **auto** | Полностью автоматическая непрерывная миграция | Полная | + +**Пример конфигурации** + +```toml +[migration] + enabled = true + mode = "semi_auto" # manual, semi_auto, auto + + [migration.source] + name = "dc-primary" + endpoint = "https://dc1.futriix.local:8080" + timeout_sec = 30 + + [migration.target] + name = "dc-secondary" + endpoint = "https://dc2.futriix.local:8080" + timeout_sec = 30 + + [migration.settings] + batch_size = 1000 + workers = 4 + compression = "snappy" # snappy, lz4, zstd + resume_enabled = true + checkpoint_interval_sec = 30 + max_retries = 3 + retry_backoff_sec = 5 + collections = [] + exclude_collections = ["temp", "logs"] + + [migration.delta] + enabled = true + interval_sec = 60 + max_lag_sec = 300 + + [migration.validation] + enabled = true + sample_percent = 10 + max_errors = 100 + ``` +
+ +### Команды управления миграцией + +| Команда | Описание | Пример использования | +|---------|----------|---------------------| +| `migration start` | Запуск новой миграции из исходного датацентра в целевой | `migration start dc-primary dc-secondary` | +| `migration start ` | Запуск миграции только для указанной базы данных | `migration start dc-primary dc-secondary mydb` | +| `migration start ` | Запуск миграции для конкретной коллекции | `migration start dc-primary dc-secondary mydb users` | +| `migration status` | Отображение статуса текущей активной миграции | `migration status` | +| `migration status ` | Отображение статуса конкретной задачи по ID | `migration status mig_1734567890_dc-primary` | +| `migration list` | Вывод списка всех задач миграции (включая завершённые) | `migration list` | +| `migration pause ` | Приостановка выполняющейся миграции | `migration pause mig_1734567890_dc-primary` | +| `migration resume ` | Возобновление ранее приостановленной миграции | `migration resume mig_1734567890_dc-primary` | +| `migration cancel ` | Отмена миграции с переходом в статус "failed" | `migration cancel mig_1734567890_dc-primary` | +| `migration stats` | Отображение агрегированной статистики миграций | `migration stats` | +| `migration config` | Вывод текущей конфигурации мигратора из config.toml | `migration config` | +| `migration queue` | Отображение состояния очереди изменений (размер, LSN) | `migration queue` | +| `migration validate ` | Запуск валидации данных для завершённой миграции | `migration validate mig_1734567890_dc-primary` | + +--- + +### Статусы миграции + +| Статус | Описание | Индикатор | Возможные действия | +|--------|----------|-----------|-------------------| +| `idle` | Нет активной миграции, система ожидает команды | ⚪ Белый | `migration start` | +| `preparing` | Сбор метаданных: подсчёт документов, проверка коллекций | 🔵 Синий | Ожидание автоматического перехода | +| `migrating` | Основная фаза передачи данных из источника в приёмник | 🟡 Жёлтый | `migration pause`, `migration status` | +| `delta_sync` | Синхронизация изменений, произошедших во время миграции | 🟡 Жёлтый | `migration pause`, `migration status` | +| `validating` | Проверка целостности данных (контрольные суммы) | 🔵 Синий | `migration status` | +| `completed` | Миграция успешно завершена, все данные перенесены | 🟢 Зелёный | `migration validate`, `migration list` | +| `failed` | Миграция завершилась с ошибкой, требуется вмешательство | 🔴 Красный | `migration status` (просмотр ошибки), `migration resume` (после исправления), `migration cancel` | +| `paused` | Миграция приостановлена пользователем | 🟠 Оранжевый | `migration resume`, `migration cancel` | + +--- + +### Метрики мониторинга + +| Метрика | Описание | Единица измерения | Способ получения | +|---------|----------|-------------------|------------------| +| `total_changes` | Общее количество изменений, зарегистрированных в очереди | количество | `migration stats` | +| `applied_changes` | Количество изменений, успешно применённых в целевом датацентре | количество | `migration stats` | +| `failed_changes` | Количество изменений, которые не удалось применить | количество | `migration stats` | +| `skipped_changes` | Количество изменений, пропущенных по различным причинам | количество | `migration stats` | +| `latency_avg` | Среднее время передачи одного документа | миллисекунды | `migration stats` | +| `latency_max` | Максимальное время передачи одного документа | миллисекунды | `migration stats` | +| `throughput` | Пропускная способность миграции | документов в секунду | `migration stats` | +| `queue_size` | Текущий размер очереди изменений | количество | `migration queue` | +| `last_lsn` | Последний обработанный LSN (Log Sequence Number) | номер | `migration queue` | +| `progress_percent` | Процент выполнения текущей миграции | проценты (0-100) | `migration status` | +| `total_documents` | Общее количество документов для миграции | количество | `migration status` | +| `migrated_docs` | Количество успешно мигрированных документов | количество | `migration status` | +| `failed_docs` | Количество документов с ошибкой миграции | количество | `migration status` | +| `elapsed_time` | Время, прошедшее с начала миграции | секунды | `migration status` | +| `validation_errors` | Количество ошибок валидации | количество | `migration status` | + +--- + +### Обработка ошибок + +| Тип ошибки | Описание | Механизм восстановления | Действие администратора | +|------------|----------|-------------------------|------------------------| +| **Сетевой сбой** | Потеря соединения между датацентрами | Автоматический повтор до `max_retries` раз с задержкой `retry_backoff_sec` | Проверить сетевые соединения, межсетевые экраны | +| **Таймаут** | Превышение времени ожидания ответа | Увеличение таймаута (`timeout_sec`), повтор запроса | Настроить `timeout_sec` в конфигурации, проверить загрузку целевого датацентра | +| **Невалидные данные** | Документ не соответствует схеме или ограничениям коллекции | Логирование ошибки, пропуск документа | Проверить схему документа, исправить источник данных | +| **Краш узла** | Аварийное завершение работы узла futriix | Восстановление из последнего чекпоинта при перезапуске | Перезапустить узел, убедиться в наличии чекпоинта | +| **Конфликт версий** | Документ был изменён во время миграции | Повторная попытка с новой версией документа | Проверить конкурентные изменения, при необходимости остановить запись на время миграции | +| **Отказ целевого датацентра** | Целевой датацентр недоступен | Отложить до восстановления, автоматический повтор | Проверить состояние целевого датацентра, перезапустить при необходимости | +| **Недостаточно места** | Закончилось место на диске в целевом датацентре | Приостановка миграции до освобождения места | Освободить место на диске или расширить хранилище | +| **Ошибка валидации** | Контрольная сумма документа не совпадает | Логирование ошибки, продолжение миграции | Проверить целостность данных, при необходимости перезапустить миграцию | +| **Прерывание пользователем** | Пользователь выполнил `migration cancel` | Немедленная остановка, переход в статус `failed` | — | +| **Таймаут дельта-синхронизации** | Задержка превысила `max_lag_sec` | Увеличение интервала или ручная синхронизация | Настроить `interval_sec` и `max_lag_sec`, проверить пропускную способность канала | + + + **Гарантии целостности** + +* Идемпотентность: Каждая операция может быть повторена без побочных эффектов +* Контрольные суммы: SHA-256 для каждого документа +* Валидация: Выборочная проверка после миграции +* Чекпоинты: Возможность возобновления с места остановки +* Транзакционность: Атомарное применение изменений

(К началу)