Menyebarkan grup ketersediaan dengan DH2i DxEnterprise di Kubernetes

Berlaku untuk:SQL Server di Linux

Tutorial ini menjelaskan cara mengonfigurasi SQL Server Always On availability groups (AGs) dengan DH2i DxEnterprise untuk kontainer berbasis SQL Server Linux yang disebarkan ke klaster Kubernetes Azure Kubernetes Service (AKS). Anda dapat memilih konfigurasi sidecar (lebih disukai), atau membuat image kontainer kustom Anda sendiri.

Note

Microsoft mendukung komponen pergerakan data, AG, dan SQL Server. DH2i mendukung produk DxEnterprise, yang mencakup manajemen klaster dan kuorum.

Pelajari cara menerapkan StatefulSet dan gunakan DH2i DxEnterprise untuk membuat serta mengonfigurasi AG. Tutorial ini terdiri dari langkah-langkah berikut.

  • Buat 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
  • Buat database di AG dan uji failover

Prasyarat

Tutorial ini menunjukkan contoh AG dengan tiga replika. Kamu butuh:

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

Buat 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 dipanggil headless_services.yaml dengan contoh konten 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
    

Buat 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-kontainer ini dimulai secara terpisah 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>"
    

    Kata sandi Anda harus mengikuti kebijakan password default SQL Server. Secara default, kata sandi harus panjangnya minimal delapan karakter dan berisi karakter dari tiga dari empat set berikut: huruf besar, huruf kecil, digit dasar-10, dan simbol. Panjang kata sandi bisa hingga 128 karakter. Gunakan kata sandi yang panjang dan kompleks mungkin.

  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 pembuatan dan konfigurasi AG, menambah replika, dan menguji failover, lihat SQL Server Availability Groups 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 dengan DxEnterprise mengikuti langkah opsional di dekat akhir dokumentasi DH2i.

  2. Di Kubernetes, Anda dapat secara opsional membuat alamat IP statis . Alamat IP statis memastikan bahwa jika Anda menghapus dan membuat ulang layanan listener, alamat IP eksternal yang diberikan ke layanan listener Anda tidak berubah. Ikuti langkah-langkah untuk membuat alamat IP statis di Azure Kubernetes Service (AKS).

  3. Setelah Anda membuat alamat IP, tetapkan alamat tersebut dan buat layanan load balancer dengan contoh YAML berikut.

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

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

Setelah Anda membuat AG, aktifkan pengalihan koneksi baca/tulis dari sekunder ke primer. Untuk informasi selengkapnya, lihat Pengalihan koneksi baca/tulis replika sekunder ke primer (Grup Ketersediaan AlwaysOn).

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