Kubernetes에서 DH2i DxEnterprise를 사용하여 가용성 그룹 배포

적용 대상:SQL Server on Linux

이 튜토리얼은 SQL Server AKS(Azure Kubernetes Service) Kubernetes 클러스터에 배포된 SQL Server Linux 기반 컨테이너를 위해 DH2i DxEnterprise를 사용해 Always On 가용성 그룹(AG)을 설정하는 방법을 설명합니다. 사이드카 구성(기본 설정) 중에서 선택하거나 자체 사용자 지정 컨테이너 이미지를 만들 수 있습니다.

메모

Microsoft는 데이터 이동, AG 및 SQL Server 구성 요소를 지원합니다. DH2i는 클러스터 및 쿼럼 관리를 포함하는 DxEnterprise 제품을 지원합니다.

StatefulSet 배포 방법과 DH2i DxEnterprise를 사용해 AG를 생성하고 구성하는 방법을 배우세요. 이 자습서는 다음 단계로 구성됩니다.

  • 헤드리스 서비스 구성 만들기
  • 사이드카 컨테이너와 동일한 Pod에서 SQL Server 및 DxEnterprise를 사용하여 StatefulSet 구성 만들기
  • SQL Server AG 만들기 및 구성, 보조 복제본(replica) 추가
  • AG에서 데이터베이스를 생성하고 장애 조치 전환을 테스트하십시오.

Prerequisites

이 자습서에서는 3개의 복제본(replica)이 있는 AG의 예를 보여줍니다. 필요한 항목:

  • Azure Kubernetes Service(AKS) 또는 Kubernetes 클러스터.
  • AG 기능 및 터널이 활성화된 유효한 DxEnterprise 라이선스입니다. 자세한 내용은 비프로덕션 용도의 경우 개발자 버전을 참조하고 프로덕션 워크로드의 경우 DxEnterprise 소프트웨어를 참조하세요.

헤드리스 서비스 만들기

  1. Kubernetes 클러스터에서 헤드리스 서비스(headless service)를 사용하면 파드가 호스트 이름을 통해 서로 연결할 수 있습니다.

    헤드리스 서비스를 생성하려면 다음 샘플 콘텐츠가 포함된 headless_services.yaml YAML 파일을 생성합니다.

    #Headless services for local connections/resolution
    apiVersion: v1
    kind: Service
    metadata:
      name: dxemssql-0
    spec:
      clusterIP: None
      selector:
        statefulset.kubernetes.io/pod-name: dxemssql-0
      ports:
        - name: dxl
          protocol: TCP
          port: 7979
        - name: dxc-tcp
          protocol: TCP
          port: 7980
        - name: dxc-udp
          protocol: UDP
          port: 7981
        - name: sql
          protocol: TCP
          port: 1433
        - name: listener
          protocol: TCP
          port: 14033
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: dxemssql-1
    spec:
      clusterIP: None
      selector:
        statefulset.kubernetes.io/pod-name: dxemssql-1
      ports:
        - name: dxl
          protocol: TCP
          port: 7979
        - name: dxc-tcp
          protocol: TCP
          port: 7980
        - name: dxc-udp
          protocol: UDP
          port: 7981
        - name: sql
          protocol: TCP
          port: 1433
        - name: listener
          protocol: TCP
          port: 14033
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: dxemssql-2
    spec:
      clusterIP: None
      selector:
        statefulset.kubernetes.io/pod-name: dxemssql-2
      ports:
        - name: dxl
          protocol: TCP
          port: 7979
        - name: dxc-tcp
          protocol: TCP
          port: 7980
        - name: dxc-udp
          protocol: UDP
          port: 7981
        - name: sql
          protocol: TCP
          port: 1433
        - name: listener
          protocol: TCP
          port: 14033
    
  2. 구성을 적용하려면 다음 명령을 실행합니다.

    kubectl apply -f headless_services.yaml
    

