Configurar serviços fiáveis com estado

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 de um determinado serviço fiável.

Configuração Global

A configuração de serviço fiável global é especificada no manifesto do cluster para o cluster na secção KtlLogger. Permite a configuração da localização e tamanho do registo partilhado, bem como os limites de memória globais utilizados pelo logger. O manifesto do cluster é um único ficheiro XML que contém definições e configurações que se aplicam a todos os nós e serviços no cluster. Normalmente, o ficheiro é denominado ClusterManifest.xml. Pode ver o manifesto do cluster para o cluster com o comando Get-ServiceFabricClusterManifest powershell.

Nomes de configuração

Name Unidade Valor predefinido Observações
WriteBufferMemoryPoolMinimumInKB Kilobytes 8388608 Número mínimo de KB a alocar no modo kernel para o conjunto de memória intermédia de escrita do logger. Este conjunto de memória é utilizado para colocar em cache informações de estado antes de escrever no disco.
WriteBufferMemoryPoolMaximumInKB Kilobytes Sem Limite Tamanho máximo ao qual o conjunto de memória intermédia de escrita do logger pode aumentar.
SharedLogId GUID "" Especifica um GUID exclusivo a utilizar para identificar o ficheiro de registo partilhado predefinido utilizado por todos os serviços fiáveis em todos os nós do cluster que não especificam o SharedLogId na configuração específica do serviço. Se SharedLogId for especificado, o SharedLogPath também tem de ser especificado.
SharedLogPath Nome do caminho completamente qualificado "" Especifica o caminho completamente qualificado em que o ficheiro de registo partilhado utilizado por todos os serviços fiáveis em todos os nós do cluster que não especificam o SharedLogPath na configuração específica do serviço. No entanto, se o SharedLogPath for especificado, o SharedLogId também tem de ser especificado.
SharedLogSizeInMB Megabytes 8192 Especifica o número de MB de espaço em disco a alocar estaticamente para o registo partilhado. O valor tem de ser 2048 ou superior.

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

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

Secção de manifesto de cluster de programador local de exemplo

Se quiser alterar isto no seu ambiente de desenvolvimento local, tem de editar o ficheiro de 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 conjunto global de memória alocado a partir de memória kernel não paginada que está disponível para todos os serviços fiáveis num nó para colocar dados de estado em cache antes de ser escrito no registo dedicado associado à réplica de serviço fiável. O tamanho do conjunto é controlado pelas definições WriteBufferMemoryPoolMinimumInKB e WriteBufferMemoryPoolMaximumInKB. WriteBufferMemoryPoolMinimumInKB especifica o tamanho inicial deste conjunto de memória e o tamanho mais baixo para o qual o conjunto de memória pode diminuir. WriteBufferMemoryPoolMaximumInKB é o tamanho mais elevado ao qual o conjunto de memória pode crescer. Cada réplica de serviço fiável que é aberta pode aumentar o tamanho do conjunto de memória por um valor determinado pelo sistema até WriteBufferMemoryPoolMaximumInKB. Se houver mais procura de memória do conjunto de memória do que está disponível, os pedidos de memória serão adiados até que a memória esteja disponível. Por conseguinte, se o conjunto de memória intermédia de escrita for demasiado pequeno para uma configuração específica, o desempenho poderá sofrer.

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

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

Configuração Específica do Serviço

Pode modificar as configurações predefinidas do Reliable Services com estado através do pacote de configuração (Configuração) ou da implementação do serviço (código).

  • Configuração – a configuração através do pacote de configuração é efetuada ao alterar o ficheiro de Settings.xml gerado na raiz do pacote do Microsoft Visual Studio na pasta Configurar para cada serviço na aplicação.
  • Código – a configuração através do código é efetuada através da criação de um ReliableStateManager com um objeto ReliableStateManagerConfiguration com o conjunto de opções adequado.

Por predefinição, o runtime do Azure Service Fabric procura nomes de secções predefinidos no ficheiro Settings.xml e consome os valores de configuração ao criar os componentes de runtime subjacentes.

Nota

Não elimine os nomes das secções das seguintes configurações no ficheiro Settings.xml que é gerado na solução do Visual Studio, a menos que planeie configurar o seu serviço através de código. Mudar o nome do pacote de configuração ou dos nomes das secções requer 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 utilizadas 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 que são disponibilizados de forma elevada também são seguros. Por predefinição, uma secção de configuração de segurança vazia impede a segurança da replicação.

Importante

Nos nós do Linux, os certificados têm de estar formatados em PEM. Para saber mais sobre como localizar e configurar certificados para Linux, veja Configurar certificados no Linux.

Nome da secção predefinido

ReplicatorSecurityConfig

Nota

Para alterar este nome de 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 altamente fiável ao replicar e manter o estado localmente. A configuração predefinida é gerada pelo modelo do Visual Studio e deve ser suficiente. Esta secção fala sobre configurações adicionais que estão disponíveis para otimizar o replicador.

Nome da secção predefinido

ReplicatorConfig

Nota

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

Nomes de configuração

