Como migrar um VIP em um cluster de alta disponibilidade no SLES para um balanceador de carga interno

No Google Cloud, a maneira recomendada de implementar um endereço IP virtual (VIP, na sigla em inglês) em um cluster de alta disponibilidade (HA, na sigla em inglês) para SAP baseado em SO é usar o suporte a failover de um balanceador de carga TCP/UDP interno.

Se você tiver um cluster de alta disponibilidade para SAP do SUSE Linux Enterprise Server (SLES) no Google Cloud que usa um VIP implementado com um IP de alias, poderá migrar o VIP para usar um balanceador de carga interno.

Se você usou o modelo sap_hana_ha do Deployment Manager fornecido pelo Google Cloud para implantar um sistema de escalonamento vertical do SAP HANA em um cluster de alta disponibilidade no SLES, o VIP será implementado com um IP de alias.

Estas instruções mostram como migrar um VIP em um cluster de alta disponibilidade no SLES.

Pré-requisitos

Para seguir as instruções, é necessário ter um cluster de alta disponibilidade configurado corretamente no Google Cloud que usa um IP de alias para a implementação do VIP.

Visão geral das etapas:

  • Configure e teste um balanceador de carga usando uma regra de encaminhamento e um endereço IP temporários em vez do VIP.
  • Configure o cluster para o modo de manutenção e, se possível, interrompa as instâncias do servidor de aplicativos SAP para evitar um comportamento inesperado.
  • Desaloque o endereço IP de alias do host principal. Esse endereço se tornará o VIP no balanceador de carga.
  • Na configuração do cluster do Pacemaker, siga estas instruções:
    • Altere a classe do recurso VIP existente.
    • Substitua os parâmetros atuais do IP de alias pelos parâmetros do serviço de verificação de integridade.

Confirmar o endereço VIP existente

Como raiz, na instância de VM principal, exiba a configuração de cluster com base no IP de alias:

$ crm configure show

O VIP é o endereço especificado no parâmetro alias_ip=, conforme mostrado no exemplo a seguir:

primitive rsc_vip_gcp-primary ocf:gcp:alias \
        op monitor interval=60s timeout=60s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params alias_ip="10.128.1.200/32" hostlist="ha1 ha2" gcloud_path="/usr/local/google-cloud-sdk/bin/gcloud" logging=yes \
        meta priority=10
primitive rsc_vip_int-primary IPaddr2 \
        params ip=10.128.1.200 cidr_netmask=32 nic=eth0 \
        op monitor interval=10s

No Console do Cloud, confirme se o endereço IP que está sendo usado com o IP de alias está reservado:

$ gcloud compute addresses list --filter="region:( cluster-region )"

Se o endereço IP estiver reservado e alocado para a instância de VM principal, seu status será exibido como IN_USE. Ao realocar o IP para o balanceador de carga, primeiro você o desaloca da instância principal ativa. Nesse momento, o status dele mudará para RESERVED.

Se o endereço não estiver incluído nos endereços IP retornados pelo comando de listagem, reserve o endereço agora para evitar conflitos de endereço no futuro:

$ gcloud compute addresses create vip-name \
  --region cluster-region --subnet cluster-subnet \
  --addresses vip-address

Liste seus endereços novamente para confirmar que o endereço IP aparece como RESERVED.

Configurar o suporte a failover do Cloud Load Balancing

O serviço de balanceamento de carga TCP/UDP interno com suporte a failover direciona o tráfego para o host ativo em um cluster do SAP HANA com base em um serviço de verificação de integridade. O procedimento fornece proteção em uma configuração ativo/passivo e pode ser estendido para oferecer suporte a uma configuração ativo/ativo (secundária ativada para leitura).

Para evitar conflitos e permitir testes antes da conclusão da migração, crie uma regra de encaminhamento temporária com um endereço IP de marcador da mesma sub-rede que o endereço VIP. Quando tudo estiver pronto para mudar a implementação do VIP, você criará uma nova regra de encaminhamento final com o endereço VIP.

Reservar um endereço IP temporário para o IP virtual

