Udostępnij za pośrednictwem


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

Dotyczy:programu SQL Server — Linux

W tym samouczku wyjaśniono, jak skonfigurować grupy dostępności Always On programu SQL Server (AG) dla kontenerów opartych na systemie Linux programu SQL Server wdrożonych w klastrze usługi Azure Kubernetes Service (AKS), przy użyciu DH2i DxEnterprise. Możesz wybrać między konfiguracją przyczepki (preferowaną) lub utworzyć własny niestandardowy obraz kontenera.

Uwaga

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

Korzystając z kroków wymienionych w tym artykule, dowiedz się, jak wdrożyć StatefulSet i użyć rozwiązania DH2i DxEnterprise do utworzenia i skonfigurowania grupy dostępności (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ę typu headless, utwórz plik YAML o nazwie headless_services.yamlz 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 używają żądań trwałych woluminów do przechowywania swoich 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

Aby uzyskać szczegółowe informacje na temat tworzenia i konfigurowania grupy dostępności, dodawania replik i testowania trybu failover, zobacz grupy dostępności programu SQL Server na platformie 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 odbiornik grupy dostępności (AG) został utworzony przy użyciu DxEnterprise zgodnie z opisem w opcjonalnym kroku pod koniec dokumentacji DH2i.

  2. Na platformie Kubernetes możesz opcjonalnie utworzyć statycznych adresów IP. Podczas tworzenia statycznego adresu IP upewnij się, że jeśli usługa odbiornika zostanie usunięta i utworzona ponownie, zewnętrzny adres IP przypisany do usługi odbiornika nie ulegnie zmianie. Wykonaj kroki, aby utworzyć statyczny adres IP w usłudze Azure Kubernetes Service (AKS).

  3. Po utworzeniu adresu IP należy przypisać ten adres IP i utworzyć usługę modułu równoważenia obciążenia, jak pokazano w poniższym przykładzie YAML.

    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
    

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

Po utworzeniu grupy dostępności można włączyć przekierowanie połączenia odczytu/zapisu z pomocniczej do podstawowej, wykonując następujące kroki. 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 [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