Partilhar via


Configurar serviços confiáveis com monitoração de estado

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

Configuração Global

A configuração de serviço global confiável é especificada no manifesto do cluster para o cluster na seção KtlLogger. Ele permite a configuração do local e tamanho do log compartilhado, além dos limites globais de memória usados pelo registrador. O manifesto do cluster é um único arquivo XML que contém definições e configurações que se aplicam a todos os nós e serviços no cluster. O arquivo é normalmente chamado de ClusterManifest.xml. Você pode ver o manifesto do cluster usando o comando powershell Get-ServiceFabricClusterManifest.

Nomes de configuração

Nome Unit Default value Observações
WriteBufferMemoryPoolMinimumInKB Kilobytes 8388608 Número mínimo de KB a alocar no modo kernel para o pool de memória de buffer de gravação do logger. Esse pool de memória é usado para armazenar em cache informações de estado antes de gravar no disco.
WriteBufferMemoryPoolMaximumInKB Kilobytes Sem Limite Tamanho máximo para o qual o pool de memória do buffer de gravação do logger pode crescer.
SharedLogId GUID "" Especifica um GUID exclusivo a ser usado para identificar o arquivo de log compartilhado padrão usado por todos os serviços confiáveis em todos os nós do cluster que não especificam o SharedLogId em sua configuração específica de serviço. Se SharedLogId for especificado, SharedLogPath também deverá ser especificado.
SharedLogPath Nome do caminho totalmente qualificado "" Especifica o caminho totalmente qualificado onde o arquivo de log compartilhado usado por todos os serviços confiáveis em todos os nós do cluster que não especificam o SharedLogPath em sua configuração específica de serviço. No entanto, se SharedLogPath for especificado, SharedLogId também deverá ser especificado.
SharedLogSizeInMB Megabytes 8192 Especifica o número de MB de espaço em disco a ser alocado estaticamente para o log compartilhado. O valor deve ser 2048 ou maior.

No modelo JSON do Azure ARM ou local, o exemplo abaixo mostra como alterar o log de transações compartilhadas que é criado para dar suporte a quaisquer coleções confiáveis para serviços com monitoração de estado.

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

Exemplo de seção de manifesto de cluster de desenvolvedor local

Se você quiser alterar isso em seu ambiente de desenvolvimento local, você precisa editar o arquivo 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 registrador tem um pool global de memória alocada a partir da memória do kernel não paginada que está disponível para todos os serviços confiáveis em um nó para armazenar em cache dados de estado antes de serem gravados no log dedicado associado à réplica de serviço confiável. O tamanho do pool é controlado pelas configurações WriteBufferMemoryPoolMinimumInKB e WriteBufferMemoryPoolMaximumInKB. WriteBufferMemoryPoolMinimumInKB especifica o tamanho inicial desse pool de memória e o tamanho mais baixo para o qual o pool de memória pode diminuir. WriteBufferMemoryPoolMaximumInKB é o tamanho mais alto para o qual o pool de memória pode crescer. Cada réplica de serviço confiável que é aberta pode aumentar o tamanho do pool de memória em uma quantidade determinada pelo sistema até WriteBufferMemoryPoolMaximumInKB. Se houver mais demanda de memória do pool de memória do que está disponível, as solicitações de memória serão atrasadas até que a memória esteja disponível. Portanto, se o pool de memória de buffer de gravação for muito pequeno para uma configuração específica, o desempenho poderá ser prejudicado.

As configurações SharedLogId e SharedLogPath são sempre usadas juntas para definir o GUID e o local do log compartilhado padrão para todos os nós no cluster. O log compartilhado padrão é usado para todos os serviços confiáveis que não especificam as configurações no settings.xml para o serviço específico. Para obter o melhor desempenho, os arquivos de log compartilhados devem ser colocados em discos usados exclusivamente para o arquivo de log compartilhado para reduzir a contenção.

