Konfigurowanie stanowych niezawodnych usług

Istnieją dwa zestawy ustawień konfiguracji dla niezawodnych usług. Jeden zestaw jest globalny dla wszystkich niezawodnych usług w klastrze, podczas gdy drugi zestaw jest specyficzny dla określonej niezawodnej usługi.

Konfiguracja globalna

Globalna konfiguracja niezawodnej usługi jest określona w manifeście klastra dla klastra w sekcji KtlLogger. Umożliwia ona konfigurację udostępnionej lokalizacji dziennika i rozmiaru oraz globalne limity pamięci używane przez rejestrator. Manifest klastra to pojedynczy plik XML, który zawiera ustawienia i konfiguracje, które mają zastosowanie do wszystkich węzłów i usług w klastrze. Plik jest zazwyczaj nazywany ClusterManifest.xml. Manifest klastra dla klastra można wyświetlić przy użyciu Get-ServiceFabricClusterManifest polecenia programu PowerShell.

Nazwy konfiguracji

Nazwa Jednostka Wartość domyślna Uwagi
WriteBufferMemoryPoolMinimumInKB Kilobajtów 8388608 Minimalna liczba KB do przydzielenia w trybie jądra dla puli pamięci buforu zapisu rejestratora. Ta pula pamięci jest używana do buforowania informacji o stanie przed zapisem na dysku.
WriteBufferMemoryPoolMaximumInKB Kilobajtów Bez ograniczeń Maksymalny rozmiar, do którego może rosnąć pula pamięci buforu zapisu rejestratora.
SharedLogId GUID "" Określa unikatowy identyfikator GUID używany do identyfikowania domyślnego udostępnionego pliku dziennika używanego przez wszystkie usługi niezawodne we wszystkich węzłach w klastrze, które nie określają identyfikatora SharedLogId w konfiguracji specyficznej dla usługi. Jeśli określono identyfikator SharedLogId, należy również określić parametr SharedLogPath.
SharedLogPath W pełni kwalifikowana nazwa ścieżki "" Określa w pełni kwalifikowaną ścieżkę, w której udostępniony plik dziennika używany przez wszystkie niezawodne usługi we wszystkich węzłach klastra, które nie określają ścieżki SharedLogPath w konfiguracji specyficznej dla usługi. Jeśli jednak określono parametr SharedLogPath, należy również określić identyfikator SharedLogId.
SharedLogSizeInMB Megabajtów 8192 Określa liczbę MB miejsca na dysku do statycznego przydzielenia dla udostępnionego dziennika. Wartość musi być 2048 lub większa.

W usłudze Azure ARM lub lokalnym szablonie JSON w poniższym przykładzie pokazano, jak zmienić udostępniony dziennik transakcji, który zostanie utworzony, aby przywrócić wszystkie niezawodne kolekcje dla usług stanowych.

"fabricSettings": [{
    "name": "KtlLogger",
    "parameters": [{
        "name": "SharedLogSizeInMB",
        "value": "4096"
    }]
}]

Przykładowa sekcja manifestu lokalnego klastra deweloperów

Jeśli chcesz to zmienić w lokalnym środowisku projektowym, musisz edytować lokalny plik clustermanifest.xml.

   <Section Name="KtlLogger">
     <Parameter Name="SharedLogSizeInMB" Value="4096"/>
     <Parameter Name="WriteBufferMemoryPoolMinimumInKB" Value="8192" />
     <Parameter Name="WriteBufferMemoryPoolMaximumInKB" Value="8192" />
     <Parameter Name="SharedLogId" Value="{7668BB54-FE9C-48ed-81AC-FF89E60ED2EF}"/>
     <Parameter Name="SharedLogPath" Value="f:\SharedLog.Log"/>
   </Section>

Uwagi

Rejestrator ma globalną pulę pamięci przydzieloną z niestronicowanej pamięci jądra, która jest dostępna dla wszystkich niezawodnych usług w węźle na potrzeby buforowania danych stanu przed zapisaniem w dedykowanym dzienniku skojarzonym z repliką niezawodnej usługi. Rozmiar puli jest kontrolowany przez ustawienia WriteBufferMemoryPoolMinimumInKB i WriteBufferMemoryPoolMaximumInKB. WriteBufferMemoryPoolMinimumInKB określa zarówno początkowy rozmiar tej puli pamięci, jak i najniższy rozmiar, do którego pula pamięci może się zmniejszyć. WriteBufferMemoryPoolMaximumInKB jest najwyższym rozmiarem, do którego pula pamięci może rosnąć. Każda otwarta replika niezawodnej usługi może zwiększyć rozmiar puli pamięci o określoną przez system kwotę do WriteBufferMemoryPoolMaximumInKB. Jeśli istnieje większe zapotrzebowanie na pamięć z puli pamięci niż jest dostępne, żądania pamięci będą opóźnione do momentu udostępnienia pamięci. W związku z tym, jeśli pula pamięci buforu zapisu jest zbyt mała dla określonej konfiguracji, wydajność może ulec konsekwencji.