StatefulSet 만들기

  1. 다음 샘플 콘텐츠로 StatefulSet YAML 파일을 생성하고 이름을 dxemssql.yaml로 지정합니다.

    이 StatefulSet 구성은 데이터를 저장하기 위해 영구 볼륨 클레임을 사용하는 세 개의 DxEMSSQL 복제본을 생성합니다. 이 StatefulSet의 각 Pod는 2개의 컨테이너, 즉 SQL Server 컨테이너와 DxEnterprise 컨테이너로 구성됩니다. 이 컨테이너들은 사이드카 구성에서 별도로 시작하지만, DxEnterprise는 SQL Server 컨테이너 내에서 AG 복제본을 관리합니다.

    #DxEnterprise + MSSQL StatefulSet
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: dxemssql
    spec:
      serviceName: "dxemssql"
      replicas: 3
      selector:
        matchLabels:
          app: dxemssql
      template:
        metadata:
          labels:
            app: dxemssql
        spec:
          securityContext:
            fsGroup: 10001
          containers:
            - name: sql
              image: mcr.microsoft.com/mssql/server:2022-latest
              env:
                - name: ACCEPT_EULA
                  value: "Y"
                - name: MSSQL_ENABLE_HADR
                  value: "1"
                - name: MSSQL_SA_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mssql
                      key: MSSQL_SA_PASSWORD
              volumeMounts:
                - name: mssql
                  mountPath: "/var/opt/mssql"
            - name: dxe
              image: docker.io/dh2i/dxe
              env:
                - name: MSSQL_SA_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mssql
                      key: MSSQL_SA_PASSWORD
              volumeMounts:
                - name: dxe
                  mountPath: "/etc/dh2i"
      volumeClaimTemplates:
        - metadata:
            name: dxe
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 1Gi
        - metadata:
            name: mssql
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 1Gi
    
  2. SQL Server 인스턴스에 대한 자격 증명을 만듭니다.

    kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"
    

    암호는 SQL Server 기본 암호 정책을 따라야 합니다. 기본적으로 암호는 8자 이상이어야 하며 대문자, 소문자, 0~9까지의 숫자 및 기호 네 가지 집합 중 세 집합의 문자를 포함해야 합니다. 암호는 최대 128자까지 가능합니다. 되도록 길고 복잡한 암호를 사용합니다.

  3. StatefulSet 구성을 적용합니다.

    kubectl apply -f dxemssql.yaml
    
  4. Pod의 상태를 확인하고 Pod의 상태가 running이 되면 다음 단계로 진행합니다.

    kubectl get pods
    kubectl describe pods
    

가용성 그룹 만들기 및 장애 조치 테스트

AG 생성 및 구성, 복제본 추가, 장애 전환 테스트에 관한 자세한 내용은 Kubernetes의 SQL Server 가용성 그룹을 참조하세요.

가용성 그룹 수신기 구성 단계(선택 사항)

다음 단계를 사용하여 AG 수신기를 구성할 수도 있습니다.

  1. DH2i 문서 마지막 부분에 있는 선택적 단계를 따라 DxEnterprise로 AG 리스너를 생성했는지 확인하세요.

  2. Kubernetes에서 선택적으로 고정 IP 주소를 만들 수 있습니다. 고정 IP 주소는 리스너 서비스를 삭제하고 다시 만들어도 리스너 서비스에 할당된 외부 IP 주소가 변경되지 않도록 보장합니다. 다음 단계에 따라 Azure Kubernetes Service(AKS)에서 고정 IP 주소를 만듭니다.

  3. IP 주소를 생성한 후 할당하고 다음 YAML 샘플로 로드 밸런서 서비스를 생성하세요.

    apiVersion: v1
    kind: Service
    metadata:
      name: agslistener
    spec:
      type: LoadBalancer
      loadBalancerIP: <static-IP-address>
      selector:
        app: mssql
      ports:
      - protocol: TCP
        port: 44444
        targetPort: 44444
    

읽기/쓰기 연결 리디렉션 구성 단계(선택 사항)

AG를 만든 후에는 2차 장치에서 1차 연결로 읽기/쓰기 연결 리디렉션을 활성화하세요. 자세한 내용은 보조-주 복제본 읽기/쓰기 연결 리디렉션(Always On 가용성 그룹)을 참조하세요.

USE master;
GO

ALTER AVAILABILITY GROUP [AGS1]
MODIFY REPLICA ON N'<name of the primary replica>'
WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
GO

ALTER AVAILABILITY GROUP [AGS1]
MODIFY REPLICA ON N'<name of the secondary-0 replica>'
WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
GO

ALTER AVAILABILITY GROUP [AGS1]
MODIFY REPLICA ON N'<name of the secondary-1 replica>'
WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL));
GO

ALTER AVAILABILITY GROUP [AGS1]
MODIFY REPLICA ON N'<name of the primary replica>'
WITH (PRIMARY_ROLE(
    READ_WRITE_ROUTING_URL = 'TCP://<External IP address of primary -0>:1433'
));
GO

ALTER AVAILABILITY GROUP [AGS1]
MODIFY REPLICA ON N'<name of the secondary-0 replica>'
WITH (PRIMARY_ROLE(
    READ_WRITE_ROUTING_URL = 'TCP://<External IP address of secondary -0>:1433'
));
GO

ALTER AVAILABILITY GROUP [AGS1]
MODIFY REPLICA ON N'<name of the secondary-1 replica>'
WITH (PRIMARY_ROLE(
    READ_WRITE_ROUTING_URL = 'TCP://<External IP address of secondary -1>:1433'
));
GO