SharedLogSizeInMB especifica a quantidade de espaço em disco a ser pré-alocada para o log compartilhado padrão em todos os nós. SharedLogId e SharedLogPath não precisam ser especificados para que SharedLogSizeInMB seja especificado.

Configuração Específica do Serviço

Você pode modificar as configurações padrão do Stateful Reliable Services usando o pacote de configuração (Config) ou a implementação do serviço (código).

  • Config - A configuração por meio do pacote de configuração é realizada alterando o arquivo de Settings.xml gerado na raiz do pacote do Microsoft Visual Studio na pasta Config para cada serviço no aplicativo.
  • Código - A configuração via código é realizada criando um ReliableStateManager usando um objeto ReliableStateManagerConfiguration com as opções apropriadas definidas.

Por padrão, o tempo de execução do Azure Service Fabric procura nomes de seção predefinidos no arquivo de Settings.xml e consome os valores de configuração ao criar os componentes de tempo de execução subjacentes.

Nota

Não exclua os nomes de seção das seguintes configurações no arquivo de Settings.xml que é gerado na solução Visual Studio, a menos que você planeje configurar seu serviço via código. Renomear o pacote de configuração ou os nomes de seção exigirá uma alteração de código ao configurar o ReliableStateManager.

Configuração de segurança do replicador

As configurações de segurança do replicador são usadas para proteger o canal de comunicação usado durante a replicação. Isso significa que os serviços não poderão ver o tráfego de replicação uns dos outros, garantindo que os dados altamente disponíveis também estejam seguros. Por padrão, uma seção de configuração de segurança vazia impede a segurança de replicação.

Importante

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 da seção padrão

ReplicatorSecurityConfig

Nota

Para alterar o nome dessa seção, substitua o parâmetro replicatorSecuritySectionName pelo 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 Serviço Confiável com estado altamente confiável, replicando e persistindo o estado localmente. A configuração padrão é gerada pelo modelo do Visual Studio e deve ser suficiente. Esta seção fala sobre configurações adicionais que estão disponíveis para ajustar o replicador.

Nome da seção padrão

ReplicatorConfig

Nota

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

Nomes de configuração

