Nasazení skupin dostupnosti s využitím DH2i DxEnterprise v Kubernetes

Platí pro:SQL Server na Linuxu

Tento kurz vysvětluje, jak nakonfigurovat skupiny dostupnosti AlwaysOn (AG) SQL Serveru pro kontejnery založené na SQL Serveru s Linuxem nasazené do clusteru Kubernetes Service (AKS) Azure Kubernetes pomocí DH2i DxEnterprise. Můžete si vybrat mezi konfigurací sidecar (upřednostňovanou) nebo vytvořit vlastní image kontejneru.

Note

Microsoft podporuje přesun dat, skupiny dostupnosti (AG) a komponenty SQL Serveru. DH2i zodpovídá za podporu produktu DxEnterprise, který zahrnuje správu clusteru a kvoru.

Pomocí kroků uvedených v tomto článku se dozvíte, jak nasadit StatefulSet a použít řešení DH2i DxEnterprise k vytvoření a konfiguraci AG. Tento kurz se skládá z následujících kroků.

  • Vytvoření bezobslužné konfigurace služby
  • Vytvořte konfiguraci StatefulSet s SQL Serverem a DxEnterprise ve stejném podu jako sidecar kontejner.
  • Vytvořte a nakonfigurujte skupinu dostupnosti SQL Serveru a přidejte sekundární repliky.
  • Vytvořte databázi ve skupině dostupnosti a otestujte převzetí služeb při selhání

Předpoklady

Tento tutoriál ukazuje příklad AG s třemi replikami. Potřebujete:

  • Cluster Azure Kubernetes Service (AKS) nebo Kubernetes.
  • Platná licence DxEnterprise s povolenými funkcemi AG a tunnelovými funkcemi. Další informace najdete v edici developer pro neprodukční využití nebo software DxEnterprise pro produkční úlohy.

Vytvořte bezobslužnou službu

  1. V clusteru Kubernetes umožňují bezobslužné služby, aby se vaše pody připojily k sobě pomocí názvů hostitelů.

    Pokud chcete vytvořit bezobslužnou službu, vytvořte soubor YAML s názvem headless_services.yamls následujícím ukázkovým obsahem.

    #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. Pomocí následujícího příkazu aplikujte konfiguraci.

    kubectl apply -f headless_services.yaml
    

Vytvoření stavové sady

  1. Vytvořte soubor YAML StatefulSet s následujícím ukázkovým obsahem a pojmenujte ho dxemssql.yaml.

    Tato konfigurace StatefulSet vytvoří tři repliky DxEMSSQL, které k ukládání dat využívají trvalé požadavky na svazek. Každý pod v této statefulSet obsahuje dva kontejnery: kontejner SQL Serveru a kontejner DxEnterprise. Tyto kontejnery se spouští odděleně v konfiguraci sidecar, ale DxEnterprise spravuje AG repliku v kontejneru SQL Serveru.

    #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. Vytvořte přihlašovací údaje pro instanci SQL Serveru.

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

    Vaše heslo by mělo splňovat výchozí zásady hesla pro SQL Server. Ve výchozím nastavení musí heslo obsahovat alespoň osm znaků a musí obsahovat znaky ze tří z následujících čtyř sad: velká písmena, malá písmena, číslice se základem 10 a symboly. Hesla můžou mít délku až 128 znaků. Používejte hesla, která jsou co nejdéle a složitá.

  3. Použijte konfiguraci StatefulSet.

    kubectl apply -f dxemssql.yaml
    
  4. Ověřte stav podů a přejděte k dalšímu kroku, jakmile se stav podu stane running.

    kubectl get pods
    kubectl describe pods
    

Vytvoření skupiny dostupnosti a test selhání a přepnutí služby

Podrobnosti o vytváření a konfiguraci skupiny dostupnosti, přidávání replik a testování převzetí služeb při selhání najdete v části Skupiny dostupnosti SQL Serveru v Kubernetes.

Postup konfigurace posluchače skupiny dostupnosti (volitelné)

Pomocí následujícího postupu můžete také nakonfigurovat naslouchací proces AG (skupiny dostupnosti).

  1. Ujistěte se, že jste vytvořili AG poslech pomocí DxEnterprise, jak je popsáno v optionalním kroku poblíž konce dokumentace DH2i.

  2. V Kubernetes můžete volitelně vytvořit statické IP adresy. Při vytváření statické IP adresy se ujistěte, že pokud je služba naslouchacího procesu odstraněná a znovu vytvořena, externí IP adresa přiřazená vaší službě naslouchacího procesu se nezmění. Postupujte podle pokynů k vytvoření statické IP adresy ve službě Azure Kubernetes Service (AKS).

  3. Po vytvoření IP adresy přiřadíte tuto IP adresu a vytvoříte službu nástroje pro vyrovnávání zatížení, jak je znázorněno v následující ukázce 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
    

Postup konfigurace přesměrování připojení pro čtení a zápis (volitelné)

Po vytvoření skupiny dostupnosti (AG) můžete povolit přesměrování připojení pro čtení/zápis ze sekundárního na primární server podle následujících kroků. Další informace najdete v tématu Přesměrování připojení pro čtení a zápis ze sekundární na primární repliku (skupiny dostupnosti 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