Учебник. Настройка групп доступности для SQL Server на виртуальных машинах RHEL в Azure

Применимо к:SQL Server на виртуальной машине Azure

Примечание.

Мы используем SQL Server 2017 (14.x) с RHEL 7.6 в этом руководстве, но можно использовать SQL Server 2019 (15.x) в RHEL 7 или RHEL 8 для настройки высокой доступности. Команды для настройки кластера Pacemaker и ресурсов группы доступности изменились в RHEL 8, и вы хотите ознакомиться с статьей "Создание ресурсов группы доступности" и ресурсов RHEL 8 для получения дополнительных сведений о правильных командах.

В этом руководстве описано следующее:

  • Создание новой группы ресурсов, группы доступности и виртуальных машин Linux
  • Включение высокого уровня доступности
  • Создание кластера Pacemaker
  • Настройка агента ограждения путем создания устройства STONITH
  • Установка SQL Server и средств mssql на RHEL
  • Настройка группы доступности Always On SQL Server
  • Настройка ресурсов группы доступности в кластере Pacemaker
  • Проверка отработки отказа и агента ограждения

В этом руководстве используется Azure CLI для развертывания ресурсов в Azure.

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Необходимые компоненты

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Для работы с этой статьей требуется Azure CLI версии 2.0.30 или более поздней. Если вы используете Azure Cloud Shell, последняя версия уже установлена.

Создание или изменение группы ресурсов

При наличии нескольких подписок установите подписку, для которой вы хотите развернуть эти ресурсы.

Выполните следующую команду, чтобы создать группу ресурсов <resourceGroupName> в регионе. Замените <resourceGroupName> именем по своему выбору. В этом руководстве мы используем East US 2. Дополнительные сведения см. Краткое руководство. Создание виртуальной машины Linux с помощью Azure CLI.

az group create --name <resourceGroupName> --location eastus2

Создание группы доступности

Следующим шагом является создание группы доступности. Выполните следующую команду в Azure Cloud Shell и замените <resourceGroupName> именем группы ресурсов. Выберите имя для <availabilitySetName>.

az vm availability-set create \
    --resource-group <resourceGroupName> \
    --name <availabilitySetName> \
    --platform-fault-domain-count 2 \
    --platform-update-domain-count 2

После выполнения команды должны появиться следующие результаты:

{
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/availabilitySets/<availabilitySetName>",
  "location": "eastus2",
  "name": "<availabilitySetName>",
  "platformFaultDomainCount": 2,
  "platformUpdateDomainCount": 2,
  "proximityPlacementGroup": null,
  "resourceGroup": "<resourceGroupName>",
  "sku": {
    "capacity": null,
    "name": "Aligned",
    "tier": null
  },
  "statuses": null,
  "tags": {},
  "type": "Microsoft.Compute/availabilitySets",
  "virtualMachines": []
}

Создание виртуальных машин RHEL в группе доступности

Предупреждение

Если выбрать образ RHEL с оплатой по мере использования (PAYG) и настроить высокий уровень доступности (HA), вам может потребоваться зарегистрировать подписку. Это может привести к двойной оплате подписки, так как вы будете взиматься за подписку Microsoft Azure RHEL для виртуальной машины и подписку на Red Hat. Дополнительные сведения см. в разделе https://access.redhat.com/solutions/2458541.

