Partilhar via


Balanceamento de métricas subagrupadas

O que é subclustering

O subclustering acontece quando serviços com diferentes restrições de posicionamento têm uma métrica comum e ambos relatam a carga para ela. Se a carga relatada pelos serviços diferir significativamente, a carga total nos nós terá um grande desvio padrão e parecerá que o cluster está desequilibrado, mesmo quando tiver o melhor equilíbrio possível.

Como o subclustering afeta o balanceamento de carga

Se a carga relatada pelos serviços em nós diferentes diferir significativamente, pode parecer que há um grande desequilíbrio onde não há. Além disso, se o falso desequilíbrio causado pelo subclustering for maior do que o desequilíbrio real, ele tem o potencial de confundir o algoritmo de balanceamento do Resource Manager e produzir um equilíbrio subótimo no cluster.

Por exemplo, digamos que temos quatro serviços e todos eles relatam uma carga para a métrica Metric1:

  • Serviço A – tem uma restrição de posicionamento "NodeType==Frontend", relata uma carga de 10
  • Serviço B – tem uma restrição de posicionamento "NodeType==Frontend", relata uma carga de 10
  • Serviço C – tem uma restrição de posicionamento "NodeType==Backend", relata uma carga de 100
  • Serviço D – tem uma restrição de posicionamento "NodeType==Backend", relata uma carga de 100
  • E temos quatro nós. Dois deles têm NodeType definido como "Frontend" e os outros dois são "Backend"

E temos a seguinte colocação:

Exemplo de posicionamento subagrupado

O cluster pode parecer desequilibrado, temos uma grande carga nos nós 3 e 4, mas esse posicionamento cria o melhor equilíbrio possível nessa situação.

O Resource Manager pode reconhecer situações de subclustering e, em quase todos os casos, pode produzir o equilíbrio ideal para a situação dada.

Para algumas situações excecionais, quando o Gerenciador de Recursos não é capaz de equilibrar de forma ideal uma métrica subclusterizada, ele ainda detetará subclustering e gerará um relatório de integridade para aconselhá-lo a corrigir o problema.

Tipos de subclustering e como eles são manipulados

As situações de subagrupamento podem ser classificadas em três categorias diferentes. A categoria de uma situação específica de subclustering determina como ela será tratada pelo Gerenciador de Recursos.

Primeira categoria – subagrupamento plano com grupos de nós disjuntos

Esta categoria tem a forma mais simples de subclustering, onde os nós podem ser separados em diferentes grupos e cada serviço só pode ser colocado em nós em um desses grupos. Cada nó pertence a um grupo e apenas a um grupo. A situação descrita acima pertence a esta categoria, assim como a maioria das situações de subagrupamento.

Para as situações nesta categoria, o Gestor de Recursos pode produzir o equilíbrio ideal e não é necessária qualquer intervenção adicional.

Segunda categoria – subagrupamento com grupos de nós hierárquicos

Essa situação acontece quando um grupo de nós permitido para um serviço é um subconjunto do grupo de nós permitido para outro serviço. O exemplo mais comum dessa situação é quando algum serviço tem uma restrição de posicionamento definida e outro serviço não tem restrição de posicionamento e pode ser colocado em qualquer nó.

Exemplo:

  • Serviço A: sem restrição de posicionamento
  • Serviço B: restrição de posicionamento "NodeType==Frontend"
  • Serviço C: restrição de posicionamento "NodeType==Backend"

Essa configuração cria uma relação subconjunto-superconjunto entre grupos de nós para serviços diferentes.

Subconjunto de subgrupos superconjuntos

Nessa situação, há uma chance de que um equilíbrio subótimo seja feito.

O Resource Manager reconhecerá essa situação e produzirá um relatório de integridade aconselhando você a dividir o Serviço A em dois serviços – Serviço A1 que pode ser colocado em nós Frontend e Serviço A2 que pode ser colocado em nós Backend. Isso nos levará de volta à situação de primeira categoria que pode ser equilibrada da melhor forma.

Terceira categoria – subagrupamento com sobreposição parcial entre conjuntos de nós

Esta situação acontece quando há uma sobreposição parcial entre conjuntos de nós nos quais alguns serviços podem ser colocados.

Por exemplo, se tivermos uma propriedade de nó chamada NodeColor e tivermos três nós:

  • Nó 1: NodeColor=Red
  • Nó 2: NodeColor=Blue
  • Nó 3: NodeColor=Verde

E temos dois serviços:

  • Serviço A: com restrição de colocação "Cor==Vermelho || Cor==Azul"
  • Serviço B: com restrição de colocação "Cor==Azul || Cor==Verde"

Devido a isso, o Serviço A pode ser colocado nos nós 1 e 2 e o Serviço B pode ser colocado nos nós 2 e 3.

Nessa situação, há uma chance de que um equilíbrio subótimo seja feito.

O Resource Manager reconhecerá essa situação e produzirá um relatório de integridade aconselhando você a dividir alguns dos serviços.

Para esta situação, o Gestor de Recursos não é capaz de dar uma proposta de como dividir os serviços, uma vez que várias divisões podem ser feitas e não há como estimar qual seria o caminho ideal para dividir os serviços.

Configurando o subclustering

O comportamento do Resource Manager sobre subclustering pode ser modificado modificando os seguintes parâmetros de configuração:

  • SubclusteringEnabled - parâmetro determina se o Resource Manager levará em conta o subclustering ao fazer o balanceamento de carga. Se esse parâmetro estiver desativado, o Gerenciador de Recursos ignorará o subclustering e tentará alcançar o equilíbrio ideal em nível global. O valor padrão desse parâmetro é false.
  • SubclusteringReportingPolicy - determina como o Resource Manager emitirá relatórios de integridade para subclustering hierárquico e de sobreposição parcial. Um valor zero significa que os relatórios de integridade sobre subclustering estão desativados, "1" significa que relatórios de integridade de aviso serão produzidos para situações de subclustering subótimas e um valor de "2" produzirá relatórios de integridade "OK". O valor padrão para esse parâmetro é "1".

ClusterManifest.xml:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="SubclusteringEnabled" Value="true" />
            <Parameter Name="SubclusteringReportingPolicy" Value="1" />
        </Section>

via ClusterConfig.json para implantações autônomas ou Template.json para clusters hospedados do Azure:

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "SubclusteringEnabled",
          "value": "true"
      },
      {
          "name": "SubclusteringReportingPolicy",
          "value": "1"
      },
    ]
  }
]

Próximos passos