Зачем нужно разделять Compute (вычисления) и Storage (хранение)?

«Зачем нужно разделять Compute (вычисления) и Storage (хранение)?» — вопрос из категории Распределенные системы, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разделение Compute и Storage — это ключевой архитектурный принцип современных распределенных систем, который обеспечивает независимое масштабирование, отказоустойчивость и гибкость.

Преимущества:

  • Независимое масштабирование (Scale Independently):
    • Compute можно масштабировать горизонтально, добавляя/убирая узлы для обработки пиковой нагрузки.
    • Storage можно масштабировать отдельно, увеличивая емкость или IOPS, не затрагивая вычислительные узлы.
  • Повышенная отказоустойчивость: При падении вычислительного узла данные не теряются, так как хранятся отдельно. Новый узел может подключиться к тому же хранилищу и продолжить работу.
  • Гибкость и экономия: Разные типы задач могут использовать общие данные без их копирования. Можно выбирать оптимальные и более дешевые инстансы для хранения (например, объектное хранилище S3) и вычислений (например, spot-инстансы).
  • Упрощение управления состоянием: Вычислительные узлы становятся stateless, что упрощает их оркестрацию, обновление и замену.

Практические примеры:

  1. База данных: В AWS RDS или Google Cloud SQL вычислительный инстанс (сервер БД) отделен от блочного хранилища (EBS/PD-SSD).
  2. Big Data: В Apache Spark вычислительные кластеры (executors) считывают данные из отдельного хранилища (HDFS, S3).
  3. Контейнеры: Stateless-контейнеры в Kubernetes монтируют тома из внешних систем хранения (PersistentVolume).

Без такого разделения система становится монолитной, сложной в масштабировании и уязвимой к сбоям.