Configurar serviços de estado confiável

Existem dois conjuntos de definições de configuração para serviços fiáveis. Um conjunto é global para todos os serviços fiáveis no cluster, enquanto o outro conjunto é específico para um serviço fiável em particular.

Configuração Global

A configuração global de serviço fiável é especificada no manifesto do cluster na secção KtlLogger. Permite a configuração da localização e tamanho partilhados do log, além dos limites globais de memória usados pelo logger. O manifesto do cluster é um único ficheiro XML que contém definições e configurações aplicáveis a todos os nós e serviços do cluster. O ficheiro é normalmente chamado de ClusterManifest.xml. Pode ver o manifesto do cluster usando o comando PowerShell Get-ServiceFabricClusterManifest.

Nomes de configuração

Nome Unidade Valor predefinido Observações
WriteBufferMemoryPoolMinimumInKB Kilobytes 8388608 Número mínimo de KB a serem alocados em modo kernel para a pool de memória do buffer de escrita do logger. Este pool de memória é usado para armazenar informação de estado em cache antes de gravar no disco.
WriteBufferMemoryPoolMaximumInKB Kilobytes Sem limite Tamanho máximo a que a zona de memória do buffer de escrita do logger pode crescer.
SharedLogId GUID "" Especifica um GUID único para identificar o ficheiro de registo partilhado predefinido usado por todos os serviços fiáveis em todos os nós do cluster que não especificam o SharedLogId na sua configuração específica do serviço. Se o SharedLogId for especificado, então o SharedLogPath também deve ser especificado.
SharedLogPath Nome de caminho totalmente qualificado "" Especifica o caminho completo onde o ficheiro de registo partilhado é usado por todos os serviços fiáveis em todos os nós do cluster, exceto aqueles que especificam o SharedLogPath na sua configuração específica do serviço. No entanto, se o SharedLogPath for especificado, então o SharedLogId também deve ser especificado.
TamanhoDoLogPartilhadoEmMB Megabytes 8192 Especifica o número de MB de espaço em disco a alocar estaticamente para o registo partilhado. O valor deve ser 2048 ou superior.

No Azure ARM ou no modelo JSON local, o exemplo abaixo mostra como alterar o registo de transações partilhado que é criado para suportar coleções fiáveis para serviços com estado.

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

Exemplo de secção de manifesto do cluster local de desenvolvedores

Se quiser alterar isto no seu ambiente de desenvolvimento local, precisa de editar o ficheiro clustermanifest.xml local.

   <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>

Observações

O logger tem um pool global de memória alocada a partir da memória do kernel não paginada, disponível para todos os serviços fiáveis num nó para armazenamento em cache dos dados de estado antes de ser escrito no log dedicado associado à réplica do serviço fiável. O tamanho do pool é controlado pelas definições WriteBufferMemoryPoolMinimumInKB e WriteBufferMemoryPoolMaximumInKB. WriteBufferMemoryPoolMinimumInKB especifica tanto o tamanho inicial deste pool de memória como o tamanho mais baixo a que o pool de memória pode encolher. WriteBufferMemoryPoolMaximumInKB é o maior tamanho a que o pool de memória pode crescer. Cada réplica de serviço fiável que seja aberta pode aumentar o tamanho do pool de memória por um valor determinado pelo sistema, até ao máximo definido em WriteBufferMemoryPoolMaximumInKB. Se houver mais procura de memória do pool de memória do que a disponível, os pedidos de memória serão atrasados até que a memória esteja disponível. Portanto, se o pool de memória do buffer de escrita for demasiado pequeno para uma configuração específica, o desempenho pode sofrer.

As definições SharedLogId e SharedLogPath são sempre usadas em conjunto para definir o GUID e a localização do registo partilhado predefinido para todos os nós do cluster. O log partilhado padrão é utilizado para todos os serviços confiáveis que não especificam as definições no ficheiro settings.xml para o serviço específico. Para melhor desempenho, os ficheiros de registo partilhados devem ser colocados em discos usados exclusivamente para o ficheiro de registo partilhado, para reduzir a contenda.

SharedLogSizeInMB especifica a quantidade de espaço em disco a pré-realocar para o registo partilhado por defeito em todos os nós. SharedLogId e SharedLogPath não precisam de ser especificados para que SharedLogSizeInMB seja especificado.

Configuração Específica de Serviço

