Konfiguracja wielu klastrów
Konfiguracja wielu klastrów określa, które klastry są obecnie częścią wielu klastrów. Nie zmienia się automatycznie, ale jest kontrolowany przez operatora. W związku z tym mechanizm członkostwa używany w klastrze różni się zupełnie od mechanizmu członkostwa, który automatycznie określa zestaw silosów będących częścią klastra.
Używamy następującej terminologii dla klastrów w usłudze:
- Klaster jest aktywny , jeśli ma co najmniej jeden aktywny silos i nieaktywny w przeciwnym razie.
- Klaster jest przyłączony , jeśli jest częścią bieżącej konfiguracji wieloklasowej i nieprzyłączonych w przeciwnym razie.
Aktywne/nieaktywne jest niezależne od sprzężenia/niesprzężenia: wszystkie cztery kombinacje są możliwe.
Wszystkie klastry dla określonej usługi są połączone przez sieć plotek. Sieć plotek propaguje informacje o konfiguracji i stanie.
Wstrzykiwanie konfiguracji
Operator wystawia zmiany konfiguracji, wstrzykiwając je do sieci wieloklastrowej. Konfiguracje można wstrzykiwać do dowolnego klastra i rozprzestrzeniać się z tego miejsca do wszystkich aktywnych klastrów. Każda nowa konfiguracja składa się z listy identyfikatorów klastra, które tworzą wiele klastrów. Ma również sygnaturę czasową UTC używaną do śledzenia propagacji za pośrednictwem sieci plotek.
Początkowo konfiguracja wielu klastrów ma wartość null, co oznacza, że lista wielu klastrów jest pusta (nie zawiera klastrów). W związku z tym operator musi początkowo wstrzyknąć konfigurację z wieloma klastrami. Po wstrzyknięciu ta konfiguracja będzie się powtarzać we wszystkich połączonych silosach (podczas uruchamiania) i we wszystkich określonych kanałach plotek (jeśli te kanały są trwałe).
Wprowadzamy pewne ograniczenia dotyczące wstrzykiwania nowych konfiguracji, które operator musi przestrzegać:
- Każda nowa konfiguracja może dodać kilka klastrów lub usunąć niektóre klastry (ale nie oba w tym samym czasie).
- Operator nie powinien wystawiać nowej konfiguracji, gdy poprzednia zmiana konfiguracji jest nadal przetwarzana.
Te ograniczenia zapewniają, że protokoły, takie jak protokół pojedynczego wystąpienia, mogą prawidłowo obsługiwać wzajemne wykluczanie aktywacji nawet w ramach zmian konfiguracji.
Ziarno zarządzania
Konfiguracje wielu klastrów można wprowadzać w dowolnym węźle w dowolnym klastrze przy użyciu Orleans ziarna zarządzania. Aby na przykład wstrzyknąć konfigurację wieloklastrową składającą się z trzech klastrów { us1, eu1, us2 }, możemy przekazać ciąg wyliczany do ziarna zarządzania:
var clusters = "us1,eu1,us2".Split(',');
var mgtGrain = client.GetGrain<IManagementGrain>(0);
mgtGrain.InjectMultiClusterConfiguration(clusters, "my comment here"));
Pierwszym argumentem jest InjectMultiClusterConfiguration(IEnumerable<String>, String, Boolean) kolekcja identyfikatorów klastra, która będzie definiować nową konfigurację wielu klastrów. Drugi argument to (opcjonalny) ciąg komentarza, który może służyć do tagowania konfiguracji przy użyciu dowolnych informacji, takich jak osoba, która je wprowadziła i dlaczego.
Istnieje opcjonalny trzeci argument, wartość logiczna o nazwie checkForLaggingSilosFirst
, która domyślnie ma wartość true. Oznacza to, że system sprawdza, czy nie ma żadnych silosów, które nie zostały jeszcze uwikłane w bieżącą konfigurację, i odrzuca zmianę, jeśli znajdzie taki silos. Pomaga to wykrywać naruszenia ograniczeń, że tylko jedna zmiana konfiguracji powinna być oczekująca naraz (choć nie może zagwarantować jej we wszystkich okolicznościach).
Konfiguracja domyślna
W sytuacjach, gdy konfiguracja wielu klastrów jest znana z wyprzedzeniem, a wdrożenie jest świeże za każdym razem (na potrzeby testowania), możemy podać konfigurację domyślną. Konfiguracja globalna obsługuje opcjonalny atrybut DefaultMultiCluster , który przyjmuje rozdzielaną przecinkami listę identyfikatorów klastra:
var silo = new HostBuilder()
.UseOrleans(builder =>
{
builder.Configure<MultiClusterOptions>(options =>
{
options.DefaultMultiCluster = new[] { "us1", "eu1", "us2" };
})
})
.Build();
Po uruchomieniu silosu z tym ustawieniem sprawdza, czy bieżąca konfiguracja wielu klastrów ma wartość null, a jeśli tak, wprowadza daną konfigurację z bieżącym znacznikiem czasu UTC.
Ostrzeżenie
Trwałe kanały plotek z wieloma klastrami (oparte na usłudze AzureTable) zachowują ostatnią konfigurację wstrzykniętą, chyba że zostaną jawnie usunięte. W takim przypadku określenie DefaultMultiCluster
elementu nie ma wpływu podczas ponownego wdrażania klastra, ponieważ konfiguracja przechowywana w kanałach plotek nie ma wartości null.>
Kanał plotek
Operator może również wstrzyknąć konfigurację bezpośrednio do kanału plotek. Zmiany w kanale są pobierane i propagowane automatycznie przez okresowe plotki w tle, choć prawdopodobnie bardzo wolno (użycie ziarna zarządzania jest znacznie szybsze). Przybliżone oszacowanie czasu propagacji wynosi 30 sekund (lub cokolwiek interwał plotek jest określony w konfiguracji globalnej) razy logarytm binarny całkowitej liczby silosów we wszystkich klastrach. Ale ponieważ pary plotek są wybierane losowo, mogą być znacznie szybsze lub znacznie wolniejsze.
Jeśli korzystasz z kanału plotek opartych na tabeli platformy Azure, operatorzy mogą po prostu wstrzyknąć nową konfigurację, edytując rekord konfiguracji w OrleansGossipTable
programie , używając narzędzia do edytowania danych w tabelach platformy Azure. Rekord konfiguracji ma następujący format:
Nazwisko | Typ | Wartość |
---|---|---|
PartitionKey | String | identyfikator ServiceId |
RowKey | String | "CONFIG" |
Klastry | String | rozdzielona przecinkami lista identyfikatorów klastra, np. "us1,eu1,us2" |
Komentarz | String | opcjonalny komentarz |
GossipTimestamp | DateTime | Sygnatura czasowa UTC dla konfiguracji |
Uwaga
Podczas edytowania tego rekordu w magazynie GossipTimestamp
należy również ustawić na nowszą wartość niż obecnie (w przeciwnym razie zmiana jest ignorowana). Najwygodniejszym i zalecanym sposobem jest usunięcie GossipTimestamp
pola — implementacja kanału plotek automatycznie zastępuje ją prawidłowym, bieżącym znacznikiem czasu (używa sygnatury czasowej tabeli platformy Azure).
Procedury klastra
Dodawanie lub usuwanie klastra z wielu klastrów często wymaga koordynowania w ramach pewnego większego kontekstu. Zalecamy, aby zawsze postępować zgodnie z procedurami opisanymi poniżej podczas dodawania/usuwania klastrów z wielu klastrów.
Procedura dodawania klastra
- Uruchom nowy Orleans klaster i poczekaj, aż wszystkie silosy będą uruchomione.
- Wstrzykiwanie konfiguracji zawierającej nowy klaster.
- Rozpocznij kierowanie żądań użytkowników do nowego klastra.
Procedura usuwania klastra
- Zatrzymaj kierowanie nowych żądań użytkowników do klastra.
- Wstrzykiwanie konfiguracji, która nie zawiera już klastra.
- Zatrzymaj wszystkie silosy klastra.
Po usunięciu klastra w ten sposób można go ponownie dodać, wykonując procedurę dodawania nowego klastra.
Działanie w klastrach nieprzyłączonych
Mogą istnieć krótkie okresy tymczasowe, w których klaster jest aktywny i nieprzyłączonych:
- Świeżo uruchomiony klaster może rozpocząć wykonywanie kodu, zanim znajduje się w konfiguracji wielu klastrów (między krokami 1 i 2 procedury dodawania klastra)
- Klaster, który jest likwidowany, może nadal wykonywać kod przed zamknięciem silosów (między krokami 2 i 3 procedury usuwania klastra).
W tych sytuacjach pośrednich możliwe są następujące kwestie:
- W przypadku ziarna globalnego pojedynczego wystąpienia: ziarno może mieć zduplikowaną aktywację w klastrze, który nie jest przyłączony.
- W przypadku ziarna wersji: aktywacje w klastrach, które nie są przyłączone, nie otrzymują powiadomień, gdy stan ziarna ulegnie zmianie.