SLES HA 클러스터의 VIP를 내부 부하 분산기로 마이그레이션

Google Cloud에서 SAP용 OS 기반 고가용성(HA) 클러스터에 가상 IP 주소(VIP)를 구현하려면 내부 TCP/UDP 부하 분산기의 장애 조치 지원을 사용하는 것이 좋습니다.

별칭 IP로 구현된 VIP를 사용하는 기존 Google Cloud 기반 SAP용 SUSE Linux Enterprise Server(SLES) HA 클러스터가 이미 있는 경우 VIP를 마이그레이션하여 내부 부하 분산기를 대신 사용할 수 있습니다.

Google Cloud에서 제공하는 sap_hana_ha Deployment Manager 템플릿을 사용하여 SLES의 HA 클러스터에 SAP HANA 확장 시스템을 배포한 경우 VIP는 별칭 IP로 구현됩니다.

이 안내에서는 SLES HA 클러스터에서 VIP를 마이그레이션하는 방법을 보여줍니다.

기본 요건

이 안내에서는 VIP 구현에 별칭 IP를 사용하는 Google Cloud에 올바르게 구성된 HA 클러스터가 있다고 가정합니다.

단계 개요:

  • VIP 대신 임시 전달 규칙과 임시 IP 주소를 사용하여 부하 분산기를 구성하고 테스트합니다.
  • 클러스터를 유지보수 모드로 설정하고 가능한 경우 SAP 애플리케이션 서버 인스턴스를 중지하여 예기치 않은 동작을 방지합니다.
  • 기본 호스트에서 별칭 IP 주소를 할당 해제합니다. 이 주소는 부하 분산기가 있는 VIP가 됩니다.
  • Pacemaker 클러스터 구성에서 다음을 수행합니다.
    • 기존 VIP 리소스의 클래스를 변경합니다.
    • 별칭 IP의 기존 매개변수를 상태 확인 서비스의 매개변수로 바꿉니다.

기존 VIP 주소 확인

루트로 기본 VM 인스턴스에서 기존 별칭 IP 기반 클러스터 구성을 표시합니다.

$ crm configure show

VIP 주소는 다음 예시와 같이 alias_ip= 매개변수에 지정된 주소입니다.

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

Cloud Console에서 별칭 IP와 함께 사용 중인 IP 주소가 예약되어 있는지 확인합니다.

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

IP 주소가 예약되어 기본 VM 인스턴스에 할당되면 상태가 IN_USE로 표시됩니다. IP를 부하 분산기에 다시 할당하면 먼저 활성 상태의 기본 인스턴스에서 해당 IP 주소를 할당 해제하며, 이때 상태는 RESERVED로 변경됩니다.

list 명령어에 의해 반환된 IP 주소에 해당 주소가 포함되지 않은 경우 바로 예약하여 향후 주소 충돌을 방지합니다.

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

IP 주소가 RESERVED로 표시되도록 주소를 다시 나열합니다.

Cloud Load Balancing 장애 조치 지원 구성

장애 조치를 지원하는 내부 TCP/UDP 부하 분산 서비스는 상태 확인 서비스를 기반으로 SAP HANA 클러스터의 활성 호스트로 트래픽을 라우팅합니다. 따라서 활성/수동 구성에서 보호 기능을 제공하며 활성/활성(읽기 지원 보조) 구성을 지원하도록 확장될 수 있습니다.

충돌을 방지하고 마이그레이션 완료 전에 테스트를 허용하려면 VIP 주소와 동일한 서브넷의 자리표시자 IP 주소로 임시 전달 규칙을 만들어야 합니다. VIP 구현을 전환할 준비가 되면 VIP 주소로 새로운 최종 전달 규칙을 만듭니다.

가상 IP의 임시 IP 주소 예약

VIP 주소는 활성 SAP HANA 시스템을 따릅니다. 부하 분산기는 VIP로 전송된 트래픽을 현재 활성 SAP HANA 시스템을 호스팅하는 VM으로 라우팅합니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell로 이동

  2. 테스트를 위해 별칭 IP와 동일한 서브넷에 임시 IP 주소를 예약합니다. --addresses 플래그를 생략하면 지정된 서브넷의 IP 주소가 자동으로 선택됩니다.

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

    고정 IP를 예약하는 방법에 대한 자세한 내용은 고정 내부 IP 주소 예약을 참조하세요.

  3. IP 주소 예약을 확인합니다.

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

    다음 예시와 비슷한 출력이 표시됩니다.

    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