Используйте образ RHEL с высоким уровнем доступности при создании виртуальной машины Azure, чтобы избежать "двойной оплаты". Образы, предлагаемые как образы RHEL с высоким уровнем доступности, являются также образами PAYG с предварительно включенным репозиторием с высоким уровнем доступности.

  1. Получите список образов виртуальных машин, которые предлагают RHEL с высоким уровнем доступности:

    az vm image list --all --offer "RHEL-HA"
    

    Должны отобразиться следующие результаты:

    [
      {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "7.4",
    "urn": "RedHat:RHEL-HA:7.4:7.4.2019062021",
    "version": "7.4.2019062021"
       },
       {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "7.5",
    "urn": "RedHat:RHEL-HA:7.5:7.5.2019062021",
    "version": "7.5.2019062021"
        },
        {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "7.6",
    "urn": "RedHat:RHEL-HA:7.6:7.6.2019062019",
    "version": "7.6.2019062019"
         },
         {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "8.0",
    "urn": "RedHat:RHEL-HA:8.0:8.0.2020021914",
    "version": "8.0.2020021914"
         },
         {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "8.1",
    "urn": "RedHat:RHEL-HA:8.1:8.1.2020021914",
    "version": "8.1.2020021914"
          },
          {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "80-gen2",
    "urn": "RedHat:RHEL-HA:80-gen2:8.0.2020021915",
    "version": "8.0.2020021915"
           },
           {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "81_gen2",
    "urn": "RedHat:RHEL-HA:81_gen2:8.1.2020021915",
    "version": "8.1.2020021915"
           }
    ]
    

    Для работы с этим руководством мы выбираем в качестве примера образ RedHat:RHEL-HA:7.6:7.6.2019062019 (для RHEL 7) или RedHat:RHEL-HA:8.1:8.1.2020021914 (для RHEL 8).

    Вы также можете выбрать sql Server 2019 (15.x), предварительно установленный на образах RHEL8-HA. Чтобы получить список этих образов, выполните следующую команду:

    az vm image list --all --offer "sql2019-rhel8"
    

    Должны отобразиться следующие результаты:

    [
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "enterprise",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:enterprise:15.0.200317",
          "version": "15.0.200317"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "enterprise",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:enterprise:15.0.200512",
          "version": "15.0.200512"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "sqldev",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:sqldev:15.0.200317",
          "version": "15.0.200317"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "sqldev",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:sqldev:15.0.200512",
          "version": "15.0.200512"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "standard",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:standard:15.0.200317",
          "version": "15.0.200317"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "standard",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:standard:15.0.200512",
          "version": "15.0.200512"
       }
    ]
    

    Если вы используете один из приведенных выше образов для создания виртуальных машин, он предварительно установлен в SQL Server 2019 (15.x). В этом случае пропустите раздел Установка SQL Server и средств MSSQL далее в этой статье.

    Важно!

    Для настройки группы доступности имена компьютеров должны содержать менее 15 символов. Имя пользователя не может содержать символы верхнего регистра, а пароли должны содержать более 12 символов.

  2. Нам нужно создать 3 виртуальные машины в группе доступности. Замените эти значения в следующей команде:

    • <resourceGroupName>
    • <VM-basename>
    • <availabilitySetName>
    • <VM-Size> — пример "Standard_D16_v3"
    • <username>
    • <adminPassword>
    for i in `seq 1 3`; do
           az vm create \
             --resource-group <resourceGroupName> \
             --name <VM-basename>$i \
             --availability-set <availabilitySetName> \
             --size "<VM-Size>"  \
             --image "RedHat:RHEL-HA:7.6:7.6.2019062019" \
             --admin-username "<username>" \
             --admin-password "<adminPassword>" \
             --authentication-type all \
             --generate-ssh-keys
    done
    

Приведенная выше команда создает виртуальные машины и создает виртуальную сеть по умолчанию для этих виртуальных машин. Дополнительные сведения о различных конфигурациях см. в статье az vm create (Создание виртуальных машин Azure).

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

{
  "fqdns": "",
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<VM1>",
  "location": "eastus2",
  "macAddress": "<Some MAC address>",
  "powerState": "VM running",
  "privateIpAddress": "<IP1>",
  "publicIpAddress": "",
  "resourceGroup": "<resourceGroupName>",
  "zones": ""
}

Важно!

Стандартный образ, созданный с помощью указанной выше команды, создает стандартный диск ОС с 32 ГБ. При такой установке по умолчанию у вас может закончиться место. Чтобы создать диск ОС с 128 ГБ, в качестве примера можно использовать следующий параметр, добавленный в приведенную выше команду az vm create: --os-disk-size-gb 128.

Затем вы можете настроить Диспетчер логических дисков (LVM), если необходимо расширить соответствующие тома папки для размещения установки.

Проверка подключения к созданным виртуальным машинам

Подключитесь к VM1 или другим виртуальным машинам, используя следующую команду в Azure Cloud Shell. Если вы не можете найти IP-адреса виртуальных машин, следуйте инструкциям из этого краткого руководства в Azure Cloud Shell.

ssh <username>@publicipaddress

Если установка прошла успешно, отобразятся следующие выходные данные представляющие терминал Linux:

[<username>@<VM1> ~]$

Введите exit чтобы выйти из сеанса SSH.

Включение высокой доступности

Важно!

Для выполнения этой части руководства необходимо иметь подписку на RHEL и дополнительный компонент для высокого уровня доступности. Если вы используете образ, рекомендуемый в предыдущем разделе, вам не нужно зарегистрировать другую подписку.

Подключение на каждый узел виртуальной машины и следуйте этому руководству, чтобы включить высокий уровень доступности. Дополнительные сведения см. в разделе Включение подписки высокой доступности для RHEL.

Совет

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

Если вы копируете и вставляете несколько sudo команд и запрашиваете пароль, дополнительные команды не будут выполняться. Выполните каждую команду по отдельности.

  1. Чтобы открыть порты брандмауэра Pacemaker, выполните следующие команды на каждой виртуальной машине:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    
  2. Обновите и установите пакеты Pacemaker на всех узлах с помощью следующих команд:

    Примечание.

    nmap устанавливается как часть блока команд в качестве средства для поиска доступных IP-адресов в сети. Вам не нужно устанавливать nmap, но это будет полезно позже в этом руководстве.

    sudo yum update -y
    sudo yum install -y pacemaker pcs fence-agents-all resource-agents fence-agents-azure-arm nmap
    sudo reboot
    
  3. Задайте пароль для пользователя по умолчанию, который создается при установке пакетов Pacemaker. Используйте на всех узлах один и тот же пароль.

    sudo passwd hacluster
    
  4. Используйте следующую команду, чтобы открыть файл "hosts" и настроить разрешение имен узлов. Дополнительные сведения по настройке файла "hosts", см. в статье Настройка группы доступности Always On SQL Server для обеспечения высокой доступности в Linux.

    sudo vi /etc/hosts
    

    В редакторе vi введите i, чтобы вставить текст, а в пустую строку добавьте частный IP-адрес соответствующей виртуальной машины. Затем рядом с IP-адресом добавьте после пробела имя виртуальной машины. Каждая строка должна иметь отдельную запись.

    <IP1> <VM1>
    <IP2> <VM2>
    <IP3> <VM3>
    

    Важно!

    Рекомендуется использовать частный IP-адрес в предыдущем примере. Использование общедоступного IP-адреса в этой конфигурации приведет к сбоям в настройке, и мы не рекомендуем подвергать вашу виртуальную машину воздействию внешних сетей.

    Чтобы выйти из редактора vi, сначала нажмите клавишу Esc, а затем введите команду :wq для записи файла и выхода.

