Distribuera tillgänglighetsgrupper med DH2i DxEnterprise på Kubernetes

Gäller för:SQL Server i Linux

Denna handledning förklarar hur man konfigurerar SQL Server Always On-tillgänglighetsgrupper (AG) med DH2i DxEnterprise för SQL Server Linux-baserade containrar distribuerade till ett Azure Kubernetes Service (AKS) Kubernetes-kluster. Du kan välja mellan en sidovagnskonfiguration (rekommenderas) eller skapa en egen anpassad containeravbildning.

Note

Microsoft har stöd för dataförflyttning, tillgänglighetsgrupp (AG), och SQL Server-komponenter. DH2i stöder DxEnterprise-produkten, som inkluderar kluster- och kvorumhantering.

Lär dig hur du distribuerar en StatefulSet och använd DH2i DxEnterprise för att skapa och konfigurera en AG. Den här självstudien består av följande steg.

  • Skapa en huvudlös tjänstkonfiguration
  • Skapa en StatefulSet-konfiguration med SQL Server och DxEnterprise i samma pod som en sidecar-container
  • Skapa och konfigurera en SQL Server AG och lägg till de sekundära replikerna
  • Skapa en databas i tillgänglighetsgruppen och testa redundans

Förutsättningar

Den här handledningen visar ett exempel på en AG med tre repliker. Du behöver:

  • Ett Azure Kubernetes Service-kluster (AKS) eller Kubernetes-kluster.
  • En giltig DxEnterprise-licens med AG-funktioner och tunnlar aktiverade. Mer information finns i developer edition för användning utan produktion eller DxEnterprise-programvara för produktionsarbetsbelastningar.

Skapa den huvudlösa tjänsten

  1. I ett Kubernetes-kluster tillåter huvudlösa tjänster dina poddar att ansluta till varandra med hjälp av värdnamn.

    För att skapa den headless-tjänsten, skapa en YAML-fil som anropas headless_services.yaml med följande exempelinnehåll.

    #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. Kör följande kommando för att tillämpa konfigurationen.

    kubectl apply -f headless_services.yaml
    

Skapa StatefulSet

  1. Skapa en StatefulSet YAML-fil med följande exempelinnehåll och ge den namnet dxemssql.yaml.

    Denna StatefulSet-konfiguration skapar tre DxEMSSQL-repliker som använder persistenta volymkrav för att lagra sina data. Varje podd i den här StatefulSet består av två containrar: en SQL Server-container och en DxEnterprise-container. Dessa containrar startar separat i en sidecar-konfiguration, men DxEnterprise hanterar AG-repliken i SQL Server-containern.

    #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. Skapa en autentiseringsuppgift för SQL Server-instansen.

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

    Lösenordet bör följa SQL Server-standardprincipen för lösenord. Lösenordet måste som standard vara minst åtta tecken långt och innehålla tecken från tre av följande fyra uppsättningar: versaler, gemener, bas-10 siffror och symboler. Lösenord kan vara upp till 128 tecken långa. Använd lösenord som är så långa och komplexa som möjligt.

  3. Använd konfigurationen StatefulSet.

    kubectl apply -f dxemssql.yaml
    
  4. Kontrollera statusen för poddarna och fortsätt till nästa steg när poddens status blir running.

    kubectl get pods
    kubectl describe pods
    

Skapa tillgänglighetsgrupp och testa redundans

För detaljer om att skapa och konfigurera AG, lägga till repliker och testa failover, se SQL Server Availability Groups i Kubernetes.

Steg för att konfigurera tillgänglighetsgrupplyssnare (valfritt)

Du kan också konfigurera en AG-lyssnare med följande steg.

  1. Se till att du skapade AG-lyssnaren med DxEnterprise genom att följa det valfria steget nära slutet av DH2i-dokumentationen.

  2. I Kubernetes kan du valfritt skapa statiska IP-adresser. En statisk IP-adress säkerställer att om du raderar och återskapar lyssnartjänsten, så ändras inte den externa IP-adressen som tilldelats din lyssnartjänst. Följ stegen för att skapa en statisk IP-adress i Azure Kubernetes Service (AKS).

  3. Efter att du skapat en IP-adress, tilldela den och skapa lastbalanserartjänsten med följande YAML-exempel.

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

Steg för att konfigurera omdirigering av läs-/skrivanslutning (valfritt)

Efter att du skapat AG:n, aktivera läs-/skrivanslutningsomdirigering från sekundär till primär. Mer information finns i omdirigering av läs-/skrivanslutning för sekundär till primär replik (Always On-tillgänglighetsgrupper).

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