Wdrażanie grup dostępności za pomocą narzędzia DH2i DxEnterprise na platformie Kubernetes

Dotyczy:Program SQL Server w systemie Linux

Ten samouczek wyjaśnia, jak skonfigurować grupy dostępności SQL Server Always On (AG) z użyciem DH2i DxEnterprise dla kontenerów opartych na SQL Server dla systemu Linux, wdrożonych w klastrze Kubernetes usługi Azure Kubernetes Service (AKS). Możesz wybrać między konfiguracją przyczepki (preferowaną) lub utworzyć własny niestandardowy obraz kontenera.

Note

Firma Microsoft obsługuje składniki przenoszenia danych, grupy dostępności i programu SQL Server. DH2i obsługuje produkt DxEnterprise, który obejmuje zarządzanie klastrami i kworum.

Dowiedz się, jak wdrożyć StatefulSet i użyć DH2i DxEnterprise do tworzenia i konfiguracji AG. Ten samouczek składa się z poniższych kroków.

  • Utwórz konfigurację usługi bezgłowej
  • Tworzenie konfiguracji StatefulSet za pomocą programu SQL Server i DxEnterprise w tym samym zasobniku co kontener przyczepki
  • Tworzenie i konfigurowanie grupy dostępności programu SQL Server, dodawanie replik pomocniczych
  • Utwórz bazę danych w grupie dostępności i przetestuj przełączanie awaryjne.

Wymagania wstępne

W tym samouczku przedstawiono przykład AG (grupy dostępności) z trzema replikami. Potrzebujesz:

  • Klaster usługi Azure Kubernetes Service (AKS) lub klaster Kubernetes.
  • Prawidłowa licencja DxEnterprise z włączonymi funkcjami AG i tunelami. Aby uzyskać więcej informacji, zobacz edycję dewelopera na potrzeby nieprodukcyjne lub oprogramowanie DxEnterprise do obciążeń produkcyjnych.

Utwórz usługę bezgłową

  1. W klastrze Kubernetes serwisy bezgłowe umożliwiają podom łączenie się ze sobą przy użyciu hostnamów.

    Aby utworzyć usługę bezgłową, utwórz plik YAML o nazwie headless_services.yaml z następującą przykładową zawartością.

    #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. Uruchom następujące polecenie, aby zastosować konfigurację.

    kubectl apply -f headless_services.yaml
    

Utwórz zestaw stanowy

  1. Utwórz plik YAML StatefulSet z następującą przykładową zawartością i nadaj mu nazwę dxemssql.yaml.

    Ta konfiguracja StatefulSet tworzy trzy repliki DxEMSSQL, które wykorzystują trwałe roszczenia woluminów do przechowywania danych. Każdy zasobnik w tym zestawie StatefulSet składa się z dwóch kontenerów: kontenera SQL Server i kontenera DxEnterprise. Te kontenery są uruchamiane oddzielnie w konfiguracji sidecar, ale DxEnterprise zarządza repliką AG w kontenerze SQL Server.

    #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. Utwórz poświadczenie dla wystąpienia programu SQL Server.

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

    Hasło powinno być zgodne z domyślnymi zasadami haseł programu SQL Server. Domyślnie hasło musi mieć długość co najmniej ośmiu znaków i zawierać znaki z trzech z następujących czterech zestawów: wielkie litery, małe litery, cyfry podstawowe-10 i symbole. Hasła mogą mieć długość maksymalnie 128 znaków. Używaj haseł, które są tak długie i złożone, jak to możliwe.

  3. Zastosuj konfigurację StatefulSet.

    kubectl apply -f dxemssql.yaml
    
  4. Sprawdź stan zasobników i przejdź do następnego kroku, gdy stan zasobnika stanie się running.

    kubectl get pods
    kubectl describe pods
    

Utwórz grupę dostępności i przetestuj przełączanie awaryjne

Szczegóły dotyczące tworzenia i konfiguracji AG, dodawania replik oraz testowania failoverów można znaleźć w sekcji SQL Server Availability Groups w Kubernetes.

Kroki konfigurowania odbiornika grupy dostępności (opcjonalnie)

Możesz również skonfigurować słuchacza AG, wykonując następujące kroki.

  1. Upewnij się, że utworzyłeś nasłuchiwacz AG za pomocą DxEnterprise, zgodnie z opcjonalnym krokiem znajdującym się pod koniec dokumentacji DH2i.

  2. Na platformie Kubernetes możesz opcjonalnie utworzyć statycznych adresów IP. Statyczny adres IP zapewnia, że jeśli usuniesz i odtworzysz usługę listenera, zewnętrzny adres IP przypisany do usługi listener nie ulegnie zmianie. Wykonaj kroki, aby utworzyć statyczny adres IP w usłudze Azure Kubernetes Service (AKS).

  3. Po utworzeniu adresu IP przypisz go, a następnie utwórz usługę modułu równoważenia obciążenia, korzystając z poniższego przykładu 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
    

Kroki konfigurowania przekierowania połączenia odczytu/zapisu (opcjonalnie)

Po utworzeniu AG włącz przekierowanie połączenia do odczytu/zapisu z wtórnego na głównego. Aby uzyskać więcej informacji, zobacz przekierowanie połączenia do odczytu/zapisu z repliki wtórnej do repliki podstawowej (Grupy dostępności 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