Создание кластера Pacemaker

В этом разделе описано, как включить и запустить службу pcsd, а затем настроить кластер. Для SQL Server на Linux ресурсы кластера не создаются автоматически. Необходимо включить и создать ресурсы Pacemaker вручную. Дополнительные сведения см. в статье о настройке экземпляра отказоустойчивого кластера для RHEL.

Включение и запуск службы pcsd и Pacemaker

  1. Выполните команды на всех узлах. Эти команды позволяют узлам повторно присоединиться к кластеру после перезапуска каждого узла.

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  2. Удалите любые существующие конфигурации кластера со всех узлов. Выполните следующую команду:

    sudo pcs cluster destroy
    sudo systemctl enable pacemaker
    
  3. Выполните следующие команды на первичном узле, чтобы настроить кластер.

    • При выполнении pcs cluster auth команды для проверки подлинности узлов кластера вам будет предложено ввести пароль. Введите пароль пользователя hacluster, созданный раньше.

    RHEL 7

    sudo pcs cluster auth <VM1> <VM2> <VM3> -u hacluster
    sudo pcs cluster setup --name az-hacluster <VM1> <VM2> <VM3> --token 30000
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    RHEL8

    Для RHEL 8 необходимо выполнить проверку подлинности узлов отдельно. При появлении запроса введите имя пользователя и пароль для hacluster вручную.

    sudo pcs host auth <node1> <node2> <node3>
    sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    
  4. Запустите следующую команду, чтобы убедиться, что все узлы подключены к сети.

    sudo pcs status
    

    RHEL 7

    Если все узлы находятся в сети, вы увидите выходные данные, аналогичные следующему примеру:

    Cluster name: az-hacluster
    
    WARNINGS:
    No stonith devices and stonith-enabled is not false
    
    Stack: corosync
    Current DC: <VM2> (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum
    Last updated: Fri Aug 23 18:27:57 2019
    Last change: Fri Aug 23 18:27:56 2019 by hacluster via crmd on <VM2>
    
    3 nodes configured
    0 resources configured
    
    Online: [ <VM1> <VM2> <VM3> ]
    
    No resources
    
    Daemon Status:
          corosync: active/enabled
          pacemaker: active/enabled
          pcsd: active/enabled
    

    RHEL 8

    Cluster name: az-hacluster
    
    WARNINGS:
    No stonith devices and stonith-enabled is not false
    
    Cluster Summary:
      * Stack: corosync
      * Current DC: <VM2> (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum
      * Last updated: Fri Aug 23 18:27:57 2019
      * Last change: Fri Aug 23 18:27:56 2019 by hacluster via crmd on <VM2>
      * 3 nodes configured
      * 0 resource instances configured
    
    Node List:
      * Online: [ <VM1> <VM2> <VM3> ]
    
    Full List of Resources:
      * No resources
    
    Daemon Status:
      * corosync: active/enabled
      * pacemaker: active/enabled
      * pcsd: active/enabled
    
  5. Установите для ожидаемых голосов в динамическом кластере значение "3". Эта команда влияет только на динамический кластер и не изменяет файлы конфигурации.

    На всех узлах установите ожидаемые голоса с помощью следующей команды:

    sudo pcs quorum expected-votes 3
    

Настройка агента ограждения

Чтобы настроить агент ограждения, для этого руководства изменяются следующие инструкции. Дополнительные сведения см. в разделе Создание устройства STONITH.

Проверьте версию агента Забора Azure, чтобы убедиться, что она обновлена. Используйте следующую команду:

sudo yum info fence-agents-azure-arm

В приведенном ниже примере вы увидите похожие выходные данные.

Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
Name        : fence-agents-azure-arm
Arch        : x86_64
Version     : 4.2.1
Release     : 11.el7_6.8
Size        : 28 k
Repo        : installed
From repo   : rhel-ha-for-rhel-7-server-eus-rhui-rpms
Summary     : Fence agent for Azure Resource Manager
URL         : https://github.com/ClusterLabs/fence-agents
License     : GPLv2+ and LGPLv2+
Description : The fence-agents-azure-arm package contains a fence agent for Azure instances.

Регистрация нового приложения в идентификаторе Microsoft Entra

Чтобы зарегистрировать новое приложение в идентификаторе Microsoft Entra (прежнее название — Azure Active Directory), выполните следующие действия:

  1. Переход к https://portal.azure.com.
  2. Откройте область свойств идентификатора Microsoft Entra и запишите ееTenant ID.
  3. Щелкните Регистрация приложений.
  4. Выберите Создать регистрацию.
  5. Введите имя, например<resourceGroupName>-app. Для поддерживаемых типов учетных записей выберите учетные записи только в этом каталоге организации (только Майкрософт — один клиент).
  6. Выберите веб-код ресурса (URI перенаправления) и введите URL-адрес (например, http://localhost) и нажмите кнопку "Добавить". URL-адрес входа может быть любым допустимым URL-адресом. После этого нажмите кнопку "Зарегистрировать".
  7. Выберите сертификаты и секреты для новой регистрации приложения, а затем выберите новый секрет клиента.
  8. Введите описание нового ключа (секрет клиента), а затем нажмите кнопку "Добавить".
  9. Запишите значение секрета. Он используется в качестве пароля для субъекта-службы.
  10. Выберите Обзор. Запишите идентификатор приложения. Он используется в качестве имени пользователя (идентификатор входа в систему в следующих шагах) субъекта-службы.

Создание пользовательской роли для агента ограждения

Следуйте инструкциям из руководства по созданию настраиваемой Azure с помощью Azure CLI.

Ваш файл JSON должен выглядеть примерно так:

  • Замените <username> именем по своему выбору. Это позволяет избежать дублирования при создании определения роли.
  • Замените <subscriptionId> идентификатором своей подписки Azure.
{
  "Name": "Linux Fence Agent Role-<username>",
  "Id": null,
  "IsCustom": true,
  "Description": "Allows to power-off and start virtual machines",
  "Actions": [
    "Microsoft.Compute/*/read",
    "Microsoft.Compute/virtualMachines/powerOff/action",
    "Microsoft.Compute/virtualMachines/start/action"
  ],
  "NotActions": [
  ],
  "AssignableScopes": [
    "/subscriptions/<subscriptionId>"
  ]
}

Чтобы добавить роль, выполните следующую команду:

  • Замените <filename> на имя файла.
  • Если вы выполняете команду из пути, отличного от папки, в которую сохранен файл, добавьте путь к папке файла в команду.
az role definition create --role-definition "<filename>.json"

Должен появиться следующий результат:

{
  "assignableScopes": [
    "/subscriptions/<subscriptionId>"
  ],
  "description": "Allows to power-off and start virtual machines",
  "id": "/subscriptions/<subscriptionId>/providers/Microsoft.Authorization/roleDefinitions/<roleNameId>",
  "name": "<roleNameId>",
  "permissions": [
    {
      "actions": [
        "Microsoft.Compute/*/read",
        "Microsoft.Compute/virtualMachines/powerOff/action",
        "Microsoft.Compute/virtualMachines/start/action"
      ],
      "dataActions": [],
      "notActions": [],
      "notDataActions": []
    }
  ],
  "roleName": "Linux Fence Agent Role-<username>",
  "roleType": "CustomRole",
  "type": "Microsoft.Authorization/roleDefinitions"
}

Назначение пользовательской роли субъекту-службе

Назначьте субъекту-службе пользовательскую роль Linux Fence Agent Role-<username> созданную в последнем шаге. Больше не используйте роль владельца.

  1. Перейдите по адресу https://portal.azure.com.
  2. Открытие области "Все ресурсы"
  3. Выберите виртуальную машину первого узла кластера.
  4. Выберите Управление доступом (IAM)
  5. Выберите Добавить назначение роли
  6. Выберите роль Linux Fence Agent Role-<username> из списка Роль
  7. В списке "Выбор " введите имя созданного ранее приложения. <resourceGroupName>-app
  8. Выберите Сохранить
  9. Повторите эти действия для всех узлов кластера.

Создание устройств STONITH

Выполните следующие команды на узле 1:

  • Замените <ApplicationID> значением идентификатора из регистрации приложения.
  • Замените <servicePrincipalPassword> значением из секрета клиента.
  • Замените <resourceGroupName> группой ресурсов из подписки, используемой в этом учебнике.
  • Замените <tenantID> и <subscriptionId> из подписки Azure.
sudo pcs property set stonith-timeout=900
sudo pcs stonith create rsc_st_azure fence_azure_arm login="<ApplicationID>" passwd="<servicePrincipalPassword>" resourceGroup="<resourceGroupName>" tenantId="<tenantID>" subscriptionId="<subscriptionId>" power_timeout=240 pcmk_reboot_timeout=900

Поскольку мы уже добавили к брандмауэру правило, которое разрешает службу HA (--add-service=high-availability), вам не нужно открывать следующие порты брандмауэра на всех узлах: 2224, 3121, 21064, 5405. Однако если у вас возникли проблемы с подключением к высокой доступности, используйте следующую команду, чтобы открыть эти порты, связанные с высокой доступностью.

Совет

Опционально вы можете добавить все порты в этом учебнике сразу, чтобы сэкономить время. Открытые порты описываются в следующих разделах. Если вы хотите добавить все порты сейчас, добавьте дополнительные порты: 1433 и 5022.

sudo firewall-cmd --zone=public --add-port=2224/tcp --add-port=3121/tcp --add-port=21064/tcp --add-port=5405/tcp --permanent
sudo firewall-cmd --reload

Установка SQL Server и средств mssql

Примечание.

Если вы создали виртуальные машины с предварительно установленной версией SQL Server 2019 (15.x) на RHEL8-HA, можно пропустить приведенные ниже действия, чтобы установить SQL Server и mssql-tools и запустить раздел "Настройка группы доступности" после настройки пароля sa на всех виртуальных машинах, выполнив команду sudo /opt/mssql/bin/mssql-conf set-sa-password на всех виртуальных машинах.

Используйте раздел ниже, чтобы установить на виртуальных машинах SQL Server и средства mssql. Чтобы установить SQL Server 2017 (14.x) на RHEL 7 или SQL Server 2019 (15.x) в RHEL 8, можно выбрать один из приведенных ниже примеров. Выполните каждое из описанных действий на всех узлах. Дополнительные сведения см. в разделе Установка SQL Server на виртуальной машине Red Hat.

Установка SQL Server на виртуальных машинах

Для установки SQL Server используются следующие команды:

RHEL 7 с SQL Server 2017

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo
sudo yum install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
sudo yum install mssql-server-ha

RHEL 8 с SQL Server 2019

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo
sudo yum install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
sudo yum install mssql-server-ha

Открытие порта 1433 брандмауэра для удаленных подключений

Для удаленного подключения необходимо открыть порт 1433 на виртуальной машине. Используйте следующие команды, чтобы открыть порт 1433 в брандмауэре каждой виртуальной машины:

sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload

Установка средств командной строки SQL Server

Для установки программ командной строки SQL Server используются следующие команды. Дополнительные сведения см. в разделе Установка программ командной строки SQL Server.

RHEL 7

sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum install -y mssql-tools unixODBC-devel

RHEL 8

sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo
sudo yum install -y mssql-tools unixODBC-devel

Примечание.

Для удобства добавьте /opt/mssql-tools/bin/ к переменной среды PATH. Это позволит запускать программы, не указывая полный путь. Выполните следующие команды, чтобы изменить переменную среды PATH как для сеансов входа в систему, так и для интерактивных сеансов и сеансов без входа в систему:

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

Проверка состояния SQL Server.

После завершения настройки можно проверка состояние SQL Server и убедиться, что он запущен:

systemctl status mssql-server --no-pager

Должен появиться следующий результат:

● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-12-05 17:30:55 UTC; 20min ago
     Docs: https://learn.microsoft.com/sql/linux
 Main PID: 11612 (sqlservr)
   CGroup: /system.slice/mssql-server.service
           ├─11612 /opt/mssql/bin/sqlservr
           └─11640 /opt/mssql/bin/sqlservr

Настройка группы доступности

Используйте следующие шаги для настройки группы доступности Always On SQL Server для виртуальных машин. Дополнительные сведения см. в разделе "Настройка групп доступности AlwaysOn SQL Server" для обеспечения высокой доступности в Linux.

Включение групп доступности AlwaysOn и перезапуск mssql-server

Включите группы доступности Always On на каждом узле с экземпляром SQL Server. Затем перезапустите mssql-server. Выполните следующий скрипт:

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server

Создание сертификата

В настоящее время мы не поддерживаем аутентификацию домена приложения на конечной точке группы доступности. Поэтому для шифрования конечной точки группы доступности необходимо использовать сертификат.

  1. Подключение ко всем узлам с помощью SQL Server Management Studio (SSMS) или sqlcmd. Чтобы включить сеанс AlwaysOn_health и создать главный ключ, выполните следующие команды:

    Важно!

    Если вы подключаетесь удаленно к экземпляру SQL Server, вам потребуется открыть порт 1433 на брандмауэре. Кроме того, для каждой виртуальной машины в группе безопасности сети необходимо разрешить входящие соединение к порту 1433. Дополнительные сведения о создании правила безопасности для входящего трафика см. в разделе Create a security rule (Создание правила безопасности).

    • Замените <Master_Key_Password> собственным паролем.
    ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
    GO
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Master_Key_Password>';
    
  2. Подключение к основному реплика с помощью SSMS или sqlcmd. Следующие команды создают сертификат по /var/opt/mssql/data/dbm_certificate.cer адресу и закрытому ключу на var/opt/mssql/data/dbm_certificate.pvk основном сервере SQL Server реплика:

    • Замените <Private_Key_Password> собственным паролем.
    CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
    GO
    
    BACKUP CERTIFICATE dbm_certificate
       TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
       WITH PRIVATE KEY (
               FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
               ENCRYPTION BY PASSWORD = '<Private_Key_Password>'
           );
    GO
    

Выйдите из сеанса sqlcmd , выполнив exit команду, и вернитесь к сеансу SSH.

Копирование сертификата во вторичные реплики и создание сертификатов на сервере

  1. Скопируйте два созданные файлы в одно и то же место на всех серверах, где будут размещаться реплики доступности.

    Выполните следующую команду scp на сервере-источнике, чтобы скопировать сертификат на целевые серверы:

    • <VM2> Замените <username> имя пользователя и целевое имя виртуальной машины, которые вы используете.
    • Выполните эту команду для всех вторичных реплик.

    Примечание.

    Вам не нужно запускать sudo -i, который предоставляет корневую среду. Вы можете просто запустить команду sudo перед каждой командой, как мы делали это ранее в этом учебнике.

    # The below command allows you to run commands in the root environment
    sudo -i
    
    scp /var/opt/mssql/data/dbm_certificate.* <username>@<VM2>:/home/<username>
    
  2. Выполните следующую команду на целевом сервере:

    • Замените <username> именем пользователя.
    • Команда mv перемещает файлы или каталоги из одного места в другое.
    • Команда chown используется для изменения владельца и группы файлов, каталогов или ссылок.
    • Выполните эти команды для всех вторичных реплик.
    sudo -i
    mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/
    cd /var/opt/mssql/data
    chown mssql:mssql dbm_certificate.*
    
  3. Следующий сценарий Transact-SQL создает сертификат из резервной копии, созданной в первичной реплике SQL Server. Обновите сценарий, задав надежные пароли. Для расшифровки используется тот же пароль, что и при создании PVK-файла в предыдущем шаге. Чтобы создать сертификат, выполните следующий сценарий с помощью sqlcmd или SSMS на всех дополнительных серверах:

    CREATE CERTIFICATE dbm_certificate
        FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
        WITH PRIVATE KEY (
        FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
        DECRYPTION BY PASSWORD = '<Private_Key_Password>'
                );
    GO
    

Создайте конечные точки на всех репликах зеркального отображения базы данных

Выполните следующий скрипт во всех экземплярах SQL Server с помощью sqlcmd или SSMS:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING (
    ROLE = ALL,
    AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
GO

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO

Создание группы доступности

Подключение экземпляр SQL Server, на котором размещается основной реплика с помощью sqlcmd или SSMS. Выполните следующую команду, чтобы создать группу доступности:

  • Замените ag1 на желаемое имя Группы доступности.
  • Замените значения <VM1>, <VM2>, и <VM3> на имена экземпляров SQL Server, где размещаются реплики.
CREATE AVAILABILITY GROUP [ag1]
     WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
     FOR REPLICA ON
         N'<VM1>'
          WITH (
             ENDPOINT_URL = N'tcp://<VM1>:5022',
             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
             FAILOVER_MODE = EXTERNAL,
             SEEDING_MODE = AUTOMATIC
             ),
         N'<VM2>'
          WITH (
             ENDPOINT_URL = N'tcp://<VM2>:5022',
             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
             FAILOVER_MODE = EXTERNAL,
             SEEDING_MODE = AUTOMATIC
             ),
         N'<VM3>'
         WITH(
            ENDPOINT_URL = N'tcp://<VM3>:5022',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            );
GO

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO

Создание учетных данных SQL Server для Pacemaker

На всех экземплярах SQL Server создайте учетные данные SQL Server для Pacemaker. Следующий Transact-SQL создает имя для входа.

  • Замените <password> собственным надежным паролем.
USE [master]
GO

CREATE LOGIN [pacemakerLogin] with PASSWORD= N'<password>';
GO

ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
GO

Сохраните учетные данные, используемые для учетных данных SQL Server, на всех экземплярах SQL Server.

  1. Создайте файл .

    sudo vi /var/opt/mssql/secrets/passwd
    
  2. Добавьте в файл следующие строки:

    pacemakerLogin
    <password>
    

    Чтобы выйти из редактора vi, сначала нажмите клавишу Esc, а затем введите команду :wq для записи файла и выхода.

  3. Сделайте файл доступным для чтения только по корневому каталогу:

    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

Присоединение вторичных реплик к группе доступности

  1. Чтобы присоединить вторичные реплика к группе доступности, необходимо открыть порт 5022 на брандмауэре для всех серверов. Выполните следующую команду в сеансе SSH:

    sudo firewall-cmd --zone=public --add-port=5022/tcp --permanent
    sudo firewall-cmd --reload
    
  2. Выполните следующие команды на вторичных репликах, чтобы присоединить их к группе доступности:

    ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
    GO
    
  3. Выполните следующий сценарий Transact-SQL на первичной реплике и каждой вторичной реплике:

    GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin;
    GO
    
    GRANT VIEW SERVER STATE TO pacemakerLogin;
    GO
    
  4. После объединения вторичных реплик их можно увидеть в обозревателе объектов SSMS, развернув узел высокого уровня доступности Always On:

    Screenshot shows the primary and secondary availability replicas.

Добавление базы данных в группу доступности

Мы следуйте статье о настройке группы доступности при добавлении базы данных.

В рамках этого шага используются приведенные ниже команды Transact-SQL. Выполните эти команды в первичной реплике:

CREATE DATABASE [db1]; -- creates a database named db1
GO

ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery model
GO

BACKUP DATABASE [db1] -- backs up the database to disk
   TO DISK = N'/var/opt/mssql/data/db1.bak';
GO

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1]; -- adds the database db1 to the AG
GO

Убедитесь, что база данных создана на вторичных серверах.

На каждой вторичной реплике SQL Server выполните следующий запрос, чтобы убедиться, что база данных "db1" создана и находится в состоянии "СИНХРОНИЗОВАНО":

SELECT * FROM sys.databases WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

Если в synchronization_state_desc указано "СИНХРОНИЗИРОВАНО" для db1, это означает, что реплики синхронизированы. Получатели показывают db1 в первичной реплике.

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

Мы следуйте инструкциям по созданию ресурсов группы доступности в кластере Pacemaker.

Примечание.

Обмен данными без смещения

Эта статья содержит ссылки на термин slave (подчиненный), который Майкрософт считает оскорбительным при использовании в этом контексте. Термин присутствует в этой статье, так как в настоящее время он присутствует в программном обеспечении. При удалении термина из программного обеспечения мы удалим его из статьи.

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

  1. Используйте одну из следующих команд в зависимости от выбранной ранее среды, чтобы создать ресурс ag_cluster в группе доступности ag1.

    RHEL 7

    sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=30s master notify=true
    

    RHEL 8

    sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=30s promotable notify=true
    
  2. Перед продолжением работы убедитесь, что ресурсы подключены к сети, используя следующую команду:

    sudo pcs resource
    

    Должен появиться следующий результат:

    RHEL 7

    [<username>@VM1 ~]$ sudo pcs resource
    Master/Slave Set: ag_cluster-master [ag_cluster]
    Masters: [ <VM1> ]
    Slaves: [ <VM2> <VM3> ]
    

    RHEL 8

    [<username>@VM1 ~]$ sudo pcs resource
    * Clone Set: ag_cluster-clone [ag_cluster] (promotable):
    * ag_cluster             (ocf::mssql:ag) :            Slave VMrhel3 (Monitoring)
    * ag_cluster             (ocf::mssql:ag) :            Master VMrhel1 (Monitoring)
    * ag_cluster             (ocf::mssql:ag) :            Slave VMrhel2 (Monitoring)
    

Создание ресурса виртуального IP-адреса

  1. Для создания ресурса виртуального IP-адреса, используйте доступный статический IP-адрес из вашей сети. Его можно найти с помощью программы командной строки nmap.

    nmap -sP <IPRange>
    # For example: nmap -sP 10.0.0.*
    # The above will scan for all IP addresses that are already occupied in the 10.0.0.x space.
    
  2. Задайте для свойства с поддержкой stonith значение false:

    sudo pcs property set stonith-enabled=false
    
  3. Создайте ресурс виртуального IP-адреса с помощью следующей команды. Замените <availableIP> неиспользуемый IP-адрес.

    sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<availableIP>
    

Добавление ограничений

  1. Чтобы ресурс IP-адреса и ресурс группы доступности выполнялись в одном узле, необходимо настроить ограничение совместного размещения. Выполните следующую команду:

    RHEL 7

    sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master
    

    RHEL 8

     sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master
    
  2. Создайте ограничение очередности, чтобы ресурс группы доступности запускался до ресурса IP-адреса. Ограничение совместного размещения предполагает такое ограничение, поэтому его необходимо задать явно.

    RHEL 7

    sudo pcs constraint order promote ag_cluster-master then start virtualip
    

    RHEL 8

    sudo pcs constraint order promote ag_cluster-clone then start virtualip
    
  3. Чтобы проверить ограничения, выполните следующую команду:

    sudo pcs constraint list --full
    

    Должен появиться следующий результат:

    RHEL 7

    Location Constraints:
    Ordering Constraints:
          promote ag_cluster-master then start virtualip (kind:Mandatory) (id:order-ag_cluster-master-virtualip-mandatory)
    Colocation Constraints:
          virtualip with ag_cluster-master (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-master-INFINITY)
    Ticket Constraints:
    

    RHEL 8

    Location Constraints:
    Ordering Constraints:
            promote ag_cluster-clone then start virtualip (kind:Mandatory) (id:order-ag_cluster-clone-virtualip-mandatory)
    Colocation Constraints:
            virtualip with ag_cluster-clone (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-clone-INFINITY)
    Ticket Constraints:
    

Повторное включение stonith

Мы готовы к тестированию. Повторно включите stonith в кластере, выполнив следующую команду на узле 1:

sudo pcs property set stonith-enabled=true

Проверка состояния кластера

Вы можете проверить состояние кластерных ресурсов, используя следующую команду:

[<username>@VM1 ~]$ sudo pcs status
Cluster name: az-hacluster
Stack: corosync
Current DC: <VM3> (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum
Last updated: Sat Dec  7 00:18:38 2019
Last change: Sat Dec  7 00:18:02 2019 by root via cibadmin on VM1

3 nodes configured
5 resources configured

Online: [ <VM1> <VM2> <VM3> ]

Full list of resources:

 Master/Slave Set: ag_cluster-master [ag_cluster]
     Masters: [ <VM2> ]
     Slaves: [ <VM1> <VM3> ]
 virtualip      (ocf::heartbeat:IPaddr2):       Started <VM2>
 rsc_st_azure   (stonith:fence_azure_arm):      Started <VM1>

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Тестовая отработка отказа

Чтобы убедиться, что конфигурация прошла успешно до сих пор, мы протестируем отработку отказа. Дополнительные сведения см. в разделе Отработка отказа для группы доступности Always On на Linux.

  1. Выполните следующую команду, чтобы вручную выполнить отработку отказа первичной реплики в <VM2>. Замените <VM2> значением имени вашего сервера.

    RHEL 7

    sudo pcs resource move ag_cluster-master <VM2> --master
    

    RHEL 8

    sudo pcs resource move ag_cluster-clone <VM2> --master
    

    Можно также указать дополнительный параметр, чтобы временное ограничение, созданное для перемещения ресурса на нужный узел, было отключено автоматически, и вам не нужно выполнять шаги 2 и 3 в следующих инструкциях.

    RHEL 7

    sudo pcs resource move ag_cluster-master <VM2> --master lifetime=30S
    

    RHEL 8

    sudo pcs resource move ag_cluster-clone <VM2> --master lifetime=30S
    

    Другая альтернатива автоматизации шагов 2 и 3, которая очищает временное ограничение в самой команде перемещения ресурсов, заключается в сочетании нескольких команд в одной строке.

    RHEL 7

    sudo pcs resource move ag_cluster-master <VM2> --master && sleep 30 && pcs resource clear ag_cluster-master
    

    RHEL 8

    sudo pcs resource move ag_cluster-clone <VM2> --master && sleep 30 && pcs resource clear ag_cluster-clone
    
  2. Если вы еще раз проверка ограничения, вы увидите, что еще одно ограничение было добавлено из-за отработки отказа вручную:

    RHEL 7

    [<username>@VM1 ~]$ sudo pcs constraint list --full
    Location Constraints:
          Resource: ag_cluster-master
            Enabled on: VM2 (score:INFINITY) (role: Master) (id:cli-prefer-ag_cluster-master)
    Ordering Constraints:
            promote ag_cluster-master then start virtualip (kind:Mandatory) (id:order-ag_cluster-master-virtualip-mandatory)
    Colocation Constraints:
            virtualip with ag_cluster-master (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-master-INFINITY)
    Ticket Constraints:
    

    RHEL 8

    [<username>@VM1 ~]$ sudo pcs constraint list --full
    Location Constraints:
          Resource: ag_cluster-master
            Enabled on: VM2 (score:INFINITY) (role: Master) (id:cli-prefer-ag_cluster-clone)
    Ordering Constraints:
            promote ag_cluster-clone then start virtualip (kind:Mandatory) (id:order-ag_cluster-clone-virtualip-mandatory)
    Colocation Constraints:
            virtualip with ag_cluster-clone (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-clone-INFINITY)
    Ticket Constraints:
    
  3. Удалите ограничение c идентификатором cli-prefer-ag_cluster-master, используя следующую команду:

    RHEL 7

    sudo pcs constraint remove cli-prefer-ag_cluster-master
    

    RHEL 8

    sudo pcs constraint remove cli-prefer-ag_cluster-clone
    
  4. Проверьте кластерные ресурсы с помощью команды sudo pcs resource, теперь основным экземпляром должна быть <VM2>.

    [<username>@<VM1> ~]$ sudo pcs resource
    Master/Slave Set: ag_cluster-master [ag_cluster]
         ag_cluster (ocf::mssql:ag):        FAILED <VM1> (Monitoring)
         Masters: [ <VM2> ]
         Slaves: [ <VM3> ]
    virtualip      (ocf::heartbeat:IPaddr2):       Started <VM2>
    [<username>@<VM1> ~]$ sudo pcs resource
    Master/Slave Set: ag_cluster-master [ag_cluster]
         Masters: [ <VM2> ]
         Slaves: [ <VM1> <VM3> ]
    virtualip      (ocf::heartbeat:IPaddr2):       Started <VM2>
    

Тестирование ограждения

Вы можете протестировать ограждение, выполнив следующую команду. Попробуйте выполнить указанную ниже команду из <VM1> для <VM3>.

sudo pcs stonith fence <VM3> --debug

Примечание.

По умолчанию, действие ограждения приводит к тому, что узел отключается, а затем включается. Если вы хотите перевести узел в автономный режим, используйте в команде параметр --off.

Вы должны увидеть следующие выходные данные:

[<username>@<VM1> ~]$ sudo pcs stonith fence <VM3> --debug
Running: stonith_admin -B <VM3>
Return Value: 0
--Debug Output Start--
--Debug Output End--

Node: <VM3> fenced

Дополнительные сведения см. в статье 5.12. Testing a fence device (Тестирование устройства ограждения).

Следующий шаг