Коротко. Durability — вероятность не потерять данные при отказах. ActiveScale использует erasure coding: данные режутся на фрагменты, к ним добавляется чётность, фрагменты распределяются по дискам/нодам/площадкам. Вендор заявляет до 19 девяток для активного и холодного классов; для холодного — 2D erasure coding с overhead от 15%.
1. Чем erasure coding отличается от RAID
| RAID | Erasure coding | |
|---|---|---|
| Где | контроллер/локальные диски | распределённо по нодам |
| Единица | диск | фрагмент/экстент |
| Восстановление | rebuild диска | ремонт фрагментов |
| Масштаб | ограничен полкой | растёт с нодами |
| Отказ площадки | обычно нет | 3GEO/geo-spreading |
RAID защищает от отказа диска внутри одной полки. Erasure coding защищает от отказа диска, ноды и (при geospreading) площадки — потому что фрагменты и чётность распределены шире.
Разница не только в ширине, но и в стоимости отказа. В RAID5 потеря второго диска во время
rebuild означает потерю массива: rebuild читает все оставшиеся диски и длится часами, а окно
уязвимости растёт вместе с объёмом диска. В распределённой схеме ремонт идёт не «всем массивом», а
конкретными фрагментами: пересчитывается только утраченная часть, остальные ноды продолжают
обслуживать чтение. Поэтому вендор заявляет 19 девяток: расчёт опирается на скорость ремонта и на
запас (N − (w+s)), а не на «надёжность диска» как таковую.
2. Как считается политика
Обозначения:
w— ширина полосы (spread width), сколько фрагментов данных;s— сколько фрагментов чётности (safety);N— число блоксторов.
Требование: w + s ≤ N. Иначе раскладка не помещается, и запись встаёт с 507, даже если
диски свободны.
Usable: (w − s) / w.
Примеры:
| N | w/s | Занято | Usable | Комментарий |
|---|---|---|---|---|
| 4 | 2/1 | 3 | 50% | минимум для маленького стенда |
| 8 | 4/2 | 6 | 50% | два диска запаса |
| 10 | 6/2 | 8 | 67% | лучше эффективность |
| 16 | 10/2 | 12 | 80% | много запаса |
| 20 | 12/4 | 16 | 67% | больше безопасности |
| 24 | 14/4 | 18 | 71% | крупная полка |
Стоковые пресеты (balanced 13/4, lowest_overhead 15/4, 2site_replicated 12/2) рассчитаны на
большие полки — на 8 дисках они не влезают. Для малых конфигураций нужна ветка custom с
подходящими w/s.
Обратите внимание на строку 16: 10/2 даёт 80% usable, но запас — четыре блокстора. Строка 20:
12/4 даёт 67%, зато переживает четыре одновременных отказа. Это не «хуже» и «лучше», это два
разных ответа на вопрос «что для меня дороже — ёмкость или окно ремонта».
Подробнее: Формула политики DSS.
3. 2D erasure coding для Cold
Обычное EC распределяет фрагменты «в одном измерении» (по дискам/нодам). 2D EC добавляет второе измерение: чётность внутри и между кассетами, приводами, библиотеками и площадками.
- Восстановление обычно требует одной кассеты (локальные коды).
- Overhead — от 15% (вендор), что эффективнее репликации/двух копий (до 40% лучше).
- Патент US11216196 (у Quantum).
Смысл второго измерения — не «больше чётности», а меньше движений: утрата одной кассеты восстанавливается по локальным кодам, не поднимая остальные. Для ленты это критично — каждое движение означает загрузку кассеты в привод и минуты латентности.
4. Что такое rebuild и чем он отличается от rebalance
Эти два процесса часто путают, потому что оба «двигают данные» и оба видны в мониторинге как фоновая нагрузка. По смыслу они противоположны.
Rebuild (ремонт, в продукте — Dynamic Data Repair, DDR) — восстановление утраченного. Причина: отказ диска, ноды, кассеты или повреждение фрагмента. Механизм: продукт постоянно мониторит целостность, находит недостающие или битые фрагменты, пересчитывает их по чётности из живых фрагментов и раскладывает заново. Ключевое: ремонт не ждёт замены диска. DDR работает фоном и восстанавливает избыточность даже тогда, когда физически менять ещё нечего — например, когда диск ещё «на месте», но данные с него уже не читаются.
Rebalance (перебалансировка) — перераспределение живых данных. Причина: изменилась топология или
ёмкость — добавили ноды, добавили полку, вывели диск из раскладки штатным decommission. Механизм:
DSS перекладывает фрагменты так, чтобы раскладка снова соответствовала политике и нагрузка
распределилась по новым блоксторам. Ключевое: данные при этом целы, ничего не восстанавливается —
меняется только их местоположение.
| Rebuild (DDR) | Rebalance | |
|---|---|---|
| Причина | отказ/повреждение | расширение, decommission, смена политики |
| Что происходит | пересчёт утраченного по чётности | перенос целых фрагментов |
| Триггер | обнаружение потери целостности | изменение топологии или ёмкости |
| Ждёт замены железа | нет | нет |
| Риск для данных | нулевой, пока запас есть | нулевой; окно — рост нагрузки |
Практическая разница — в том, что можно делать во время процесса. Ремонт трогать нельзя: это аварийный режим, любое дополнительное выпадение уменьшает запас. Перебалансировку планируют в спокойное окно — она добавляет нагрузку на сеть и диски. Отсюда правило: decommission и расширение — работы в окно; ремонт — в любой момент, но без самодеятельности вокруг.
Отдельно стоит Dynamic Data Placement (DDP): по документации раскладка при расширении не требует
обязательного rebalance — новые данные размещаются с учётом новой топологии, старые остаются на
месте. Это снимает «переливание всего» после добавления ноды, но не отменяет decommission: при
выводе диска его данные всё равно переносят. Вывод старого железа целиком — отдельный сценарий
(Migration and Decommission, 7.3): фоновая миграция данных и метаданных, для S3 и Glacier
прозрачная, запускается специалистами вендора.
5. География: 1/2/3 сайта и что это меняет в раскладке
По документации geospreading поддерживает три конфигурации, и они дают разный уровень защиты.
Один сайт. Все ноды в одной площадке. Erasure coding защищает от отказа диска и ноды; отказ площадки (питание, сеть, пожар, затопление) не переживается вообще. Это нормальная конфигурация для рабочих данных и бэкапов, но в план аварийного восстановления надо честно записывать: потеря площадки — потеря данных. Резервная копия в этом сценарии обязательна и должна лежать вне площадки.
Два сайта. Вторая площадка получает копию через репликацию. Здесь важно понимать, что это
другая механика: не «половина фрагментов там, половина здесь», а репликация объектов между
системами. Пресет 2site_replicated в политике рассчитан на такой сценарий. Плюс: переживается
потеря сайта. Минус: платите за полную копию, а не за чётность; и вопрос «кто главный при
одновременной записи в оба сайта» надо решать до ввода в строй, а не в аварию.
Три сайта (3GEO DDP). Фрагменты и чётность распределяются так, чтобы пережить потерю одной площадки без полной копии. Это самая эффективная по ёмкости схема отказоустойчивости и самая требовательная к сети: между сайтами нужна предсказуемая полоса и латентность, иначе запись деградирует. Три сайта — это ещё и три комплекта эксплуатации: питание, охлаждение, доступ, обслуживание.
Что меняется в раскладке при переходе от одного сайта к трём:
- растёт требование к
N— фрагменты должны физически помещаться в разные домены отказа; - растёт чувствительность к сети — часть записи идёт через WAN, и это уже не «внутренняя» сеть;
- меняется окно ремонта — восстановление после потери сайта идёт по WAN и измеряется в другом масштабе времени, чем локальный ремонт диска;
- появляется кворумный вопрос — при потере связи между сайтами система должна решить, какая сторона продолжает принимать запись.
Наши стенды — три ноды в одной площадке, поэтому выводы про несколько сайтов мы берём из публичной документации, а не из собственного опыта. Полезно помнить, читая любые «полевые» советы: они почти всегда про один сайт.
6. Что значит «19 девяток»
99.99999999999999999% — расчётная вероятность сохранности при модели отказов. Это не гарантия,
что данные не потеряются при:
- логической ошибке (удаление, шифровальщик);
- ошибке приложения;
- потере метаданных/БД;
- катастрофе, не входящей в модель.
Поэтому нужны версионирование, Object Lock, репликация/3GEO, бэкап метаданных и регламент.
7. Что durability НЕ покрывает
Erasure coding отвечает на вопрос «что будет, если железо откажет». Он не отвечает на вопрос «что будет, если данные испортят изнутри». Это разные классы рисков, и закрываются они разными средствами.
Логическое удаление. DeleteObject — штатная операция, и она выполняется. Durability тут ни при
чём: фрагменты целы, чётность в порядке, объекта просто нет. Закрывается версионированием
(удаление ставит delete-маркер, прежняя версия остаётся) и Object Lock (WORM: объект нельзя
удалить или перезаписать до истечения срока). И то и другое надо включить до инцидента:
включённое после удаления вернёт только то, что успело попасть в историю.
Шифровальщик. Классический сценарий: процесс с валидными ключами перезаписывает объекты «мусором». С точки зрения системы всё корректно — запись прошла, коды сошлись, избыточность восстановится. Данные при этом потеряны. Закрывается тем же Object Lock (в режиме compliance объект нельзя перезаписать) плюс версионированием и ограничением прав: ключ, которым пишет бэкап-агент, не должен уметь удалять. Дополнительно — MFA для администраторов (появилась в 7.2 для UI/CLI/REST), потому что шифровальщики часто идут через скомпрометированные учётки.
Потеря метаданных. Самый недооценённый риск: данные на дисках и лентах, фрагменты целы, но нет
ответа, из каких фрагментов состоит объект X. Метаданные в ActiveScale — отдельный слой: модель в
modeldb, метастор DSS (arakoon), конфиги раскладки; erasure coding их не защищает. Закрывается
бэкапом конфигурации и метаданных — модель, очередь установки, group_vars, конфиги DSS, базы
метастора. Это два разных бэкапа: лёгкий (модель и конфиги, часто) и тяжёлый (базы метастора, перед
работами по DSS).
Ошибка приложения. Запись ушла не туда и не та — избыточность это размножит, а не исправит. Закрывается версионированием, отдельным бакетом под проверенную запись и регламентом.
Катастрофа вне модели. Пожар в единственной площадке, ошибочно выданная команда на удаление бакета, потеря ключа шифрования. Модель отказов такие события не считает. Закрывается географией (2/3 сайта) и внешней копией.
| Риск | Durability закрывает | Чем закрывать |
|---|---|---|
| Отказ диска | да | политика w+s ≤ N, DDR |
| Отказ ноды | да | то же + запас блоксторов |
| Отказ площадки | только при 2/3 сайтах | geospreading/репликация |
| Логическое удаление | нет | версионирование, Object Lock |
| Шифровальщик | нет | Object Lock (compliance), права, MFA |
| Потеря метаданных | нет | бэкап модели и метастора |
| Ошибка приложения | нет | версии, отдельный бакет, регламент |
8. Практические выводы
- Считайте
w+s ≤ Nдо установки, а не после первого507. - Не ставьте политику «занимает ровно N»: при отказе диска запаса не останется.
- Проверяйте барометр DSS (
ok) и заполнение NS. - Для Cold планируйте кассеты так, чтобы safety была достижима (не 0).
- Тестируйте restore, а не только запись.
- Разделяйте в мониторинге ремонт и перебалансировку: у них разная причина и разный режим работ.
- Durability не заменяет версионирование, Object Lock и бэкап метаданных — это четыре разных средства против четырёх разных рисков.