Поделиться через


Реализация каталога злаков

Обзор и архитектура

Каталог зерна в Orleans — это хранилище "ключ-значение", где ключ — это идентификатор зерна, а значение — запись регистрации, которая указывает на активный силос, который (потенциально) размещает зерно.

Хотя Orleans предоставляет реализацию распределенного каталога по умолчанию (описанную в этой статье), система зернового каталога разработана с возможностью подключения. Разработчики могут реализовать свой собственный каталог, реализуя интерфейс IGrainDirectory и регистрируя его в коллекции служб silo. Это позволяет использовать пользовательские реализации каталога, которые могут использовать разные бэкэнды хранения или модели согласованности для лучшего соответствия конкретным требованиям приложения. С момента внедрения нового каталога строгой согласованности, мало нужды в реализации внешних каталогов, но API остается для обратной совместимости и гибкости. Каталог зерна можно настроить для каждого типа зерна.

Для оптимизации производительности поиски каталогов кэшируются локально в каждом хранилище. Это означает, что потенциально удаленные операции чтения каталога необходимы только в том случае, если запись локального кэша отсутствует или недопустимая. Этот механизм кэширования снижает нагрузку на сеть и задержку, связанную с поиском расположения зерна.

Изначально Orleans реализовала структуру каталога, в конечном итоге согласованную, в виде распределенной хэш-таблицы. Это было заменено строго согласованным каталогом в Orleans версии 9.0 на основе двухфазной виртуально синхронной методологии, а также структурированной как распределенная хэш-таблица, но с улучшенной балансировкой нагрузки с помощью виртуальных узлов. В этой статье описывается последняя, более новая реализация каталога зерна.

Распределенный каталог зерна

Распределенный каталог зерна в Orleans обеспечивает надежную согласованность, даже балансировку нагрузки, высокую производительность и отказоустойчивость. Реализация следует двухэтапному проектированию на основе методологии виртуальной синхронизации со сходством с вертикальным Paxos.

Секции каталогов имеют два режима работы:

  1. Нормальная работа: партиции обрабатывают запросы локально без координации с другими узлами.
  2. Просмотр изменений: хосты координируются друг с другом для передачи владения диапазонами каталогов.

В каталоге используется система членства в кластере жёсткого согласования Orleans, в которой конфигурации, называемые «представлениями», имеют монотонно увеличивающиеся номера версий. При присоединении к кластеру и выходе из кластера создаются последовательные представления, что приводит к изменению владения диапазоном.

Все операции каталога включают координацию представлений:

  • Запросы содержат номер представления вызывающего абонента.
  • Ответы содержат номер представления раздела.
  • Несоответствия в числах просмотров вызывают синхронизацию.
  • Запросы автоматически извлекаются при изменении представления.

Это гарантирует, что все запросы обрабатываются правильным владельцем раздела каталога.

Стратегия секционирования

Каталог секционируется с помощью согласованного хэш-кольца с диапазонами, назначенными активным силосам в кластере. Идентификаторы зерна хэшируются для поиска силоса, который владеет секцией кольца, соответствующей его хэшу.

Каждый активный silo владеет предварительно настроенным числом диапазонов, по умолчанию — 30 диапазонов на сило. Это аналогично схеме, используемой Amazon Dynamo и Apache Cassandra, где для каждого узла (хоста) создаётся несколько "виртуальных узлов" (диапазонов).

Размер раздела определяется расстоянием между хэшом и хэшом следующего раздела. Можно разделить диапазон между несколькими силосами в процессе изменения представления, что усложняет процедуру изменения представления, так как каждый раздел должен потенциально координироваться с несколькими другими разделами.

Просмотр процедуры изменения

Секции каталогов (реализованные в GrainDirectoryPartition) используют версионные блокировки диапазона, чтобы предотвратить недействительный доступ к диапазонам во время изменений представления. Блокировки диапазона создаются во время изменения представления и выпускаются после завершения изменения представления. Эти блокировки аналогичны "клиньям", используемым в методологии виртуальной синхронизации.

При изменении представления секция может увеличиваться или сжиматься:

  • Если новый сегмент присоединился к кластеру, существующие разделы могут уменьшиться, чтобы освободить место.
  • Если хранилище оставило кластер, остальные секции могут увеличиться, чтобы взять на себя потерянные диапазоны.

Регистрация каталогов должна быть передана от старого владельца новому владельцу перед отправкой запросов. Процесс передачи выполняет следующие действия.

  1. Предыдущий владелец запечатывает диапазон и создает моментальный снимок записей каталога этого диапазона.
  2. Новый владелец запрашивает и применяет снимок.
  3. Новый владелец начинает обслуживание запросов, связанных с диапазоном.
  4. Предыдущий владелец уведомляется и удаляет моментальный снимок.

Процесс восстановления

Если хост завершает работу без правильной передачи разделов каталога, последующие владельцы разделов должны выполнить восстановление. Это включает в себя:

  1. Запрос всех активных силосов в кластере для регистрации зерна.
  2. Перестроение состояния каталога для затронутых диапазонов.
  3. Обеспечение отсутствия повторяющихся активаций зерна.

Восстановление также необходимо при быстром изменении членства в кластере. Хотя членство в кластере гарантирует монотонность, отдельные системы могут пропускать промежуточные представления членства. В таких случаях:

  • Передача моментальных снимков прекращена.
  • Восстановление выполняется вместо обычного перехода между секциями.
  • Система поддерживает согласованность, несмотря на отсутствие промежуточных состояний.

Дальнейшее улучшение членства в кластере может уменьшить или устранить эти сценарии, гарантируя, что все представления отображаются всеми силосами.