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 DH2i DxEnterprise for SQL Server Linux, wdrożone na klastrze Azure Kubernetes Service (AKS) Kubernetes. 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 stworzyć usługę bezgłową, stwórz plik YAML wywołany 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 zaczynają się osobno 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ś słuchacz AG w DxEnterprise, wykonując opcjonalny krok 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 i stwórz usługę load balancer z następującym przykładem 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