Kubernetes で DH2i DxEnterprise を使って可用性グループをデプロイする

適用対象:SQL Server - Linux

このチュートリアルでは、DH2i DxEnterprise を使って、Azure Kubernetes Service (AKS) Kubernetes クラスターにデプロイされた SQL Server Linux ベースのコンテナーに SQL Server Always On 可用性グループ (AG) を構成する方法について説明します。 サイドカー構成 (推奨) を選ぶか、独自のカスタム コンテナー イメージを構築できます。

Note

データ移動、AG、SQL Server コンポーネントは、Microsoft によってサポートされています。 DxEnterprise 製品のサポートは、クラスターとクォーラムの管理も含めて、DH2i によって行われます。

この記事で説明されている手順を使って、StatefulSet をデプロイし、DH2i DxEnterprise ソリューションを使って AG を作成および構成する方法について説明します。 このチュートリアルは、以下の手順で構成されています。

  • ヘッドレス サービス構成を作成する
  • 同じポッド内の SQL Server と DxEnterprise をサイドカー コンテナーとして使って StatefulSet 構成を作成する
  • セカンダリ レプリカを追加して SQL Server AG を作成して構成する
  • AG にデータベースを作成し、フェールオーバーをテストする

前提条件

このチュートリアルでは、3 つのレプリカを含む AG の例を示します。 必要なもの:

  • Azure Kubernetes Service (AKS) または Kubernetes クラスター。
  • AG 機能とトンネルが有効になっている、有効な DxEnterprise ライセンス。 詳しくは、開発者向けエディションに関するページ (非運用環境での使用) か、DxEnterprise ソフトウェアに関するページ (運用ワークロード) を参照してください。

ヘッドレス サービスを作成する

  1. Kubernetes クラスターでは、ヘッドレス サービスによって、ホスト名を使って各ポッドを相互に接続できます。

    ヘッドレス サービスを作成するには、次のサンプル コンテンツを含む 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 レプリカが作成されます。 この StatefulSet の各ポッドは、SQL Server コンテナーと DxEnterprise コンテナーという 2 つのコンテナーで構成されます。 これらのコンテナーは "サイドカー" 構成で互いに独立して開始されますが、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: 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. ポッドの状態を確認し、ポッドの状態が 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 サンプルに示すように、その 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