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 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 zwykle nazywany ClusterManifest.xml. Manifest klastra dla klastra można wyświetlić przy użyciu polecenia Get-ServiceFabricClusterManifest programu PowerShell.
Nazwy konfiguracji
Nazwisko | Jednostka | Domyślna wartość | 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 zapisaniem na dysku. |
WriteBufferMemoryPoolMaximumInKB | Kilobajtów | Bez ograniczeń | Maksymalny rozmiar, do którego może rosnąć pula pamięci buforu zapisu rejestratora. |
SharedLogId | Identyfikator GUID | "" | Określa unikatowy identyfikator GUID do użycia 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 określonej konfiguracji 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 usługi niezawodne we wszystkich węzłach klastra, które nie określają ścieżki SharedLogPath w określonej konfiguracji usługi. Jeśli jednak parametr SharedLogPath jest określony, 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 niezawodną repliką 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 może rosnąć pula pamięci. Każda niezawodna replika usługi, która jest otwarta, może zwiększyć rozmiar puli pamięci przez system określony w wysokości do WriteBufferMemoryPoolMaximumInKB. Jeśli istnieje większe zapotrzebowanie na pamięć z puli pamięci niż jest dostępne, żądania pamięci będą opóźniane 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 wystąpić.
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ść, pliki dziennika udostępnionego 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 na wszystkich węzłach. Parametr SharedLogId i SharedLogPath nie muszą być określone w celu określenia parametru SharedLogSizeInMB.
Konfiguracja specyficzna dla usługi
Domyślne konfiguracje 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 pośrednictwem kodu jest realizowana przez utworzenie klasy ReliableStateManager przy użyciu obiektu ReliableStateManagerConfiguration z odpowiednim zestawem 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, przesłoń parametr replicatorSecuritySectionName do konstruktora ReliableStateManagerConfiguration podczas tworzenia elementu 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 dostrajania replikatora.
Domyślna nazwa sekcji
ReplicatorConfig
Uwaga
Aby zmienić tę nazwę sekcji, zastąpij parametr replicatorSettingsSectionName konstruktorowi ReliableStateManagerConfiguration podczas tworzenia klasy ReliableStateManager dla tej usługi.
Nazwy konfiguracji
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ż domyślna może spowodować szybsze ponowne skonfigurowanie czasu, 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. W 1024 r. rozmiar 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 z domyślnego dziennika udostępnionego 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 ruch głowy. Oczekujemy, że ta wartość będzie musiała zostać zmieniona tylko w rzadkich przypadkach.