호스트 VM의 인스턴스 그룹 만들기

  1. Cloud Shell에서 비관리형 인스턴스 그룹 두 개를 만들고 기본 호스트 VM을 한 인스턴스에, 보조 호스트 VM을 다른 인스턴스에 할당합니다.

    $ 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. 인스턴스 그룹 생성을 확인합니다.

    $ gcloud compute instance-groups unmanaged list

    다음 예시와 비슷한 출력이 표시됩니다.

    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

Compute Engine 상태 확인 만들기

  1. Cloud Shell에서 상태 확인을 만듭니다. 상태 확인에 사용되는 포트로, 다른 서비스와 충돌하지 않도록 비공개 범위 49152~65535에서 포트를 선택합니다. Compute Engine 라이브 마이그레이션 이벤트 중에 장애 조치 허용 범위를 늘리기 위해 확인 간격 및 제한 시간 값이 기본값보다 약간 더 깁니다. 필요한 경우 이러한 값을 조정할 수 있습니다.

    $ 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. 상태 확인 생성을 확인합니다.

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

    다음 예시와 비슷한 출력이 표시됩니다.

    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

상태 확인에 사용할 방화벽 규칙 만들기

Compute Engine 상태 확인 35.191.0.0/16130.211.0.0/22에 사용되는 IP 범위에서 호스트 VM에 액세스할 수 있는 비공개 범위의 포트에 사용할 방화벽 규칙을 정의합니다. 자세한 내용은 상태 확인에 사용할 방화벽 규칙 만들기를 참조하세요.

  1. 방화벽을 아직 만들지 않았으면 상태 확인을 허용하는 방화벽 규칙을 만듭니다.

    $ 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

    예시:

    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

부하 분산기 및 장애 조치 그룹 구성

  1. 부하 분산기 백엔드 서비스를 만듭니다.

    $ 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. 기본 인스턴스 그룹을 백엔드 서비스에 추가합니다.

    $ gcloud compute backend-services add-backend backend-service-name \
      --instance-group primary-ig-name \
      --instance-group-zone primary-zone \
      --region cluster-region
  3. 보조 장애 조치 인스턴스 그룹을 백엔드 서비스에 추가합니다.

    $ gcloud compute backend-services add-backend backend-service-name \
      --instance-group secondary-ig-name \
      --instance-group-zone secondary-zone \
      --failover \
      --region cluster-region
  4. 임시 전달 규칙을 만듭니다. IP 주소의 경우 테스트용으로 예약한 임시 IP 주소를 지정합니다.

    $ 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

부하 분산기 구성 테스트

백엔드 인스턴스 그룹이 나중까지 정상으로 등록되지 않더라도 상태 확인에 응답하도록 리스너를 설정하여 부하 분산기 구성을 테스트할 수 있습니다. 리스너를 설정한 후 부하 분산기가 올바르게 구성되면 백엔드 인스턴스 그룹 상태가 정상으로 변경됩니다.

다음 섹션에서는 구성을 테스트하는 데 사용할 수 있는 다양한 방법을 보여줍니다.

socat 유틸리티로 부하 분산기 테스트

socat 유틸리티를 사용하여 상태 확인 포트에서 일시적으로 리슨할 수 있습니다. 나중에 클러스터 리소스를 구성할 때 socat 유틸리티를 사용하므로 이 유틸리티를 설치해야 합니다.

  1. 두 호스트 VM에서 루트로 socat 유틸리티를 설치합니다.

    # zypper install -y socat

  2. socat 프로세스를 시작하여 상태 확인 포트에서 60초 동안 리슨합니다.

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

  3. Cloud Shell에서 상태 확인이 리스너를 감지할 때까지 몇 초 정도 기다린 후 백엔드 인스턴스 그룹 상태를 확인합니다.

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

    다음과 비슷한 출력이 표시됩니다.

    ---
    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

포트 22를 사용하여 부하 분산기 테스트

호스트 VM에서 SSH 연결용으로 포트 22가 열려 있으면 상태 확인기에 응답할 수 있는 리스너가 있는 포트 22를 사용하도록 상태 확인기를 임시로 수정할 수 있습니다.

