Kubernetes'te DH2i DxEnterprise ile kullanılabilirlik gruplarını dağıtma

Şunlar için geçerlidir:Linux üzerinde SQL Server

Bu eğitim, SQL Server Always On kullanılabilirlik gruplarının (AGs) DH2i DxEnterprise ile Azure Kubernetes Service (AKS) Kubernetes kümesine dağıtılmış SQL Server Linux tabanlı konteynerler için nasıl yapılandırılacağını açıklar. Yan araba yapılandırması (tercih edilen) veya kendi özel kapsayıcı görüntünüzü oluşturmayı seçebilirsiniz.

Note

Microsoft veri taşıma, AG ve SQL Server bileşenlerini destekler. DH2i, küme ve yeter yönetim içeren DxEnterprise ürününü destekler.

Bir StatefulSet nasıl kurulacağını ve DH2i DxEnterprise'ı kullanarak bir AG oluşturup yapılandırmayı öğrenin. Bu kılavuz aşağıdaki adımlardan oluşur.

  • Başsız hizmet yapılandırması oluşturma
  • Sepet kapsayıcısıyla aynı podda SQL Server ve DxEnterprise ile StatefulSet yapılandırması oluşturma
  • İkincil çoğaltmaları ekleyerek SQL Server AG oluşturma ve yapılandırma
  • AG'de bir veritabanı oluştur ve failover'u test et

Prerequisites

Bu öğreticide üç çoğaltması olan bir AG örneği gösterilmektedir. Şunlara sahip olmanız gerekir:

  • Azure Kubernetes Service (AKS) veya Kubernetes kümesi.
  • AG özellikleri ve tünelleri etkinleştirilmiş geçerli bir DxEnterprise lisansı. Daha fazla bilgi için üretim dışı kullanım için geliştirici sürümüne veya üretim iş yükleri için DxEnterprise yazılımına bakın.

Başsız servis oluşturma

  1. Kubernetes kümesinde, başsız hizmetler podlarınızın konak adlarını kullanarak birbirine bağlanmasını sağlar.

    Başsız hizmeti oluşturmak için, aşağıdaki örnek içerikle çağrılan headless_services.yaml bir YAML dosyası oluşturun.

    #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. Yapılandırmayı uygulamak için aşağıdaki komutu çalıştırın.

    kubectl apply -f headless_services.yaml
    

StatefulSet'i oluşturun

  1. Aşağıdaki örnek içeriğe sahip bir StatefulSet YAML dosyası oluşturun ve adını verin dxemssql.yaml.

    Bu StatefulSet yapılandırması, verilerini depolamak için kalıcı hacim iddialarını kullanan üç DxEMSSQL replikası oluşturur. Bu StatefulSet içindeki her pod iki kapsayıcıdan oluşur: SQL Server kapsayıcısı ve DxEnterprise kapsayıcısı. Bu konteynerler ayrı ayrı bir sidecar konfigürasyonunda başlar, ancak DxEnterprise, AG replikasını SQL Server konteynerinde yönetir.

    #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. SQL Server örneği için bir kimlik bilgisi oluşturun.

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

    Parolanız varsayılan SQL Server password ilkesini izlemelidir. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.

  3. StatefulSet yapılandırmasını uygulayın.

    kubectl apply -f dxemssql.yaml
    
  4. Podların durumunu doğrulayın ve podun durumu running olduğunda bir sonraki adıma geçin.

    kubectl get pods
    kubectl describe pods
    

Kullanılabilirlik grubu oluşturma ve yük devretme testi

AG oluşturma ve yapılandırma, replikalar ekleme ve test failover hakkında detaylar için Kubernetes'te SQL Server Erişilebilirlik Grupları'na bakınız.

Kullanılabilirlik grubu dinleyicisini yapılandırma adımları (isteğe bağlı)

Aşağıdaki adımlarla bir AG dinleyicisi de yapılandırabilirsiniz.

  1. DH2i dokümantasyonunun sonundaki isteğe bağlı adımı takip ederek AG dinleyicisini DxEnterprise ile oluşturduğunuzdan emin olun.

  2. Kubernetes'te isteğe bağlı olarak statik IP adresleri oluşturabilirsiniz. Statik bir IP adresi, dinleyici servisini silip yeniden oluşturursanız, dinleyici hizmetinize atanan harici IP adresinin değişmemesini sağlar. Azure Kubernetes Service'te (AKS) statik IP adresi oluşturma adımlarını izleyin.

  3. Bir IP adresi oluşturduktan sonra, onu atanız ve aşağıdaki YAML örneğiyle yük dengeleyici hizmetini oluşturun.

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

Okuma/yazma bağlantı yeniden yönlendirmesini yapılandırma adımları (isteğe bağlı)

AG oluşturduktan sonra, ikincil bağlantıdan birincil bağlantıya okuma/yazma bağlantısının yönlendirmesini etkinleştirin. Daha fazla bilgi için bkz: İkincil kopyadan birincil kopyaya okuma/yazma bağlantı yönlendirmesi (Always On Kullanılabilirlik Grupları).

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