Name Unidade Valor predefinido Observações
BatchAcknowledgementInterval Segundos 0.015 Período de tempo para o qual o replicador na secundária aguarda depois de receber uma operação antes de enviar uma confirmação para a primária. Quaisquer outras confirmações a serem enviadas para operações processadas neste intervalo são enviadas como uma resposta.
ReplicatorEndpoint N/D Não existem parâmetros predefinidos Endereço IP e porta que o replicador primário/secundário utilizará para comunicar com outros replicadores no conjunto de réplicas. Esta ação deve referenciar um ponto final de recurso TCP no manifesto do serviço. Veja Recursos de manifesto do serviço para ler mais sobre a definição de recursos de ponto final 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 depois de o replicador primário receber uma confirmação de todos os replicadores secundários. Este valor tem de ser maior que 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 é libertada depois de tornar o seu estado altamente disponível por persistência. Este valor tem de ser maior que 64 e uma potência de 2.
CheckpointThresholdInMB MB 50 Quantidade de espaço de ficheiro de registo após o qual o estado é registado.
MaxRecordSizeInKB KB 1024 O maior tamanho de registo que o replicador pode escrever no registo. Este valor tem de ser um múltiplo de 4 e superior a 16.
MinLogSizeInMB MB 0 (determinado pelo sistema) Tamanho mínimo do registo transacional. O registo não poderá truncar para um tamanho abaixo desta definição. 0 indica que o replicador determinará o tamanho mínimo do registo. Aumentar este valor aumenta a possibilidade de fazer cópias parciais e cópias de segurança incrementais, uma vez que as probabilidades de os registos relevantes serem truncados são reduzidas.
TruncationThresholdFactor Fator 2 Determina o tamanho do registo, a truncagem será acionada. O limiar de truncagem é determinado por MinLogSizeInMB multiplicado por TruncationThresholdFactor. TruncationThresholdFactor tem de ser maior que 1. MinLogSizeInMB * TruncationThresholdFactor tem de ser menor que MaxStreamSizeInMB.
ThrottlingThresholdFactor Fator 4 Determina o tamanho do registo, 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) tem de ser maior do que o limiar de truncagem (em MB). O limiar de truncagem (em MB) tem de ser inferior a MaxStreamSizeInMB.
MaxAccumulatedBackupLogSizeInMB MB 800 Tamanho máximo acumulado (em MB) dos registos de cópias de segurança numa determinada cadeia de registo de cópias de segurança. Um pedido de cópia de segurança incremental falhará se a cópia de segurança incremental gerar um registo de cópia de segurança que faria com que os registos de cópias de segurança acumulados, uma vez que a cópia de segurança completa relevante fosse maior do que este tamanho. Nestes casos, é necessário que o utilizador faça uma cópia de segurança completa.
SharedLogId GUID "" Especifica um GUID exclusivo a utilizar para identificar o ficheiro de registo partilhado utilizado com esta réplica. Normalmente, os serviços não devem utilizar esta definição. No entanto, se o SharedLogId for especificado, o SharedLogPath também tem de ser especificado.
SharedLogPath Nome de caminho completamente qualificado "" Especifica o caminho completamente qualificado onde será criado o ficheiro de registo partilhado para esta réplica. Normalmente, os serviços não devem utilizar esta definição. No entanto, se o SharedLogPath for especificado, o SharedLogId também tem de ser especificado.
SlowApiMonitoringDuration Segundos 300 Define o intervalo de monitorização para chamadas à API gerida. Exemplo: função de chamada de retorno de cópia de segurança fornecida pelo utilizador. Após o intervalo ter passado, será enviado um relatório de estado de funcionamento de aviso para o Health Manager.
LogTruncationIntervalSeconds Segundos 0 Intervalo configurável no qual a truncagem de registos será iniciada em cada réplica. É utilizado para garantir que o registo também é truncado com base no tempo, em vez de apenas no tamanho do registo. Esta definição também força a remoção de entradas eliminadas no dicionário fiável. Assim, pode ser utilizado para garantir que os itens eliminados são removidos em tempo útil.
EnableStableReads Booleano Falso A ativação de leituras estáveis restringe as réplicas secundárias aos valores devolvidos que foram desancorados por quórum.

Configuração de exemplo através de 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)
    { }
    ...
}

Ficheiro 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 do débito (como mais mensagens de reconhecimento têm de ser enviadas e processadas, cada uma com menos confirmações). Quanto maior for o valor para BatchAcknowledgementInterval, maior será o débito de replicação geral, com o custo de uma latência de operação mais elevada. Isto traduz-se diretamente na latência das consolidações de transações.

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

A definição MaxRecordSizeInKB define o tamanho máximo de um registo que pode ser escrito pelo replicador no ficheiro de registo. Na maioria dos casos, o tamanho de registo de 1024 KB predefinido é ideal. No entanto, se o serviço estiver a fazer com que itens de dados maiores façam parte das informações de estado, este valor poderá ter de ser aumentado. Não há grande benefício em tornar MaxRecordSizeInKB inferior a 1024, uma vez que os registos mais pequenos utilizam apenas o espaço necessário para o registo mais pequeno. Esperamos que este valor tenha de ser alterado apenas em casos raros.

As definições SharedLogId e SharedLogPath são sempre utilizadas em conjunto para que um serviço utilize um registo partilhado separado do registo partilhado predefinido do nó. Para uma melhor 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 que são utilizados apenas para o ficheiro de registo partilhado para reduzir a contenção do movimento de cabeçalho. Esperamos que este valor tenha de ser alterado apenas em casos raros.

Passos seguintes