Ustawienia SharedLogId i SharedLogPath są zawsze używane razem do definiowania identyfikatora GUID i lokalizacji domyślnego dziennika udostępnionego dla wszystkich węzłów w klastrze. Domyślny dziennik udostępniony jest używany dla wszystkich niezawodnych usług, które nie określają ustawień w settings.xml dla określonej usługi. Aby uzyskać najlepszą wydajność, udostępnione pliki dziennika powinny być umieszczane na dyskach, które są używane wyłącznie dla udostępnionego pliku dziennika w celu zmniejszenia rywalizacji.

SharedLogSizeInMB określa ilość miejsca na dysku do wstępnego przydzielenia domyślnego dziennika udostępnionego we wszystkich węzłach. Parametr SharedLogId i SharedLogPath nie muszą być określone w celu określenia parametru SharedLogSizeInMB.

Konfiguracja specyficzna dla usługi

Konfiguracje domyślne usług Reliable Services można modyfikować przy użyciu pakietu konfiguracji (Config) lub implementacji usługi (kodu).

  • Konfiguracja — konfiguracja za pośrednictwem pakietu konfiguracji jest realizowana przez zmianę pliku Settings.xml wygenerowanego w katalogu głównym pakietu programu Microsoft Visual Studio w folderze Config dla każdej usługi w aplikacji.
  • Kod — konfiguracja za pomocą kodu jest realizowana przez utworzenie klasy ReliableStateManager przy użyciu obiektu ReliableStateManagerConfiguration z odpowiednimi zestawami opcji.

Domyślnie środowisko uruchomieniowe usługi Azure Service Fabric szuka wstępnie zdefiniowanych nazw sekcji w pliku Settings.xml i używa wartości konfiguracji podczas tworzenia podstawowych składników środowiska uruchomieniowego.

Uwaga

Nie usuwaj nazw sekcji następujących konfiguracji w pliku Settings.xml generowanym w rozwiązaniu programu Visual Studio, chyba że planujesz skonfigurować usługę za pomocą kodu. Zmiana nazwy pakietu konfiguracji lub nazw sekcji będzie wymagać zmiany kodu podczas konfigurowania elementu ReliableStateManager.

Konfiguracja zabezpieczeń replikatora

Konfiguracje zabezpieczeń replikatora służą do zabezpieczania kanału komunikacyjnego używanego podczas replikacji. Oznacza to, że usługi nie będą mogły zobaczyć ruchu replikacji między sobą, zapewniając, że dane, które są udostępniane o wysokiej dostępności, są również bezpieczne. Domyślnie pusta sekcja konfiguracji zabezpieczeń uniemożliwia zabezpieczenia replikacji.

Ważne

W węzłach systemu Linux certyfikaty muszą być sformatowane jako PEM. Aby dowiedzieć się więcej na temat lokalizowania i konfigurowania certyfikatów dla systemu Linux, zobacz Konfigurowanie certyfikatów w systemie Linux.

Domyślna nazwa sekcji

ReplicatorSecurityConfig

Uwaga

Aby zmienić nazwę tej sekcji, zastąpij parametr replicatorSecuritySectionName konstruktorowi ReliableStateManagerConfiguration podczas tworzenia klasy ReliableStateManager dla tej usługi.

Konfiguracja replikatora

Konfiguracje replikatora konfigurują replikator, który jest odpowiedzialny za zapewnienie wysokiej niezawodności stanu stanowej usługi Reliable Service przez replikowanie i utrwalanie stanu lokalnie. Domyślna konfiguracja jest generowana przez szablon programu Visual Studio i powinna wystarczyć. W tej sekcji omówiono dodatkowe konfiguracje, które są dostępne do dostosowania replikatora.

Domyślna nazwa sekcji

ReplicatorConfig

Uwaga

Aby zmienić nazwę tej sekcji, zastąpuj parametr replicatorSettingsSectionName konstruktorowi ReliableStateManagerConfiguration podczas tworzenia klasy ReliableStateManager dla tej usługi.

Nazwy konfiguracji