포트 22를 일시적으로 사용하려면 다음 단계를 수행합니다.

  1. Console에서 상태 확인을 클릭합니다.

    상태 확인 페이지로 이동

  2. 수정을 클릭합니다.

  3. 포트 필드에서 포트 번호를 22로 변경합니다.

  4. 저장을 클릭하고 1~2분 정도 기다립니다.

  5. Cloud Shell에서 백엔드 인스턴스 그룹 상태를 확인합니다.

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

    다음과 비슷한 출력이 표시됩니다.

    ---
    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. 확인을 완료하면 상태 확인 포트 번호를 원래 포트 번호로 다시 변경합니다.

부하 분산기를 사용하도록 VIP 구현 마이그레이션

다음 단계에서는 Pacemaker 클러스터 구성과 부하 분산기 전달 규칙을 수정하여 VIP 마이그레이션을 완료합니다.

시스템 수정 준비

  1. IP 주소를 교환하기 위해 잠시 연결을 중단하기 때문에 가능하다면 SAP 애플리케이션이 SAP HANA 데이터베이스에 접속하지 않도록 합니다. NetWeaver 작업 프로세스에서 데이터베이스에 다시 연결할 수 있지만, 장애나 지연이 발생할 수 있습니다. 이 경우 연결 중단을 통해 이를 방지할 수 있습니다. IP가 대상 리전의 VPC에 속하는 내부 범위에 등록되었는지 확인합니다.

  2. 활성 기본 인스턴스의 루트로 클러스터를 유지보수 모드로 설정합니다.

    $ crm configure property maintenance-mode="true"
  3. 클러스터 구성을 백업합니다.

    $ crm configure show > clusterconfig.backup

별칭 IP 할당 해제

  1. Cloud Shell에서 기본 SAP 인스턴스에 할당된 별칭 IP 범위를 확인합니다.

    $ gcloud compute instances describe \
        primary-host-name \
        --zone primary-zone \
        --format="flattened(name,networkInterfaces[].aliasIpRanges)"
  2. Cloud Console에서 네트워크 인터페이스를 업데이트합니다. 별칭 IP를 유지할 필요가 없으면 --aliases ""를 지정합니다.

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

VIP 전달 규칙 만들기 및 삭제

  1. Cloud Console에서 이전에 alias-IP에 사용된 IP 주소를 IP 주소로 지정하여 부하 분산기에 대한 새 프런트엔드 전달 규칙을 만듭니다. 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. 전달 규칙 생성을 확인한 후 삭제할 임시 전달 규칙의 이름을 기록해 둡니다.

    $ gcloud compute forwarding-rules list
  3. 임시 전달 규칙을 삭제합니다.

    $ gcloud compute forwarding-rules delete rule-name --region=cluster-region
  4. 예약한 임시 IP 주소를 해제합니다.

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

클러스터 구성에서 VIP 기본 리소스 수정

  1. 기본 인스턴스에서 루트로 VIP 기본 리소스 정의를 수정합니다. Google Cloud에서 제공하는 Deployment Manager 템플릿으로 클러스터를 만든 경우 VIP 기본 리소스 이름은 rsc_vip_gcp-primary입니다.

    $ crm configure edit rsc_name

    vi와 같은 텍스트 편집기에서 리소스 정의가 열립니다.

  2. Pacemaker HA 클러스터 구성에서 VIP 리소스를 다음과 같이 변경합니다.

    • 리소스 클래스 ocf:gcp:aliasanything으로 바꿉니다.
    • op monitor 간격을 interval=10s로 변경합니다.
    • op monitor 제한 시간을 timeout=20s로 변경합니다.
    • 별칭 IP 매개변수를 바꿉니다.
      alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes
      상태 확인 서비스 매개변수를 포함합니다.
      binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null"

    예를 들어 다음 별칭 IP 예시에 굵게 표시된 항목을 바꿉니다.

    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

    편집이 완료되면 상태 확인 서비스의 리소스 정의가 다음 예시와 같이 표시됩니다.

    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

    앞의 예시에서 HC port는 상태 확인을 만들고 socat 유틸리티를 구성할 때 지정한 상태 확인 포트입니다.

  3. 클러스터의 유지보수 모드를 해제합니다.

    $ crm configure property maintenance-mode="false"

업데이트된 HA 클러스터 테스트

애플리케이션 인스턴스에서 다음 명령어 중 하나를 실행하여 데이터베이스에 연결할 수 있는지 확인합니다.

  • sidadm 사용자의 경우

    > R3trans -d
  • 모든 사용자의 경우

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