O endereço VIP segue o sistema ativo do SAP HANA. O balanceador de carga encaminha o tráfego enviado ao VIP para a VM que está hospedando o sistema ativo do SAP HANA.

  1. Abra o Cloud Shell:

    Acesse o Cloud Shell

  2. Reserve um endereço IP temporário na mesma sub-rede que o IP de alias para fins de teste. Se você omitir a sinalização --addresses, um endereço IP será escolhido para você na sub-rede especificada:

    $ gcloud compute addresses create vip-name \
      --region cluster-region --subnet cluster-subnet \
      --addresses vip-address

    Para mais informações sobre como reservar um IP estático, consulte Como reservar um endereço IP interno estático.

  3. Confirmar reserva de endereço IP:

    $ gcloud compute addresses describe vip-name \
      --region cluster-region

    O resultado será semelhante a:

    address: 10.0.0.19
    addressType: INTERNAL
    creationTimestamp: '2020-05-20T14:19:03.109-07:00'
    description: ''
    id: '8961491304398200872'
    kind: compute#address
    name: vip-for-hana-ha
    networkTier: PREMIUM
    purpose: GCE_ENDPOINT
    region: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1
    selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/addresses/vip-for-hana-ha
    status: RESERVED
    subnetwork: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/subnetworks/example-subnet-us-central1

Criar grupos de instâncias para suas VMs de host

  1. No Cloud Shell, crie dois grupos de instâncias não gerenciadas e atribua a VM do host principal a um e a VM do host secundário à outra:

    $ gcloud compute instance-groups unmanaged create primary-ig-name \
      --zone=primary-zone
    $ gcloud compute instance-groups unmanaged add-instances primary-ig-name \
      --zone=primary-zone \
      --instances=primary-host-name
    $ gcloud compute instance-groups unmanaged create secondary-ig-name \
      --zone=secondary-zone
    $ gcloud compute instance-groups unmanaged add-instances secondary-ig-name \
      --zone=secondary-zone \
      --instances=secondary-host-name
    
  2. Confirme a criação dos grupos de instâncias:

    $ gcloud compute instance-groups unmanaged list

    O resultado será semelhante a:

    NAME          ZONE           NETWORK          NETWORK_PROJECT        MANAGED  INSTANCES
    hana-ha-ig-1  us-central1-a  example-network  example-project-123456 No       1
    hana-ha-ig-2  us-central1-c  example-network  example-project-123456 No       1

Criar uma verificação de integridade do Compute Engine

  1. No Cloud Shell, crie a verificação de integridade. Para a porta usada pela verificação de integridade, escolha uma porta que esteja no intervalo privado 49152-65535 para evitar conflitos com outros serviços. Os valores de intervalo de verificação e tempo limite são um pouco mais longos do que os padrões para aumentar a tolerância de failover durante os eventos de migração em tempo real do Compute Engine. É possível ajustar os valores, se necessário:

    $ gcloud compute health-checks create tcp health-check-name --port=healthcheck-port-num \
      --proxy-header=NONE --check-interval=10 --timeout=10 --unhealthy-threshold=2 \
      --healthy-threshold=2
  2. Confirme a criação da verificação de integridade:

    $ gcloud compute health-checks describe health-check-name

    O resultado será semelhante a:

    checkIntervalSec: 10
    creationTimestamp: '2020-05-20T21:03:06.924-07:00'
    healthyThreshold: 2
    id: '4963070308818371477'
    kind: compute#healthCheck
    name: hana-health-check
    selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/global/healthChecks/hana-health-check
    tcpHealthCheck:
     port: 60000
     portSpecification: USE_FIXED_PORT
     proxyHeader: NONE
    timeoutSec: 10
    type: TCP
    unhealthyThreshold: 2

Criar uma regra de firewall para as verificações de integridade

Defina uma regra de firewall para uma porta no intervalo particular que permita o acesso às VMs do host a partir dos intervalos de IP usados pelas verificações de integridade do Compute Engine, 35.191.0.0/16 e 130.211.0.0/22. Para mais informações, consulte Como criar regras de firewall para verificações de integridade.

  1. Se você ainda não tiver uma, crie uma regra de firewall para permitir as verificações de integridade:

    $ gcloud compute firewall-rules create  rule-name \
      --network network-name \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags network-tags \
      --rules tcp:hlth-chk-port-num

    Exemplo:

    gcloud compute firewall-rules create  fw-allow-health-checks \
    --network example-network \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges 35.191.0.0/16,130.211.0.0/22 \
    --target-tags cluster-ntwk-tag \
    --rules tcp:60000

