По каким схемам или алгоритмам можно выделять вычислительные ресурсы в распределенных системах?

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

Ответ

В распределенных системах ресурсы (CPU, память, сеть, диск) выделяются по различным схемам и алгоритмам, которые определяют эффективность и справедливость их использования.

Основные схемы и алгоритмы выделения ресурсов:

  1. Статическое выделение (Static Partitioning):

    • Ресурсы заранее фиксированно разделены между потребителями (нодами, контейнерами).
    • Плюсы: Простота, предсказуемость, отсутствие накладных расходов на оркестрацию.
    • Минусы: Неэффективное использование, отсутствие эластичности.
    • Пример: Выделение фиксированного количества виртуальных ядер и памяти для каждого микросервиса в конфигурации Kubernetes (resources.requests/limits).
  2. Динамическое выделение (Dynamic Allocation):

    • Ресурсы выделяются и освобождаются по требованию во время выполнения.
    • Алгоритмы:
      • Очередь с приоритетами (Priority Queue): Задачи с высшим приоритетом получают ресурсы первыми.
      • Пропорциональное распределение (Proportional Share): Ресурсы делятся между задачами в заданной пропорции (например, Weighted Fair Queueing).
    • Пример: YARN ResourceManager в Hadoop или менеджер ресурсов в Apache Mesos.
  3. Выделение на основе квот (Quota-based):

    • Пользователю или команде выделяется гарантированная доля ресурсов кластера (квота). Внутри квоты может работать динамическое выделение.
    • Пример: Namespace Resource Quotas в Kubernetes.
  4. Выделение на основе аукциона (Auction-based):

    • Задачи "конкурируют" за ресурсы, предлагая виртуальную "цену". Ресурсы достаются задачам, максимизирующим ценность для системы.
    • Пример: Используется в некоторых исследовательских системах и системах обработки данных (Borg).
  5. Выделение с учетом размещения (Bin Packing):

    • Задача оптимизации: разместить множество задач ("предметов") на минимальном количестве серверов ("контейнеров"), минимизируя простои.
    • Алгоритмы: First-Fit, Best-Fit, их производные.
    • Пример: Алгоритмы планировщика (scheduler) в Kubernetes или Docker Swarm, которые решают, на какую ноду поместить под.

Практический пример в Kubernetes: Планировщик использует Bin Packing для эффективного размещения подов, учитывая requests и limits, а также приоритеты и вытеснение (Priority & Preemption) для динамического перераспределения в условиях нехватки ресурсов.