Nazwa Jednostka Wartość domyślna Uwagi
BatchAcknowledgementInterval Sekundy 0.015 Okres, dla którego replikator w pomocniczej chwili czeka po otrzymaniu operacji przed wysłaniem potwierdzenia do podstawowego. Wszelkie inne potwierdzenia, które mają być wysyłane dla operacji przetworzonych w tym interwale, są wysyłane jako jedna odpowiedź.
ReplicatorEndpoint Nie dotyczy Brak parametru wymaganego domyślnie Adres IP i port używany przez replikator podstawowy/pomocniczy do komunikowania się z innymi replikatorami w zestawie replik. Powinno to odwoływać się do punktu końcowego zasobu TCP w manifeście usługi. Zapoznaj się z zasobami manifestu usługi , aby dowiedzieć się więcej na temat definiowania zasobów punktu końcowego w manifeście usługi.
MaxPrimaryReplicationQueueSize Liczba operacji 8192 Maksymalna liczba operacji w kolejce podstawowej. Operacja jest zwalniana po odebraniu potwierdzenia przez replikator podstawowy ze wszystkich replikatorów pomocniczych. Ta wartość musi być większa niż 64 i moc 2.
MaxSecondaryReplicationQueueSize Liczba operacji 16384 Maksymalna liczba operacji w kolejce pomocniczej. Operacja jest zwalniana po udostępnieniu stanu wysokiej dostępności przez trwałość. Ta wartość musi być większa niż 64 i moc 2.
CheckpointThresholdInMB MB 50 Ilość miejsca w pliku dziennika, po którym jest określony stan kontrolny.
MaxRecordSizeInKB KB 1024 Największy rozmiar rekordu, który replikator może zapisać w dzienniku. Ta wartość musi być wielokrotną 4 i większą niż 16.
MinLogSizeInMB MB 0 (określony system) Minimalny rozmiar dziennika transakcyjnego. Dziennik nie będzie mógł obcinać do rozmiaru poniżej tego ustawienia. 0 wskazuje, że replikator określi minimalny rozmiar dziennika. Zwiększenie tej wartości zwiększa możliwość wykonywania częściowych kopii i przyrostowych kopii zapasowych, ponieważ szanse na obcięcie odpowiednich rekordów dziennika są obniżane.
TruncationThresholdFactor Czynnik 2 Określa, jaki rozmiar dziennika zostanie wyzwolony. Próg obcinania jest określany przez minLogSizeInMB pomnożony przez TruncationThresholdFactor. Parametr TruncationThresholdFactor musi być większy niż 1. Parametr MinLogSizeInMB * TruncationThresholdFactor musi być mniejszy niż MaxStreamSizeInMB.
ThrottlingThresholdFactor Czynnik 4 Określa, jaki rozmiar dziennika, replika zacznie być ograniczana. Próg ograniczania przepływności (w MB) jest określany przez parametr Max((MinLogSizeInMB * ThrottlingThresholdFactor),(CheckpointThresholdInMB * ThrottlingThresholdFactor)). Próg ograniczania przepustowości (w MB) musi być większy niż próg obcinania (w MB). Próg obcinania (w MB) musi być mniejszy niż MaxStreamSizeInMB.
MaxAccumulatedBackupLogSizeInMB MB 800 Maksymalny skumulowany rozmiar (w MB) dzienników kopii zapasowych w danym łańcuchu dzienników kopii zapasowych. Żądania przyrostowej kopii zapasowej nie będą działać, jeśli przyrostowa kopia zapasowa wygeneruje dziennik kopii zapasowej, który spowoduje skumulowane dzienniki kopii zapasowej, ponieważ odpowiedni pełny rozmiar kopii zapasowej będzie większy niż ten rozmiar. W takich przypadkach użytkownik musi wykonać pełną kopię zapasową.
SharedLogId GUID "" Określa unikatowy identyfikator GUID do użycia do identyfikowania udostępnionego pliku dziennika używanego z tą repliką. Zazwyczaj usługi nie powinny używać tego ustawienia. Jeśli jednak określono wartość SharedLogId, należy również określić parametr SharedLogPath.
SharedLogPath W pełni kwalifikowana nazwa ścieżki "" Określa w pełni kwalifikowaną ścieżkę, w której zostanie utworzony udostępniony plik dziennika dla tej repliki. Zazwyczaj usługi nie powinny używać tego ustawienia. Jeśli jednak określono parametr SharedLogPath, należy również określić wartość SharedLogId.
SlowApiMonitoringDuration Sekundy 300 Ustawia interwał monitorowania dla zarządzanych wywołań interfejsu API. Przykład: użytkownik dostarczył funkcję wywołania zwrotnego kopii zapasowej. Po upływie interwału do Menedżera kondycji zostanie wysłany raport o kondycji ostrzeżenia.
LogTruncationIntervalSeconds Sekundy 0 Konfigurowalny interwał, w którym obcinanie dziennika zostanie zainicjowane na każdej repliki. Służy do zapewnienia, że dziennik jest również obcinany na podstawie czasu zamiast tylko rozmiaru dziennika. To ustawienie wymusza również przeczyszczenie usuniętych wpisów w niezawodnym słowniku. W związku z tym można go użyć do zapewnienia, że usunięte elementy są czyszczone w odpowiednim czasie.
EnableStableReads Wartość logiczna Fałsz Włączenie stabilnych odczytów ogranicza repliki pomocnicze do zwracania wartości, które zostały acked kworum.

