Delen via


Beschikbaarheidsgroepen implementeren met DH2i DxEnterprise in Kubernetes

van toepassing op:SQL Server- - Linux

In deze zelfstudie wordt uitgelegd hoe u SQL Server AlwaysOn-beschikbaarheidsgroepen (AG's) configureert voor sql Server Linux-containers die zijn geïmplementeerd in een Kubernetes-cluster (Azure Kubernetes Service) met behulp van DH2i DxEnterprise. U kunt kiezen tussen een sidecar configuration (voorkeur), of uw eigen aangepaste containerafbeelding maken.

Notitie

Microsoft biedt ondersteuning voor gegevensverplaatsing, AG en SQL Server-onderdelen. DH2i is verantwoordelijk voor ondersteuning van het DxEnterprise-product, dat cluster- en quorumbeheer omvat.

Met behulp van de stappen in dit artikel leert u hoe u een StatefulSet implementeert en de DH2i DxEnterprise-oplossing gebruikt om een AG te maken en configureren. Deze zelfstudie bestaat uit de volgende stappen.

  • Een headless serviceconfiguratie maken
  • Een StatefulSet-configuratie maken met SQL Server en DxEnterprise in dezelfde pod als een sidecar-container
  • Een beschikbaarheidsgroep van SQL Server maken en configureren en secundaire replica's toevoegen
  • Een database maken in de beschikbaarheidsgroep en failover testen

Voorwaarden

In deze zelfstudie ziet u een voorbeeld van een AG met drie replica's. U hebt het volgende nodig:

  • Een Azure Kubernetes Service (AKS) of Kubernetes-cluster.
  • Een geldige DxEnterprise-licentie waarvoor AG-functies en tunnels zijn ingeschakeld. Zie de developer edition voor niet-productiegebruik of DxEnterprise-software voor productieworkloads voor meer informatie.

De headless service maken

  1. In een Kubernetes-cluster kunnen headless services uw pods met elkaar verbinden met behulp van hostnamen.

    Als u de headless service wilt maken, maakt u een YAML-bestand met de naam headless_services.yaml, met de volgende voorbeeldinhoud.

    #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. Voer de volgende opdracht uit om de configuratie toe te passen.

    kubectl apply -f headless_services.yaml
    

Maak de StatefulSet aan

  1. Maak een StatefulSet YAML-bestand met de volgende voorbeeldinhoud en geef het dxemssql.yamleen naam.

    Met deze StatefulSet-configuratie worden drie DxEMSSQL-replica's gemaakt die gebruikmaken van permanente volumeclaims om hun gegevens op te slaan. Elke pod in deze StatefulSet bestaat uit twee containers: een SQL Server-container en een DxEnterprise-container. Deze containers worden afzonderlijk van elkaar gestart in een sidecar-configuratie, maar DxEnterprise beheert de AG-replica in de SQL Server-container.

    #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. Maak een referentie voor het SQL Server-exemplaar.

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

    Uw wachtwoord moet voldoen aan het standaardbeleid voor SQL Server wachtwoordbeleid. Standaard moet het wachtwoord ten minste acht tekens lang zijn en tekens bevatten uit drie van de volgende vier sets: hoofdletters, kleine letters, basis-10 cijfers en symbolen. Wachtwoorden mogen maximaal 128 tekens lang zijn. Gebruik wachtwoorden die zo lang en complex mogelijk zijn.

  3. Pas de configuratie van de StatefulSet toe.

    kubectl apply -f dxemssql.yaml
    
  4. Controleer de status van de pods en ga verder met de volgende stap wanneer de status van de pod runningwordt.

    kubectl get pods
    kubectl describe pods
    

Beschikbaarheidsgroep maken en failover testen

Raadpleeg SQL Server-beschikbaarheidsgroepen in Kubernetesvoor meer informatie over het maken en configureren van ag's, het toevoegen van replica's en het testen van failovers.

Stappen voor het configureren van listener voor beschikbaarheidsgroepen (optioneel)

U kunt ook een AG-listener configureren met de volgende stappen.

  1. Zorg ervoor dat u de AG-listener hebt gemaakt met DxEnterprise, zoals beschreven in de optionele stap aan het einde van de DH2i-documentatie.

  2. In Kubernetes kunt u desgewenst statische IP-adressen maken. Wanneer u een statisch IP-adres maakt, zorgt u ervoor dat als de listenerservice wordt verwijderd en opnieuw wordt gemaakt, het externe IP-adres dat aan uw listenerservice is toegewezen, niet verandert. Volg de stappen om een statisch IP-adres te maken in Azure Kubernetes Service (AKS).

  3. Nadat u een IP-adres hebt gemaakt, wijst u dat IP-adres toe en maakt u de load balancer-service, zoals wordt weergegeven in het volgende YAML-voorbeeld.

    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
    

Stappen voor het configureren van omleiding van lees-/schrijfverbindingen (optioneel)

Nadat u de beschikbaarheidsgroep hebt gemaakt, kunt u de lezen/schrijven omleiding van de verbinding van de secundaire naar de primaire server inschakelen door de volgende stappen te volgen. Zie secundaire naar primaire replica omleiding van lees-/schrijfverbindingen (AlwaysOn-beschikbaarheidsgroepen)voor meer informatie.

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