Dela via


Distribuera tillgänglighetsgrupper med DH2i DxEnterprise på Kubernetes

gäller för:SQL Server – Linux

I den här självstudien beskrivs hur du konfigurerar SQL Server AlwaysOn-tillgänglighetsgrupper (AG:er) för SQL Server Linux-baserade containrar som distribuerats till ett Azure Kubernetes Service(AKS) Kubernetes-kluster med hjälp av DH2i DxEnterprise. Du kan välja mellan en sidovagnskonfiguration (rekommenderas) eller skapa en egen anpassad containeravbildning.

Not

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

Med hjälp av stegen i den här artikeln lär du dig hur du distribuerar en StatefulSet och använder DH2i DxEnterprise-lösningen för att skapa och konfigurera en Availability Group (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.

    Skapa den huvudlösa tjänsten genom att skapa en YAML-fil med namnet headless_services.yamlmed 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.

    Den här StatefulSet-konfigurationen skapar tre DxEMSSQL-repliker som använder beständiga volymanspråk 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 startas separat från varandra i en "sidovagnskonfiguration", 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

Mer information om hur du skapar och konfigurerar tillgänglighetsgruppen, lägger till repliker och testar redundans finns i SQL Server-tillgänglighetsgrupper 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 har skapat AG-lyssnaren med DxEnterprise enligt beskrivningen i det valfria steget nära slutet av DH2i-dokumentationen.

  2. I Kubernetes kan du valfritt skapa statiska IP-adresser. När du skapar en statisk IP-adress ser du till att den externa IP-adressen som tilldelats lyssnartjänsten inte ändras om lyssnartjänsten tas bort och återskapas. Följ stegen för att skapa en statisk IP-adress i Azure Kubernetes Service (AKS).

  3. När du har skapat en IP-adress tilldelar du den IP-adressen och skapar lastbalanserarens tjänst, enligt följande YAML-exempel.

    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
    

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

För att aktivera omdirigering av läs-/skrivanslutning från den sekundära till den primära AG:n, följ dessa steg när du har skapat den. 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 [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