Przykładowa konfiguracja za pomocą kodu

class Program
{
    /// <summary>
    /// This is the entry point of the service host process.
    /// </summary>
    static void Main()
    {
        ServiceRuntime.RegisterServiceAsync("HelloWorldStatefulType",
            context => new HelloWorldStateful(context, 
                new ReliableStateManager(context, 
        new ReliableStateManagerConfiguration(
                        new ReliableStateManagerReplicatorSettings()
            {
                RetryInterval = TimeSpan.FromSeconds(3)
                        }
            )))).GetAwaiter().GetResult();
    }
}    
class MyStatefulService : StatefulService
{
    public MyStatefulService(StatefulServiceContext context, IReliableStateManagerReplica stateManager)
        : base(context, stateManager)
    { }
    ...
}

Przykładowy plik konfiguracji

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <Section Name="ReplicatorConfig">
      <Parameter Name="ReplicatorEndpoint" Value="ReplicatorEndpoint" />
      <Parameter Name="BatchAcknowledgementInterval" Value="0.05"/>
      <Parameter Name="CheckpointThresholdInMB" Value="512" />
   </Section>
   <Section Name="ReplicatorSecurityConfig">
      <Parameter Name="CredentialType" Value="X509" />
      <Parameter Name="FindType" Value="FindByThumbprint" />
      <Parameter Name="FindValue" Value="9d c9 06 b1 69 dc 4f af fd 16 97 ac 78 1e 80 67 90 74 9d 2f" />
      <Parameter Name="StoreLocation" Value="LocalMachine" />
      <Parameter Name="StoreName" Value="My" />
      <Parameter Name="ProtectionLevel" Value="EncryptAndSign" />
      <Parameter Name="AllowedCommonNames" Value="My-Test-SAN1-Alice,My-Test-SAN1-Bob" />
   </Section>
</Settings>

Uwagi

Usługa BatchAcknowledgementInterval kontroluje opóźnienie replikacji. Wartość "0" powoduje najmniejsze możliwe opóźnienie kosztem przepływności (ponieważ należy wysłać i przetworzyć więcej komunikatów potwierdzenia, z których każda zawiera mniej potwierdzeń). Im większa wartość parametru BatchAcknowledgementInterval, tym większa jest ogólna przepływność replikacji kosztem większego opóźnienia operacji. Przekłada się to bezpośrednio na opóźnienie zatwierdzeń transakcji.

Wartość checkpointThresholdInMB kontroluje ilość miejsca na dysku, którego replikator może użyć do przechowywania informacji o stanie w dedykowanym pliku dziennika repliki. Zwiększenie tej wartości do wartości wyższej niż wartość domyślna może spowodować szybsze ponowne skonfigurowanie, gdy nowa replika zostanie dodana do zestawu. Jest to spowodowane częściowym transferem stanu, który odbywa się z powodu dostępności większej liczby historii operacji w dzienniku. Może to potencjalnie zwiększyć czas odzyskiwania repliki po awarii.

Ustawienie MaxRecordSizeInKB definiuje maksymalny rozmiar rekordu, który można zapisać przez replikatora w pliku dziennika. W większości przypadków domyślny rozmiar rekordu 1024 KB jest optymalny. Jeśli jednak usługa powoduje, że większe elementy danych są częścią informacji o stanie, może być konieczne zwiększenie tej wartości. Istnieje niewielka korzyść, dzięki czemu maxRecordSizeInKB jest mniejszy niż 1024, ponieważ mniejsze rekordy używają tylko miejsca potrzebnego dla mniejszego rekordu. Oczekujemy, że ta wartość będzie musiała zostać zmieniona tylko w rzadkich przypadkach.

Ustawienia SharedLogId i SharedLogPath są zawsze używane razem, aby usługa korzystała z oddzielnego dziennika udostępnionego niż domyślny dziennik udostępniony dla węzła. Aby uzyskać najlepszą wydajność, jak najwięcej usług powinno określać ten sam dziennik udostępniony. Udostępnione pliki dziennika powinny być umieszczane na dyskach, które są używane wyłącznie dla udostępnionego pliku dziennika w celu zmniejszenia rywalizacji o przenoszenie głowy. Oczekujemy, że ta wartość będzie musiała zostać zmieniona tylko w rzadkich przypadkach.

Następne kroki