Stategraph: Terraform state as a distributed systems problem
Почему мы создаём Stategraph: состояние Terraform как проблема распределённых систем
Экосистема Terraform десятилетиями обходила фундаментальное архитектурное проблему: использование файловой семантики для решения задач распределённых систем. Результат предсказуем и болезнен.
При масштабировании автоматизации инфраструктуры мы обнаружили, что управление состоянием в Terraform демонстрирует классические симптомы несоответствия между представлением данных и шаблонами доступа. Команды создают сложные обходные решения: разделение файлов состояния, оркестрация обёрток, внешние механизмы блокировок. Это не решения, а доказательство, что мы решаем не ту проблему.
Stategraph подходит к состоянию как к тому, чем оно является на самом деле: направленному ациклическому графу ресурсов с семантикой частичных обновлений, а не монолитному документу.
Патология файлового состояния
Состояние Terraform — это проблема координации. Множество акторов (инженеры, CI-системы) должны одновременно читать и изменять перекрывающиеся подмножества состояния инфраструктуры. Вместо решений с тонкими блокировками и управлением параллелизмом Terraform использует глобальный мьютекс для JSON-файла.
Наблюдение: Вероятность конфликта блокировок растёт сверхлинейно с увеличением команды и количества ресурсов.
Несоответствие гранулярности:
- Текущая модель: чтение 100%, блокировка 100%, изменение 0.5%
- Фактическая потребность: чтение 3%, блокировка 3%, изменение 3%
Разделение файлов состояния не решает проблему, а перераспределяет её, добавляя сложность управления зависимостями между состояниями.
Состояние как граф: естественное представление
Состояние инфраструктуры по своей природе является направленным графом. Ресурсы имеют зависимости, образующие рёбра. Изменения распространяются по этим рёбрам. Terraform внутренне представляет состояние как граф, но на уровне хранения уплощает эту структуру в blob.
При нормализации состояния в графовую базу данных появляются естественные свойства:
- Изоляция подграфов: операции над несвязанными подграфами параллелизуемы
- Точные блокировки: блокировка на уровне ресурсов и зависимостей
- Инкрементальное обновление: вычисление минимального набора изменений через обход графа
Управление параллелизмом через правильные абстракции
Stategraph реализует проверенные паттерны распределённых систем:
- MVCC для неблокирующего чтения
- Write-ahead logging для сохранности данных
- Уровни изоляции транзакций
Традиционный подход:
Acquiring global lock… waiting
Stategraph:
Locking subgraph (3 resources)… ready
Каждая операция блокирует только свой подграф. Менеджер блокировок использует граф зависимостей для предотвращения взаимных блокировок. Читатели получают согласованные снимки без блокировки писателей.
Результат: значительное улучшение пропускной способности при параллельной работе. Три команды могут одновременно применять изменения к независимым ресурсам.