次の方法で共有


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