Aracılığıyla paylaş


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

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

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

Uyarı

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

Bu makalede bahsedilen adımları kullanarak StatefulSet dağıtmayı ve AG oluşturmak ve yapılandırmak için DH2i DxEnterprise çözümünü kullanmayı öğ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

Önkoşullar

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 headless_services.yaml adlı 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 ısrarcı birim taleplerini kullanan üç DxEMSSQL kopyası 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 kapsayıcılar bir "sepet" yapılandırmasında birbirinden ayrı olarak başlatılır, ancak DxEnterprise, SQL Server kapsayıcısında AG çoğaltmasını 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,SQL Server varsayılan parola ilkesine uygun olmalıdır. 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, çoğaltma ekleme ve yük devretme testi hakkında ayrıntılı bilgi için Bkz. Kubernetes'te SQL Server Kullanılabilirlik Grupları.

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 belgelerinin sonuna yakın isteğe bağlı adımda açıklandığı gibi DxEnterprise kullanarak AG dinleyicisini oluşturduğunuzdan emin olun.

  2. Kubernetes'te isteğe bağlı olarak statik IP adresleri oluşturabilirsiniz. Statik IP adresi oluşturduğunuzda, dinleyici hizmeti silinir ve yeniden oluşturulursa dinleyici hizmetinize atanan dış IP adresinin değişmediğinden emin olursunuz. Azure Kubernetes Service'te (AKS) statik IP adresi oluşturma adımlarını izleyin.

  3. Bir IP adresi oluşturduktan sonra, aşağıdaki YAML örneğinde gösterildiği gibi bu IP adresini atar ve yük dengeleyici hizmetini oluşturursunuz.

    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
    

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

AG'yi oluşturduktan sonra, şu adımları izleyerek ikincilden birincile okuma/yazma bağlantı yeniden yönlendirmesini etkinleştirebilirsiniz. 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 [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