Configurar o balanceador de carga e o grupo de failover

  1. Crie o serviço de back-end do balanceador de carga:

    $ gcloud compute backend-services create backend-service-name \
      --load-balancing-scheme internal \
      --health-checks health-check-name \
      --no-connection-drain-on-failover \
      --drop-traffic-if-unhealthy \
      --failover-ratio 1.0 \
      --region cluster-region \
      --global-health-checks
  2. Adicione o grupo de instâncias principal ao serviço de back-end:

    $ gcloud compute backend-services add-backend backend-service-name \
      --instance-group primary-ig-name \
      --instance-group-zone primary-zone \
      --region cluster-region
  3. Adicione o grupo de instâncias de failover secundário ao serviço de back-end:

    $ gcloud compute backend-services add-backend backend-service-name \
      --instance-group secondary-ig-name \
      --instance-group-zone secondary-zone \
      --failover \
      --region cluster-region
  4. Crie uma regra de encaminhamento temporária. Para o endereço IP, especifique o endereço IP temporário que você reservou para testes:

    $ gcloud compute forwarding-rules create rule-name \
      --load-balancing-scheme internal \
      --address vip-address \
      --subnet cluster-subnet \
      --region cluster-region \
      --backend-service backend-service-name \
      --ports ALL

Testar a configuração do balanceador de carga

Mesmo que os grupos de instâncias de back-end não sejam registrados como íntegros até mais tarde, teste a configuração do balanceador de carga configurando um listener para responder às verificações de integridade. Depois de configurar um listener, se o balanceador de carga estiver configurado corretamente, o status dos grupos de instâncias de back-end será alterado para íntegro.

As seções a seguir apresentam métodos diferentes que podem ser usados para testar a configuração.

Como testar o balanceador de carga com o utilitário socat

É possível usar o utilitário socat para detectar temporariamente a porta de verificação de integridade. Você precisa instalar o utilitário socat mesmo assim, porque ele será usado mais tarde quando você configurar os recursos do cluster.

  1. Nas duas VMs do host como raiz, instale o utilitário socat:

    # zypper install -y socat

  2. Inicie um processo socat para detectar por 60 segundos na porta de verificação de integridade:

    # timeout 60s socat - TCP-LISTEN:hlth-chk-port-num,fork

  3. No Cloud Shell, depois de esperar alguns segundos pela verificação de integridade para detectar o listener, verifique a integridade dos grupos de instâncias de back-end:

    $ gcloud compute backend-services get-health backend-service-name \
      --region cluster-region

    A resposta será assim:

    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1
       ipAddress: 10.0.0.35
       port: 80
     kind: compute#backendServiceGroupHealth
    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2
       ipAddress: 10.0.0.34
       port: 80
     kind: compute#backendServiceGroupHealth

Como testar o balanceador de carga usando a porta 22

Se a porta 22 estiver aberta para conexões SSH nas VMs do host, será possível editar temporariamente o verificador de integridade para usar a porta 22, que tem um listener que pode responder ao verificador de integridade.

Para usar temporariamente a porta 22, siga estas etapas:

  1. Clique na verificação de integridade no console:

    Acessar a página "Verificações de integridade"

  2. Clique em Editar.

  3. No campo Porta, altere o número da porta para 22.

  4. Clique em Salvar e aguarde um ou dois minutos.

  5. No Cloud Shell, verifique a integridade dos grupos de instâncias de back-end:

    $ gcloud compute backend-services get-health backend-service-name \
      --region cluster-region

    A resposta será assim:

    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1
       ipAddress: 10.0.0.35
       port: 80
     kind: compute#backendServiceGroupHealth
    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2
       ipAddress: 10.0.0.34
       port: 80
     kind: compute#backendServiceGroupHealth
  6. Quando terminar, altere o número da porta de verificação de integridade para o número original.

Migrar a implementação do VIP para usar o balanceador de carga

