Beschikbaarheidsgroepen implementeren met DH2i DxEnterprise in Kubernetes

Van toepassing op:SQL Server op Linux

Deze tutorial legt uit hoe je SQL Server Always On beschikbaarheidsgroepen (AG's) configureert met DH2i DxEnterprise voor SQL Server Linux-gebaseerde containers die worden ingezet op een Azure Kubernetes Service (AKS) Kubernetes-cluster. U kunt kiezen tussen een sidecar configuration (voorkeur), of uw eigen aangepaste containerafbeelding maken.

Note

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

Leer hoe je een StatefulSet deployt en gebruik DH2i DxEnterprise om een AG-systeem te maken en te configureren. Deze zelfstudie bestaat uit de volgende stappen.

  • Een configuratie voor een headless service 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 de failover testen

Prerequisites

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 ontwikkelaarseditie voor niet-productiegebruik of DxEnterprise-software voor productieworkloads voor meer informatie.

Maak de headless service aan

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

    Om de headless service te maken, maak je een YAML-bestand aan met headless_services.yaml 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.

    Deze StatefulSet-configuratie creëert drie DxEMSSQL-replica's die persistente volumeclaims gebruiken om hun data op te slaan. Elke pod in deze StatefulSet bestaat uit twee containers: een SQL Server-container en een DxEnterprise-container. Deze containers beginnen apart 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-object voor de SQL Server-instance.

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

    Uw wachtwoord moet het SQL Server standaardbeleid voor password volgen. 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

Voor details over het aanmaken en configureren van AG, het toevoegen van replica's en het testen van failover, zie SQL Server Availability Groups in Kubernetes.

Stappen voor het configureren van listener voor beschikbaarheidsgroepen (optioneel)

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

  1. Zorg ervoor dat je de AG-luisteraar hebt aangemaakt met DxEnterprise volgens de optionele stap aan het einde van de DH2i-documentatie.

  2. In Kubernetes kunt u desgewenst statische IP-adressen maken. Een statisch IP-adres zorgt ervoor dat als je de luisteraardienst verwijdert en opnieuw aanmaakt, het externe IP-adres dat aan je luisterdienst is toegewezen niet verandert. Volg de stappen om een statisch IP-adres te maken in Azure Kubernetes Service (AKS).

  3. Nadat je een IP-adres hebt aangemaakt, wijs je het toe en maak je de load balancer-service met het volgende YAML-voorbeeld.

    apiVersion: v1
    kind: Service
    metadata:
      name: agslistener
    spec:
      type: LoadBalancer
      loadBalancerIP: <static-IP-address>
      selector:
        app: mssql
      ports:
      - protocol: TCP
        port: 44444
        targetPort: 44444
    

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

Nadat je de AG hebt aangemaakt, schakel je lees-/schrijfverbindings-omleiding van de secundaire naar de primaire in. Zie secundaire naar primaire replica omleiding van lees-/schrijfverbindingen (AlwaysOn-beschikbaarheidsgroepen)voor meer informatie.

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