Развертывание групп доступности с помощью DH2i DxEnterprise в Kubernetes

Применимо к:SQL Server в Linux

В этом руководстве объясняется, как настроить группы доступности SQL Server Always On (AG) с помощью DH2i DxEnterprise для контейнеров на базе SQL Server Linux, развернутых в кластере Azure Kubernetes Service (AKS) Kubernetes. Можно выбрать конфигурацию sidecar (предпочтительную) или создать собственный пользовательский образ контейнера.

Note

Корпорация Майкрософт поддерживает компоненты перемещения данных, группы доступности и SQL Server. DH2i поддерживает продукт DxEnterprise, который включает управление кластером и кворумом.

Узнайте, как развернуть StatefulSet и использовать DH2i DxEnterprise для создания и настройки AG. Это руководство состоит из следующих шагов.

  • Создайте конфигурацию headless-сервиса
  • Создание конфигурации StatefulSet с SQL Server и DxEnterprise в том же pod, что и контейнер-сайдкар.
  • Создайте и настройте группу доступности (AG) SQL Server, добавив вторичные реплики.
  • Создайте базу данных в группе доступности и протестируйте отказоустойчивость

Prerequisites

В этом руководстве показан пример группы доступности (AG) с тремя репликами. Тебе нужно:

  • Служба Azure Kubernetes (AKS) или кластер Kubernetes.
  • Действительная лицензия DxEnterprise с включенными функциями AG и туннелями. Дополнительные сведения см. в версии разработчика для непроизводственного использования или программного обеспечения DxEnterprise для рабочих нагрузок.

Создание службы без головы

  1. В кластере Kubernetes службы без головы позволяют модулям pod подключаться друг к другу с помощью имен узлов.

    Для создания безголового сервиса создайте YAML-файл headless_services.yaml с следующим примером содержимого.

    #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. Выполните следующую команду, чтобы применить конфигурацию.

    kubectl apply -f headless_services.yaml
    

Создайте StatefulSet

  1. Создайте YAML-файл StatefulSet со следующим примером содержимого и присвойте ему dxemssql.yamlимя.

    Эта конфигурация StatefulSet создаёт три реплики DxEMSSQL, которые используют постоянные приёмы томов для хранения своих данных. Каждый модуль в этом StatefulSet включает два контейнера: контейнер SQL Server и контейнер DxEnterprise. Эти контейнеры начинаются отдельно в конфигурации sidecar, но DxEnterprise управляет репликой AG в контейнере 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. Создайте учетные данные для экземпляра SQL Server.

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

    Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

  3. Примените конфигурацию StatefulSet.

    kubectl apply -f dxemssql.yaml
    
  4. Проверьте состояние модулей и перейдите к следующему шагу, когда их состояние станет running.

    kubectl get pods
    kubectl describe pods
    

Создание группы доступности и тестирование отказоустойчивости

Для подробностей о создании и настройке AG, добавлении реплик и тестировании отказа см. в разделе SQL Server Availability Groups в Kubernetes.

Действия по настройке прослушивателя группы доступности (необязательно)

Вы также можете настроить прослушиватель группы доступности, выполнив следующие действия.

  1. Убедитесь, что вы создали слушатель AG с помощью DxEnterprise после дополнительного шага ближе к концу документации DH2i.

  2. В Kubernetes можно при необходимости создавать статические IP-адреса. Статический IP-адрес гарантирует, что при удалении и повторном создании сервиса слушателя внешний IP-адрес, назначенный вашей сервисной аудитории, не изменится. Выполните действия, чтобы создать статический IP-адрес в Службе Azure Kubernetes (AKS).

  3. После создания IP-адреса назначьте его и создайте сервис балансировщика нагрузки с помощью следующего образца YAML.

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

Действия по настройке перенаправления подключений для чтения и записи (необязательно)

После создания AG включите перенаправление соединения для чтения/записи с вторичного на основное. Дополнительные сведения см. в статье Перенаправление подключения записи/чтения с вторичной реплики на первичную (группы доступности Always On).

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