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

적용 대상:SQL Server - Linux

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

참고 항목

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

이 문서에서 설명되는 단계를 사용하여 StatefulSet을 배포하고 DH2i DxEnterprise 솔루션을 사용하여 AG를 생성 및 구성하는 방법을 알아봅니다. 이 자습서는 다음 단계로 구성됩니다.

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

필수 조건

이 자습서에서는 3개의 복제본(replica)이 있는 AG의 예를 보여줍니다. 다음 작업을 수행해야 합니다.

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

헤드리스 서비스 만들기

  1. Kubernetes 클러스터에서 헤드리스 서비스를 사용하면 Pod가 호스트 이름을 사용하여 서로 연결할 수 있습니다.

    헤드리스 서비스를 만들려면 다음 샘플 콘텐츠가 포함된 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 구성은 영구 볼륨 클레임을 활용하여 데이터를 저장하는 3개의 DxEMSSQL 복제본(replica)을 생성합니다. 이 StatefulSet의 각 Pod는 2개의 컨테이너, 즉 SQL Server 컨테이너와 DxEnterprise 컨테이너로 구성됩니다. 이러한 컨테이너는 "사이드카" 구성에서 서로 별도로 시작되지만, DxEnterprise는 SQL Server 컨테이너에서 AG 복제본(replica)을 관리합니다.

    #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: 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>"
    
  3. StatefulSet 구성을 적용합니다.

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

    kubectl get pods
    kubectl describe pods
    

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

AG 만들기 및 구성, 복제본 추가, 장애 조치(failover) 테스트에 대한 세부 정보는 Kubernetes의 SQL Server 가용성 그룹을 참조하세요.

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

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

  1. DH2i 설명서의 마지막에 있는 선택 사항 단계에 설명된 대로 DxEnterprise를 사용하여 AG 수신기를 생성해야 합니다.

  2. Kubernetes에서 선택적으로 고정 IP 주소를 만들 수 있습니다. 고정 IP 주소를 만들 때 수신기 서비스를 삭제한 후 다시 만드는 경우에도 수신기 서비스에 할당된 외부 IP 주소가 변경되지 않도록 해야 합니다. 다음 단계에 따라 Azure Kubernetes Service(AKS)에서 고정 IP 주소를 만듭니다.

  3. IP 주소를 생성한 후 다음 YAML 샘플과 같이 해당 IP 주소를 할당하고 부하 분산 장치 서비스를 생성합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: agslistener
    spec:
      type: LoadBalancer
      loadBalancerIP: 52.140.117.62
      selector:
        app: mssql
      ports:
      - protocol: TCP
        port: 44444
        targetPort: 44444
    

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

AG를 생성한 후 다음 단계에 따라 읽기/쓰기 연결 리디렉션을 보조에서 기본으로 활성화할 수 있습니다. 자세한 내용은 보조-주 복제본 읽기/쓰기 연결 리디렉션(Always On 가용성 그룹)을 참조하세요.

USE [master];
GO

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

USE [master];
GO

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

USE [master];
GO

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

USE [master];
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

USE [master];
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

USE [master];
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