As etapas a seguir editam a configuração do cluster do Pacemaker e a regra de encaminhamento do balanceador de carga para concluir a migração do VIP.

Preparar o sistema para edição

  1. Se possível, pare a conexão do aplicativo SAP com o banco de dados SAP HANA, porque você interromperá a conexão rapidamente para trocar os endereços IP. Os processos de trabalho do NetWeaver podem se reconectar ao banco de dados, mas é possível que aconteçam falhas ou situações pendentes que a interrupção da conexão pode evitar. Verifique se o IP está registrado em um intervalo interno que faz parte da VPC na região de destino.

  2. Como raiz na instância principal ativa, coloque o cluster no modo de manutenção:

    $ crm configure property maintenance-mode="true"
  3. Faça backup da configuração do cluster:

    $ crm configure show > clusterconfig.backup

Desalocar o IP de alias

  1. No Cloud Shell, confirme os intervalos do IP de alias atribuídos à instância principal do SAP:

    $ gcloud compute instances describe \
        primary-host-name \
        --zone primary-zone \
        --format="flattened(name,networkInterfaces[].aliasIpRanges)"
  2. No Console do Cloud, atualize a interface de rede. Se você não precisar manter nenhum IP de alias, especifique --aliases "":

    $ gcloud compute instances network-interfaces update primary-host-name \
    --zone primary-zone \
    --aliases "ip-ranges-to-retain"

Criar a regra de encaminhamento de VIP e fazer a limpeza

  1. No Console do Cloud, crie uma nova regra de encaminhamento de front-end para o balanceador de carga, especificando o endereço IP que foi usado anteriormente para o IP de alias como o endereço IP. Este é seu VIP.

    $ gcloud compute forwarding-rules create rule-name \
      --load-balancing-scheme internal \
      --address vip-address \
      --subnet cluster-subnet \
      --region cluster-region \
      --backend-service backend-service-name \
      --ports ALL
  2. Confirme a criação da regra de encaminhamento e anote o nome da regra de encaminhamento temporária para exclusão:

    $ gcloud compute forwarding-rules list
  3. Exclua a regra de encaminhamento temporária:

    $ gcloud compute forwarding-rules delete rule-name --region=cluster-region
  4. Libere o endereço IP temporário que você reservou:

    $ gcloud compute addresses delete temp-ip-name --region=cluster-region

Editar o recurso VIP primitivo na configuração do cluster

  1. Na instância principal como raiz, edite a definição do recurso VIP primitivo. Se o cluster foi criado pelos modelos do Deployment Manager fornecidos pelo Google Cloud, o nome do recurso VIP primitivo será rsc_vip_gcp-primary:

    $ crm configure edit rsc_name

    A definição do recurso é aberta em um editor de texto, como o "vi".

  2. Faça as seguintes alterações no recurso VIP na configuração do cluster de alta disponibilidade do Pacemaker:

    • Substitua a classe de recurso ocf:gcp:alias por anything.
    • Altere o intervalo op monitor para interval=10s.
    • Altere o tempo limite de op monitor para timeout=20s.
    • Substitua os parâmetros do IP de alias:
      alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes
      com parâmetros do serviço de verificação de integridade:
      binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null"

    Por exemplo, substitua as entradas em negrito no seguinte exemplo de IP de alias:

    primitive rsc_vip_gcp-primary ocf:gcp:alias \
        op monitor interval=60s timeout=60s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes \
        meta priority=10

    Quando você terminar de editar, a definição de recurso do serviço de verificação de integridade será semelhante ao exemplo a seguir:

    primitive rsc_vip_gcp-primary anything \
        op monitor interval=10s timeout=20s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null" \
        meta priority=10

    No exemplo anterior, HC port é a porta de verificação de integridade que você especificou ao configurar o utilitário socat e criar a verificação de integridade.

  3. Remova o cluster do modo de manutenção:

    $ crm configure property maintenance-mode="false"

Testar o cluster de alta disponibilidade atualizado

A partir da instância do aplicativo, confirme se é possível acessar o banco de dados emitindo um dos seguintes comandos:

  • Como usuário do sidadm:

    > R3trans -d
  • Como qualquer usuário:

    • telnet VIP HANA SQL port
    • nc -zv VIP HANA SQL port