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

適用対象:Linux 上の SQL Server

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

Note

Microsoft では、データ移動、AG、SQL Server の各コンポーネントをサポートしています。 DH2iはDxEnterprise製品をサポートしており、クラスタ管理およびクオーラム管理が含まれます。

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

    パスワードは SQL Server の既定のパスワード ポリシーに従う必要があります。 既定では、パスワードの長さは少なくとも 8 文字で、大文字、小文字、10 進数の数字、記号の 4 種類のうち 3 種類を含んでいる必要があります。 パスワードには最大 128 文字まで使用できます。 可能な限り長く複雑なパスワードを使用してください。

  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サンプルでロードバランサーサービスを作成します。

    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を作成した後、セカンダリからプライマリへの読み書き接続リダイレクトを有効にしてください。 詳しくは、「セカンダリからプライマリ レプリカへの読み取り/書き込み接続のリダイレクト (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