Pode modificar as configurações padrão dos Serviços Fiáveis Stateful usando o pacote de configuração (Config) ou a implementação do serviço (código).

  • Config - A configuração através do pacote config é feita alterando o ficheiro Settings.xml gerado na raiz do pacote Microsoft Visual Studio sob a pasta Config de cada serviço da aplicação.
  • Código - A configuração via código é feita criando um ReliableStateManager usando um objeto ReliableStateManagerConfiguration com o conjunto de opções apropriado.

Por defeito, o Azure Service Fabric runtime procura nomes de secção pré-definidos no ficheiro Settings.xml e consome os valores de configuração enquanto cria os componentes de execução subjacentes.

Observação

Não apague os nomes das secções das seguintes configurações no ficheiro Settings.xml gerado na solução Visual Studio, a menos que planeie configurar o seu serviço por código. Renomear o nome do pacote de configuração ou dos nomes das secções exigirá uma alteração de código ao configurar o ReliableStateManager.

Configuração de segurança do replicador

As configurações de segurança dos replicadores são usadas para proteger o canal de comunicação utilizado durante a replicação. Isto significa que os serviços não poderão ver o tráfego de replicação uns dos outros, garantindo que os dados disponibilizados também estejam seguros. Por padrão, uma seção de configuração de segurança vazia impede a segurança de replicação.

Important

Nos nós Linux, os certificados devem ser formatados em PEM. Para saber mais sobre como localizar e configurar certificados para Linux, consulte Configurar certificados no Linux.

Nome padrão da secção

ReplicatorSecurityConfig

Observação

Para alterar o nome desta secção, substitua o parâmetro replicatorSecuritySectionName para o construtor ReliableStateManagerConfiguration ao criar o ReliableStateManager para este serviço.

Configuração do replicador

As configurações do replicador configuram o replicador responsável por tornar o estado do Reliable Service com estado altamente fiável, replicando e persistindo o estado localmente. A configuração padrão é gerada pelo modelo Visual Studio e deve ser suficiente. Esta secção fala sobre configurações adicionais disponíveis para ajustar o replicador.

Nome padrão da secção

ReplicatorConfig

Observação

Para alterar o nome desta secção, substitua o parâmetro replicatorSettingsSectionName para o construtor ReliableStateManagerConfiguration ao criar o ReliableStateManager para este serviço.

Nomes de configuração

Nome Unidade Valor predefinido Observações
IntervaloDeReconhecimentoEmLote Segundos 0.015 Período de tempo pelo qual o replicador no secundário espera, após receber uma operação, antes de enviar uma confirmação ao primário. Quaisquer outras confirmações a serem enviadas para operações processadas dentro deste intervalo são enviadas como uma única resposta.
ReplicatorEndpoint N/A Sem parâmetro padrão — obrigatório Endereço IP e porta que o replicador primário/secundário usará para comunicar com outros replicadores no conjunto de réplicas. Isto deve referenciar um endpoint de recurso TCP no manifesto de serviço. Consulte os recursos do manifesto de serviço para saber mais sobre a definição de recursos de endpoint num manifesto de serviço.
MaxPrimaryReplicationQueueSize Número de operações 8192 Número máximo de operações na fila primária. Uma operação é libertada após o replicador principal receber um reconhecimento de todos os replicadores secundários. Este valor deve ser superior a 64 e uma potência de 2.
MaxSecondaryReplicationQueueSize Número de operações 16384 Número máximo de operações na fila secundária. Uma operação é liberada depois de tornar o seu estado disponível de forma contínua através da persistência. Este valor deve ser superior a 64 e uma potência de 2.
LimiarDePontoDeVerificaçãoEmMB MB 50 Quantidade de espaço no ficheiro de registo após o qual o estado é controlado.
MaxRecordSizeInKB BDC 1024 Maior tamanho de registo que o replicador pode registar no log. Este valor deve ser múltiplo de 4 e superior a 16.
MinLogSizeInMB MB 0 (determinado pelo sistema) Tamanho mínimo do registo transacional. O tronco não poderá ser reduzido a um tamanho inferior a esta definição. 0 indica que o replicador determinará o tamanho mínimo de log. Aumentar este valor aumenta a possibilidade de fazer cópias parciais e cópias de segurança incrementais, uma vez que as hipóteses de registos relevantes serem truncados são reduzidas.
TruncationThresholdFactor Factor 2 Determina o tamanho do registo em que a truncação é acionada. O limiar de truncamento é determinado por MinLogSizeInMB multiplicado pelo Fator de Limiar de Truncação. O Factor de Limite de Truncamento deve ser superior a 1. MinLogSizeInMB * TruncationThresholdFactor deve ser inferior ao MaxStreamSizeInMB.
ThrottlingThresholdFactor Factor 4 Determina em que tamanho do tronco, a réplica começará a ser limitada. O limite de limitação (em MB) é determinado por Max((MinLogSizeInMB * ThrottlingThresholdFactor),(CheckpointThresholdInMB * ThrottlingThresholdFactor)). O limiar de aceleração (em MB) deve ser superior ao limiar de truncamento (em MB). O limiar de truncamento (em MB) deve ser inferior ao MaxStreamSizeInMB.
TamanhoMáximoAcumuladoDoLogDeBackupEmMB MB 800 Tamanho máximo acumulado (em MB) dos registos de backup numa dada cadeia de registos de backup. Pedidos de backup incrementais falharão se o backup incremental gerar um registo de backup que faça com que os registos de backup acumulados, desde o backup completo relevante, excedessem este tamanho. Nesses casos, o utilizador é obrigado a fazer uma cópia de segurança completa.
SharedLogId GUID "" Especifica um GUID único para identificar o ficheiro de registo partilhado usado com esta réplica. Normalmente, os serviços não devem usar esta configuração. No entanto, se o SharedLogId for especificado, então o SharedLogPath também deve ser especificado.
SharedLogPath Nome de caminho totalmente qualificado "" Especifica o caminho totalmente qualificado onde o ficheiro de registo partilhado desta réplica será criado. Normalmente, os serviços não devem usar esta configuração. No entanto, se o SharedLogPath for especificado, então o SharedLogId também deve ser especificado.
SlowApiMonitoringDuration Segundos 300 Define o intervalo de monitorização para chamadas de API geridas. Exemplo: função de retorno de backup fornecida pelo utilizador. Após o intervalo, será enviado um relatório de saúde de aviso ao Gestor de Saúde.
LogTruncationIntervalSeconds Segundos 0 Intervalo configurável no qual a truncagem logarítmica será iniciada em cada réplica. É usado para garantir que o log também é truncado com base no tempo e não apenas no tamanho do log. Esta configuração também obriga à purga das entradas eliminadas no dicionário fiável. Por isso, pode ser usado para garantir que os itens eliminados sejam eliminados de forma atempada.
EnableStableReads booleano Falso Ao ativar leituras estáveis, restringe-se as réplicas secundárias a devolverem valores que foram confirmados por quórum.

