Compartilhar via


Balanceamento de métricas subclusterizadas

O que é subclustering

O subclustering ocorre quando serviços com restrições de posicionamento diferentes têm uma métrica comum e relatam ambos carga para ela. Se a carga relatada pelos serviços for significativamente diferente, a carga total nos nós terá um desvio padrão grande que dará a impressão de que o cluster está desbalanceado, mesmo que ele tenha o melhor balanceamento possível.

Como o subclustering afeta o balanceamento de carga

Se a carga relatada por serviços em nós distintos for significativamente diferente, dará a impressão de um grande desbalanceamento, quando não há nenhum. Além disso, se o falso desbalanceamento causado pelo subclustering for maior que o real, ele poderá confundir o algoritmo de balanceamento do Resource Manager e produzir um balanceamento abaixo do ideal no cluster.

Por exemplo, suponha que há quatro serviços e todos 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==Frontend", relata uma carga de 100
  • Serviço D – tem uma restrição de posicionamento "NodeType==Frontend", relata uma carga de 100
  • E há quatro nós. Dois com NodeType definido como "Frontend" e dois como "Back-end"

E há também o seguinte posicionamento:

Exemplo de posicionamento subclusterizado

O cluster pode parecer desbalanceado, pois há 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 balanceamento ideal para elas.

Em casos excepcionais, quando o Resource Manager não for capaz de balancear uma métrica subclusterizada de forma ideal, ele ainda detectará o subclustering e gerará um relatório de integridade para avisá-lo sobre a necessidade de corrigir o problema.

Tipos de subclustering e como eles são tratados

As situações de subclustering podem ser classificadas em três categorias. A categoria de uma determinada situação de subclustering determina como ela será tratada pelo Resource Manager.

Primeira categoria – subclustering simples com grupos de nós não contíguos

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

Para essas situações, o Resource Manager pode produzir o balanceamento ideal e nenhuma outra intervenção é necessária.

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

Essa situação ocorre quando um grupo de nós permitidos para um serviço é um subconjunto do grupo de nós permitido para outro. O exemplo mais comum dessa situação é quando um serviço tem uma restrição de posicionamento definida e outro não tem nenhuma 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 superconjunto/subconjunto entre grupos de nós de diferentes serviços.

Subclusters de superconjuntos/subconjuntos

Nessa situação, há possibilidade de ocorrer um balanceamento abaixo do ideal.

O Resource Manager reconhecerá essa situação e produzirá um relatório de integridade o avisando sobre a necessidade de dividir o Serviço A em dois outros – o Serviço A1 que pode ser colocado em nós de front-end e o Serviço A2 que pode ser colocado em nós de back-end. Isso nos levará de volta à situação da primeira categoria, que pode ser balanceada de forma ideal.

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

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

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

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

E com dois serviços:

  • Serviço A: com restrição de posicionamento "Color==Red || Color==Blue"
  • Serviço B: com restrição de posicionamento "Color==Blue || Color==Green"

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

Nessa situação, há possibilidade de ocorrer um balanceamento abaixo do ideal.

O Resource Manager reconhecerá essa situação e produzirá um relatório de integridade o avisando sobre a necessidade de dividir alguns serviços.

Nesse caso, o Resource Manager não é capaz de apresentar uma proposta de como dividir os serviços, pois várias divisãos podem ser feitas e não há como estimar a maneira ideal de fazê-lo.

Configurando o subclustering

O comportamento do Resource Manager com relação ao subclustering pode ser modificado por meio da modificação dos seguintes parâmetros de configuração:

  • SubclusteringEnabled – o parâmetro determina se o Resource Manager levará em conta o subclustering ao fazer o balanceamento de carga. Se esse parâmetro estiver desligado, o Resource Manager irá ignorar o subclustering e tentar obter o balanceamento ideal em um 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 0 significa que os relatórios de integridade relacionados ao subclustering estão desligados, "1" significa que relatórios de integridade de aviso serão produzidos para situações de subclustering abaixo do ideal e um valor de "2" produzirá relatórios de integridade "OK". O valor padrão desse 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 pelo Azure:

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

Próximas etapas