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


Конфигурация с несколькими кластерами

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

Мы используем следующую терминологию для кластеров в службе:

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

Активный или неактивный является независимым от соединения или несоединения: возможны все четыре сочетания.

Все кластеры для определенной службы подключены к сети сплетов. Сеть gossip распространяет сведения о конфигурации и состоянии.

Внедрение конфигурации

Оператор выдает изменения конфигурации путем внедрения их в сеть с несколькими кластерами. Конфигурации можно внедрить в любой кластер и распространить оттуда ко всем активным кластерам. Каждая новая конфигурация состоит из списка идентификаторов кластера, которые образуют многокластикторную конфигурацию. Он также имеет метку времени в формате UTC, которая используется для отслеживания распространения по сети сплетов.

Изначально конфигурация с несколькими кластерами имеет значение NULL, что означает, что список нескольких кластеров пуст (не содержит кластеров). Таким образом, оператор должен первоначально внедрить конфигурацию с несколькими кластерами. После внедрения эта конфигурация сохраняется во всех подключенных силосах (во время выполнения) и во всех указанных каналах сплетов (если эти каналы постоянны).

Мы создадим некоторые ограничения на внедрение новых конфигураций, которые должен следовать оператору:

  • Каждая новая конфигурация может добавлять несколько кластеров или удалять некоторые кластеры (но не одновременно).
  • Оператор не должен выдавать новую конфигурацию во время обработки предыдущего изменения конфигурации.

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

Зерно управления

Конфигурации с несколькими кластерами можно внедрить на любой узел в любом кластере Orleans с помощью элемента управления. Например, чтобы внедрить конфигурацию с несколькими кластерами, состоящую из трех кластеров { us1, eu1, us2 }, можно передать строку, перечисленную в зерно управления:

var clusters = "us1,eu1,us2".Split(',');
var mgtGrain = client.GetGrain<IManagementGrain>(0);
mgtGrain.InjectMultiClusterConfiguration(clusters, "my comment here"));

Первым аргументом InjectMultiClusterConfiguration(IEnumerable<String>, String, Boolean) является коллекция идентификаторов кластера, которая будет определять новую конфигурацию с несколькими кластерами. Второй аргумент — это (необязательно) строка комментария, которую можно использовать для тегов конфигураций с произвольными сведениями, например кто их внедрял и почему.

Существует необязательный третий аргумент, логический вызов checkForLaggingSilosFirst, который по умолчанию имеет значение true. Это означает, что система выполняет лучшие проверка, чтобы узнать, есть ли какие-либо силосы в любом месте, которые еще не поймали на текущую конфигурацию, и отклоняет изменение, если он находит такой сило. Это помогает обнаружить нарушения ограничений, которые только одно изменение конфигурации должно находиться в ожидании за раз (хотя оно не может гарантировать его в любых обстоятельствах).

Конфигурация по умолчанию

В ситуациях, когда конфигурация с несколькими кластерами известна заранее, и развертывание будет свежим каждый раз (для тестирования), возможно, потребуется предоставить конфигурацию по умолчанию. Глобальная конфигурация поддерживает необязательный атрибут DefaultMultiCluster , который принимает разделенный запятыми список идентификаторов кластера:

var silo = new HostBuilder()
    .UseOrleans(builder =>
    {
        builder.Configure<MultiClusterOptions>(options =>
        {
            options.DefaultMultiCluster = new[] { "us1", "eu1", "us2" };
        })
    })
    .Build();

После запуска silo с этим параметром он проверка, чтобы узнать, имеет ли текущую конфигурацию с несколькими кластерами значение NULL, а если да, вставляет указанную конфигурацию с текущей меткой времени UTC.

Предупреждение

Постоянные каналы с несколькими кластерами (на основе AzureTable) сохраняют последнюю внедренную конфигурацию, если они не удаляются явным образом. В этом случае указание DefaultMultiCluster не влияет на повторное развертывание кластера, так как конфигурация, хранящуюся в каналах сплетни, не имеет значения NULL.>

Канал Gossip

Оператор также может внедрить конфигурацию непосредственно в канал gossip. Изменения в канале собираются и распространяются автоматически периодическими фоновыми сплетами, хотя, возможно, очень медленно (использование зерна управления гораздо быстрее). Приблизительная оценка времени распространения составляет 30 секунд (или любой интервал сплета указывается в глобальной конфигурации) в двоичном логарифме общего числа силосов во всех кластерах. Но так как пары сплетни выбираются случайным образом, они могут быть как гораздо быстрее, так и гораздо медленнее.

Если используется канал gossip на основе таблиц Azure, операторы могут просто внедрить новую конфигурацию, изменив запись конфигурации в ней OrleansGossipTable, используя некоторые средства для редактирования данных в таблицах Azure. Запись конфигурации имеет следующий формат:

Имя. Тип значение
PartitionKey Строка ServiceId
RowKey Строка "CONFIG"
Кластеры Строка Разделенный запятыми список идентификаторов кластера, например "us1,eu1,us2"
Комментарий Строка необязательный комментарий
GossipTimestamp Дата/время Метка времени UTC для конфигурации

Примечание.

При редактировании этой записи в хранилище необходимо также задать более новое значение, GossipTimestamp чем в настоящее время (в противном случае изменение игнорируется). Самый удобный и рекомендуемый способ сделать это — удалить GossipTimestamp поле — реализация канала gossip, а затем автоматически заменяет ее правильной текущей меткой времени (она использует метку времени таблицы Azure).

Процедуры кластера

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

Процедура добавления кластера

  1. Запустите новый Orleans кластер и дождитесь завершения работы всех силосов.
  2. Внедрение конфигурации, содержащей новый кластер.
  3. Запустите маршрутизацию запросов пользователей в новый кластер.

Процедура удаления кластера

  1. Остановите маршрутизацию новых запросов пользователей в кластер.
  2. Внедрение конфигурации, которая больше не содержит кластер.
  3. Остановите все оси кластера.

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

Действие в несоединяемых кластерах

Существует краткий временный период, в котором кластер является активным и не присоединенным:

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

Во время этих промежуточных ситуаций возможны следующие возможности:

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