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: 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