Bagikan melalui


Menyebarkan grup ketersediaan dengan DH2i DxEnterprise di Kubernetes

Berlaku untuk: SQL Server - Linux

Tutorial ini menjelaskan cara mengonfigurasi grup ketersediaan (AG) AlwaysOn SQL Server untuk kontainer berbasis Linux SQL Server yang disebarkan ke kluster Kubernetes Service (AKS) Azure Kubernetes, menggunakan DH2i DxEnterprise. Anda dapat memilih antara konfigurasi sidecar (lebih disukai), atau membangun gambar kontainer kustom Anda sendiri.

Catatan

Microsoft mendukung komponen pergerakan data, AG, dan SQL Server. DH2i bertanggung jawab atas dukungan produk DxEnterprise, yang mencakup manajemen kluster dan kuorum.

Dengan menggunakan langkah-langkah yang disebutkan dalam artikel ini, pelajari cara menyebarkan StatefulSet dan menggunakan solusi DH2i DxEnterprise untuk membuat dan mengonfigurasi AG. Tutorial ini terdiri dari langkah-langkah berikut.

  • Membuat konfigurasi layanan headless
  • Membuat konfigurasi StatefulSet dengan SQL Server dan DxEnterprise dalam pod yang sama dengan kontainer sidecar
  • Membuat dan mengonfigurasi SQL Server AG, menambahkan replika sekunder
  • Membuat database di AG, dan menguji failover

Prasyarat

Tutorial ini menunjukkan contoh AG dengan tiga replika. Anda memerlukan:

  • Kluster Azure Kubernetes Service (AKS) atau Kubernetes.
  • Lisensi DxEnterprise yang valid dengan fitur AG dan terowongan diaktifkan. Untuk informasi selengkapnya, lihat edisi pengembang untuk penggunaan nonproduksi, atau perangkat lunak DxEnterprise untuk beban kerja produksi.

Membuat layanan headless

  1. Dalam kluster Kubernetes, layanan headless memungkinkan pod Anda terhubung satu sama lain menggunakan nama host.

    Untuk membuat layanan headless, Buat file YAML yang disebut headless_services.yaml, dengan konten sampel berikut.

    #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. Jalankan perintah berikut untuk menerapkan konfigurasi.

    kubectl apply -f headless_services.yaml
    

Membuat StatefulSet

  1. Buat file YAML StatefulSet dengan konten sampel berikut, dan beri nama dxemssql.yaml.

    Konfigurasi StatefulSet ini membuat tiga replika DxEMSSQL yang menggunakan klaim volume persisten untuk menyimpan data mereka. Setiap pod dalam StatefulSet ini terdiri dari dua kontainer: kontainer SQL Server dan kontainer DxEnterprise. Kontainer ini dimulai secara terpisah satu sama lain dalam konfigurasi "sidecar", tetapi DxEnterprise mengelola replika AG dalam kontainer SQL Server.

    #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. Buat kredensial untuk instans SQL Server.

    kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"
    
  3. Terapkan konfigurasi StatefulSet.

    kubectl apply -f dxemssql.yaml
    
  4. Verifikasi status pod, dan lanjutkan ke langkah berikutnya ketika status pod menjadi running.

    kubectl get pods
    kubectl describe pods
    

Membuat grup ketersediaan dan menguji failover

Untuk detail tentang membuat dan mengonfigurasi AG, menambahkan replika, dan menguji failover, lihat Grup Ketersediaan SQL Server di Kubernetes.

Langkah-langkah untuk mengonfigurasi listener grup ketersediaan (opsional)

Anda juga dapat mengonfigurasi pendengar AG, dengan langkah-langkah berikut.

  1. Pastikan Anda membuat pendengar AG menggunakan DxEnterprise seperti yang diuraikan dalam langkah opsional di dekat akhir dokumentasi DH2i.

  2. Di Kubernetes, Anda dapat secara opsional membuat alamat IP statis . Saat Anda membuat alamat IP statis, Anda memastikan bahwa jika layanan pendengar dihapus dan dibuat ulang, alamat IP eksternal yang ditetapkan ke layanan pendengar Anda tidak berubah. Ikuti langkah-langkah untuk membuat alamat IP statis di Azure Kubernetes Service (AKS).

  3. Setelah membuat alamat IP, Anda menetapkan alamat IP tersebut dan membuat layanan load balancer, seperti yang ditunjukkan dalam sampel YAML berikut.

    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
    

Langkah-langkah untuk mengonfigurasi pengalihan koneksi baca/tulis (opsional)

Setelah membuat AG, Anda dapat mengaktifkan pengalihan koneksi baca/tulis dari sekunder ke primer dengan mengikuti langkah-langkah ini. Untuk informasi selengkapnya, lihat Pengalihan koneksi baca/tulis replika sekunder ke primer (Grup Ketersediaan AlwaysOn).

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