Nome Unit Default value Observações
BatchAcknowledgementInterval Segundos 0,015 Período de tempo pelo qual o replicador no secundário aguarda depois de receber uma operação antes de enviar de volta uma confirmação para o primário. Quaisquer outras confirmações a serem enviadas para operações processadas dentro deste intervalo são enviadas como uma resposta.
ReplicatorEndpoint N/A Nenhum parâmetro padrão - obrigatório Endereço IP e porta que o replicador primário/secundário usará para se comunicar com outros replicadores no conjunto de réplicas. Isso deve fazer referência a um ponto de extremidade de recurso TCP no manifesto do serviço. Consulte Recursos de manifesto de serviço para ler mais sobre como definir recursos de ponto de extremidade em um manifesto de serviço.
MaxPrimaryReplicationQueueSize Número de operações 8192 Número máximo de operações na fila principal. Uma operação é liberada depois que o replicador primário recebe uma confirmação 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 seu estado altamente disponível através da persistência. Este valor deve ser superior a 64 e uma potência de 2.
Ponto de verificaçãoThresholdInMB MB 50 Quantidade de espaço do arquivo de log após o qual o estado é verificado.
MaxRecordSizeInKB KB 1024 Maior tamanho de registro que o replicador pode gravar no log. Esse valor deve ser um múltiplo de 4 e maior que 16.
MinLogSizeInMB MB 0 (sistema determinado) Tamanho mínimo do log transacional. O log não poderá truncar para um tamanho abaixo dessa configuração. 0 indica que o replicador determinará o tamanho mínimo do log. Aumentar esse valor aumenta a possibilidade de fazer cópias parciais e backups incrementais, uma vez que as chances de os registros de log relevantes serem truncados são reduzidas.
TruncationThresholdFactor Fator 2 Determina em que tamanho do log, o truncamento será acionado. O limiar de truncamento é determinado por MinLogSizeInMB multiplicado por TruncationThresholdFactor. TruncationThresholdFactor deve ser maior que 1. MinLogSizeInMB * TruncationThresholdFactor deve ser menor que MaxStreamSizeInMB.
ThrottlingThresholdFactor Fator 4 Determina em que tamanho do log, a réplica começará a ser limitada. O limiar de limitação (em MB) é determinado por Max((MinLogSizeInMB * ThrottlingThresholdFactor),(CheckpointThresholdInMB * ThrottlingThresholdFactor)). O limiar de limitação (em MB) deve ser maior do que o limiar de truncamento (em MB). O limite de truncamento (em MB) deve ser menor que MaxStreamSizeInMB.
MaxAccumulatedBackupLogSizeInMB MB 800 Tamanho máximo acumulado (em MB) dos logs de backup em uma determinada cadeia de logs de backup. Uma solicitação de backup incremental falhará se o backup incremental gerar um log de backup que fará com que os logs de backup acumulados, uma vez que o backup completo relevante, sejam maiores do que esse tamanho. Nesses casos, o usuário é obrigado a fazer um backup completo.
SharedLogId GUID "" Especifica um GUID exclusivo a ser usado para identificar o arquivo de log compartilhado usado com essa réplica. Normalmente, os serviços não devem usar essa configuração. No entanto, se SharedLogId for especificado, SharedLogPath também deverá ser especificado.
SharedLogPath Nome do caminho totalmente qualificado "" Especifica o caminho totalmente qualificado onde o arquivo de log compartilhado para essa réplica será criado. Normalmente, os serviços não devem usar essa configuração. No entanto, se SharedLogPath for especificado, SharedLogId também deverá ser especificado.
SlowApiMonitoringDuration Segundos 300 Define o intervalo de monitoramento para chamadas de API gerenciadas. Exemplo: função de retorno de chamada de backup fornecida pelo usuário. Após o intervalo, um relatório de integridade de aviso será enviado ao Gerente de Saúde.
LogTruncationIntervalSeconds Segundos 0 Intervalo configurável no qual o truncamento de log será iniciado em cada réplica. Ele é usado para garantir que o log também seja truncado com base no tempo, em vez de apenas no tamanho do log. Essa configuração também força a limpeza de entradas excluídas no dicionário confiável. Portanto, ele pode ser usado para garantir que os itens excluídos sejam limpos em tempo hábil.
EnableStableReads Booleano False A habilitação de leituras estáveis restringe réplicas secundárias a valores de retorno que foram quórum-acked.

Exemplo de configuração 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

BatchAcknowledgementInterval controla a latência de replicação. Um valor de '0' resulta na menor latência possível, ao custo da taxa de transferência (já que mais mensagens de confirmação devem ser enviadas e processadas, cada uma contendo menos confirmações). Quanto maior o valor de BatchAcknowledgementInterval, maior a taxa de transferência geral da replicação, ao custo de maior latência de operação. Isso se traduz diretamente na latência das confirmações de transações.

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

A configuração MaxRecordSizeInKB define o tamanho máximo de um registro que pode ser gravado pelo replicador no arquivo de log. Na maioria dos casos, o tamanho de registro padrão de 1024 KB é o ideal. No entanto, se o serviço estiver fazendo com que itens de dados maiores façam parte das informações de estado, esse valor pode precisar ser aumentado. Há poucos benefícios em tornar MaxRecordSizeInKB menor que 1024, já que registros menores usam apenas o espaço necessário para o registro menor. Esperamos que este valor tenha de ser alterado apenas em casos raros.

As configurações SharedLogId e SharedLogPath são sempre usadas juntas para fazer com que um serviço use um log compartilhado separado do log compartilhado padrão para o nó. Para melhor eficiência, o maior número possível de serviços deve especificar o mesmo log compartilhado. Os arquivos de log compartilhados devem ser colocados em discos que são usados exclusivamente para o arquivo de log compartilhado para reduzir a contenção de movimento de cabeça. Esperamos que este valor tenha de ser alterado apenas em casos raros.

Próximos passos