Configuração de exemplo via código

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)
    { }
    ...
}

Arquivo de configuração de exemplo

<?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>

Observações

O BatchAcknowledgementInterval controla a latência de replicação. Um valor de '0' resulta na menor latência possível, ao custo do débito da rede (já que mais mensagens de confirmação devem ser enviadas e processadas, cada uma contendo menos confirmações). Quanto maior for o valor do BatchAcknowledgementInterval, maior será a taxa total de replicação, em detrimento de uma maior latência operacional. Isto traduz-se diretamente na latência das confirmações de transações.

O valor CheckpointThresholdInMB controla a quantidade de espaço em disco que o replicador pode usar para armazenar informação de estado no ficheiro de registo dedicado da réplica. Aumentar este valor para um valor superior ao padrão pode resultar em tempos de reconfiguração mais rápidos quando uma nova réplica é adicionada ao conjunto. Isto deve-se à transferência parcial de estado que ocorre devido à disponibilidade de um maior histórico de operações no registo. Isto pode potencialmente aumentar o tempo de recuperação de uma réplica após uma queda.

A definição MaxRecordSizeInKB define o tamanho máximo de um registo que pode ser escrito pelo replicador no ficheiro de log. Na maioria dos casos, o tamanho padrão do registo de 1024 KB é o ideal. No entanto, se o serviço estiver a fazer com que itens de dados maiores façam parte da informação de estado, então esse valor poderá ter de ser aumentado. Há pouco benefício em tornar o MaxRecordSizeInKB menor do que 1024, pois os registos mais pequenos usam apenas o espaço necessário para o disco mais pequeno. Esperamos que este valor precise de ser alterado apenas em casos raros.

As definições SharedLogId e SharedLogPath são sempre usadas em conjunto para que um serviço utilize um registo partilhado separado do registo partilhado por defeito para o nó. Para maior eficiência, o maior número possível de serviços deve especificar o mesmo registo partilhado. Os ficheiros de registo partilhados devem ser colocados em discos usados exclusivamente para o ficheiro de registo partilhado, de modo a reduzir a contenção de movimentos de cabeça. Esperamos que este valor precise de ser alterado apenas em casos raros.

Próximos passos