Конфигурация с несколькими кластерами
Конфигурация с несколькими кластерами определяет, какие кластеры в настоящее время являются частью нескольких кластеров. Он не изменяется автоматически, но управляется оператором. Таким образом, он совершенно отличается от механизма членства, используемого в кластере, который автоматически определяет набор силосов, которые являются частью кластера.
Мы используем следующую терминологию для кластеров в службе:
- Кластер активен, если он имеет по крайней мере один активный сило и неактивен в противном случае.
- Кластер присоединяется, если он является частью текущей конфигурации с несколькими кластерами и не присоединен к нему в противном случае.
Активный или неактивный является независимым от соединения или несоединения: возможны все четыре сочетания.
Все кластеры для определенной службы подключены к сети сплетов. Сеть 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).
Процедуры кластера
При добавлении или удалении кластера из нескольких кластеров часто требуется координироваться в более крупном контексте. При добавлении и удалении кластеров из нескольких кластеров рекомендуется всегда следовать приведенным ниже процедурам.
Процедура добавления кластера
- Запустите новый Orleans кластер и дождитесь завершения работы всех силосов.
- Внедрение конфигурации, содержащей новый кластер.
- Запустите маршрутизацию запросов пользователей в новый кластер.
Процедура удаления кластера
- Остановите маршрутизацию новых запросов пользователей в кластер.
- Внедрение конфигурации, которая больше не содержит кластер.
- Остановите все оси кластера.
После удаления кластера таким образом его можно повторно добавить, выполнив процедуру добавления нового кластера.
Действие в несоединяемых кластерах
Существует краткий временный период, в котором кластер является активным и не присоединенным:
- Недавно запущенный кластер может начать выполнение кода, прежде чем он находится в конфигурации с несколькими кластерами (между шагами 1 и 2 процедуры добавления кластера)
- Кластер, который удаляется из эксплуатации, может по-прежнему выполнять код до завершения работы силосов (между шагами 2 и 3 процедуры удаления кластера).
Во время этих промежуточных ситуаций возможны следующие возможности:
- Для зерна глобального экземпляра: у зерна может быть повторная активация в несоединяемом кластере.
- Для наборов версий: активации в несоединяемых кластерах не получают уведомлений при изменении состояния зерна.