Руководство по настройке групп доступности для SQL Server на виртуальных машинах Ubuntu в Azure

Из этого руководства вы узнаете, как выполнять следующие задачи:

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

Примечание.

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

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

В этом руководстве используется 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": []
}

Создание виртуальной сети и подсети

  1. Создайте именованную подсеть с предназначаемой диапазоном IP-адресов. Замените эти значения в следующей команде:

    • <resourceGroupName>
    • <vNetName>
    • <subnetName>
    az network vnet create \
        --resource-group <resourceGroupName> \
        --name <vNetName> \
        --address-prefix 10.1.0.0/16 \
        --subnet-name <subnetName> \
        --subnet-prefix 10.1.1.0/24
    

    Предыдущая команда создает виртуальную сеть и подсеть, содержащую настраиваемый диапазон IP-адресов.

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

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

     az vm image list --all --offer "sql2022-ubuntupro2004"
    

    При поиске образов BYOS вы увидите следующие результаты:

    [
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230808",
        "version": "16.0.230808"
      }
    ]
    

    В этом учебнике используется Ubuntu 20.04.

    Важно!

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

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

    • <resourceGroupName>
    • <VM-basename>
    • <availabilitySetName>
    • <VM-Size> - Примером будет "Standard_D16s_v3"
    • <username>
    • <adminPassword>
    • <vNetName>
    • <subnetName>
    for i in `seq 1 3`; do
        az vm create \
           --resource-group <resourceGroupName> \
           --name <VM-basename>$i \
           --availability-set <availabilitySetName> \
           --size "<VM-Size>" \
           --os-disk-size-gb 128 \
           --image "Canonical:0001-com-ubuntu-server-jammy:20_04-lts-gen2:latest" \
           --admin-username "<username>" \
           --admin-password "<adminPassword>" \
           --authentication-type all \
           --generate-ssh-keys \
           --vnet-name "<vNetName>" \
           --subnet "<subnetName>" \
           --public-ip-sku Standard \
           --public-ip-address ""
        done
    

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

Команда также включает --os-disk-size-gb параметр для создания пользовательского диска ОС размером 128 ГБ. Если увеличить этот размер позже, разверните соответствующие тома папок для размещения установки, настройте диспетчер логических томов (LVM).

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

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

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

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

ssh <username>@<publicIPAddress>

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

[<username>@ubuntu1 ~]$

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

Настройка доступа без пароля по протоколу SSH между узлами

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

Создание новых ключей SSH

Требуемый размер ключа SSH составляет 4096 битов. На каждой виртуальной /root/.ssh машине перейдите в папку и выполните следующую команду:

ssh-keygen -t rsa -b 4096

На этом шаге может потребоваться перезаписать существующий SSH-файл. Вы должны согласиться с этим запросом. Не нужно вводить парольную фразу.

Копирование открытых ключей SSH

На каждой виртуальной машине необходимо скопировать открытый ключ из только что созданного узла с помощью ssh-copy-id команды. Если вы хотите указать целевой каталог на целевой виртуальной машине, можно использовать -i этот параметр.

В следующей команде учетная запись может быть той же учетной записью, <username> настроенной для каждого узла при создании виртуальной машины. Вы также можете использовать root учетную запись, но этот параметр не рекомендуется в рабочей среде.

sudo ssh-copy-id <username>@ubuntu1
sudo ssh-copy-id <username>@ubuntu2
sudo ssh-copy-id <username>@ubuntu3

Проверка доступа без пароля с каждого узла

Чтобы убедиться, что открытый ключ SSH был скопирован на каждый узел, используйте ssh команду с каждого узла. Если вы скопировали ключи правильно, вам не предлагается пароль, и подключение выполнено успешно.

В этом примере мы подключаемся ко второму и третьему узлам из первой виртуальной машины (ubuntu1). <username> Снова учетная запись может быть той же учетной записью, настроенной для каждого узла при создании виртуальной машины.

ssh <username>@ubuntu2
ssh <username>@ubuntu3

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

Настройка разрешения имен

Можно настроить разрешение имен с помощью DNS или вручную изменить etc/hosts файл на каждом узле.

Дополнительные сведения о DNS и Active Directory см. в разделе "Присоединение к SQL Server" на узле Linux к домену Active Directory.

Важно!

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

Виртуальные машины и их IP-адрес, используемые в этом примере, перечислены следующим образом:

  • ubuntu1: 10.0.0.85
  • ubuntu2: 10.0.0.86
  • ubuntu3: 10.0.0.87

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

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

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

Установка и настройка кластера Pacemaker

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

sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents csync2 python3-azure

Теперь перейдите к созданию ключа проверки подлинности на первичном сервере:

sudo corosync-keygen

Ключ проверки подлинности создается в /etc/corosync/authkey расположении. Скопируйте ключ проверки подлинности на вторичные серверы в этом расположении: /etc/corosync/authkey

sudo scp /etc/corosync/authkey username@ubuntu2:~
sudo scp /etc/corosync/authkey username@ubuntu3:~

Переместите ключ проверки подлинности из домашнего каталога /etc/corosyncв .

sudo mv authkey /etc/corosync/authkey

Перейдите к созданию кластера с помощью следующих команд:

cd /etc/corosync/
sudo vi corosync.conf

Измените файл Corosync, чтобы вывести содержимое следующим образом:

totem {
    version: 2
    secauth: off
    cluster_name: demo
    transport: udpu
}

nodelist {
    node {
        ring0_addr: 10.0.0.85
        name: ubuntu1
        nodeid: 1
    }
    node {
        ring0_addr: 10.0.0.86
        name: ubuntu2
        nodeid: 2
    }
    node {
        ring0_addr: 10.0.0.87
        name: ubuntu3
        nodeid: 3
    }
}

quorum {
    provider: corosync_votequorum
    two_node: 0
}

qb {
    ipc_type: native
}

logging {
    fileline: on
    to_stderr: on
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
    to_syslog: no
    debug: off
}

Скопируйте файл на другие узлы /etc/corosync/corosync.confвcorosync.conf:

sudo scp /etc/corosync/corosync.conf username@ubuntu2:~
sudo scp /etc/corosync/corosync.conf username@ubuntu3:~
sudo mv corosync.conf /etc/corosync/

Перезапустите Pacemaker и Corosync и подтвердите состояние:

sudo systemctl restart pacemaker corosync
sudo crm status

Результат должен быть аналогичным приведенному ниже:

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by hacluster via crmd on ubuntu1
  * 3 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * No resources

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

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

Чтобы настроить ограждение, выполните следующие действия:

  1. Регистрация нового приложения в идентификаторе Microsoft Entra и создание секрета
  2. Создание настраиваемой роли из json-файла в PowerShell/CLI
  3. Назначение роли и приложения виртуальным машинам в кластере
  4. Задание свойств агента ограждения

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

  1. Перейдите к идентификатору Microsoft Entra на портале и запишите идентификатор клиента.
  2. Выберите "Регистрация приложений " в меню слева и выберите "Создать регистрацию".
  3. Введите имя и выберите "Учетные записи" только в этом каталоге организации.
  4. В качестве типа приложения выберите веб-адрес, введите http://localhost URL-адрес для входа и нажмите кнопку "Регистрация".
  5. Выберите сертификаты и секреты в меню слева, а затем выберите новый секрет клиента.
  6. Введите описание и выберите срок действия.
  7. Запишите значение секрета, он используется в качестве следующего пароля и идентификатора секрета, он используется в качестве следующего имени пользователя.
  8. Выберите "Обзор" и запишите идентификатор приложения. Он используется в качестве следующего имени входа.

Создайте JSON-файл с именем fence-agent-role.json и добавьте следующий код (добавьте идентификатор подписки):

{
  "Name": "Linux Fence Agent Role-ap-server-01-fence-agent",
  "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/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  ]
}

Создание настраиваемой роли из JSON-файла в PowerShell/CLI

az role definition create --role-definition fence-agent-role.json

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

  1. Для каждой из виртуальных машин в кластере выберите контроль доступа (IAM) в боковом меню.
  2. Выберите " Добавить назначение ролей" (используйте классический интерфейс).
  3. Выберите созданную ранее роль.
  4. В списке "Выбор" введите имя созданного ранее приложения.

Теперь мы можем создать ресурс агента ограждения с помощью предыдущих значений и идентификатора подписки:

  sudo crm configure primitive fence-vm stonith:fence_azure_arm \
params \
action=reboot \
resourceGroup="resourcegroupname" \
resourceGroup="$resourceGroup" \
username="$secretId" \
login="$applicationId" \
passwd="$password" \
tenantId="$tenantId" \
subscriptionId="$subscriptionId" \
pcmk_reboot_timeout=900 \
power_timeout=60 \
op monitor \
interval=3600 \
timeout=120

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

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

sudo crm configure property cluster-recheck-interval=2min
sudo crm configure property start-failure-is-fatal=true
sudo crm configure property stonith-timeout=900
sudo crm configure property concurrent-fencing=true
sudo crm configure property stonith-enabled=true

И подтвердите состояние кластера:

  sudo crm status

Результат должен быть аналогичным приведенному ниже:

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 1 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

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

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

  1. Импортируйте открытые ключи GPG из репозитория:

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
    
  2. Зарегистрируйте репозиторий Ubuntu:

    sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"
    
  3. Выполните следующие команды для установки SQL Server:

    sudo apt-get update
    sudo apt-get install -y mssql-server
    
  4. После завершения установки пакета запустите mssql-conf setup и следуйте инструкциям, чтобы задать пароль SA и выбрать выпуск. Как напоминание, следующие выпуски свободно лицензированы: Оценка, разработчик и Express.

    sudo /opt/mssql/bin/mssql-conf setup
    
  5. По завершении настройки убедитесь в том, что служба работает.

    systemctl status mssql-server --no-pager
    
  6. Установка программ командной строки SQL Server

Чтобы создать базу данных, необходимо подключиться с помощью средства, которое позволяет выполнять инструкции Transact-SQL в SQL Server. Ниже приведены инструкции по установке средств командной строки SQL Server: sqlcmd и bcp.

Чтобы установить mssql-tools18 в Ubuntu, выполните следующие действия.

Примечание.

  • Ubuntu 18.04 поддерживается начиная с SQL Server 2019 CU 3.
  • Ubuntu 20.04 поддерживается начиная с SQL Server 2019 CU 10.
  • Ubuntu 22.04 поддерживается начиная с SQL Server 2022 CU 10.
  1. Перейдите в режим суперпользователя.

    sudo su
    
  2. Импортируйте открытые ключи GPG из репозитория.

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
    
  3. Зарегистрируйте репозиторий Ubuntu для Майкрософт.

    • Для Ubuntu 22.04 используйте следующую команду:

      curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • Для Ubuntu 20.04 используйте следующую команду:

      curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • Для Ubuntu 18.04 используйте следующую команду:

      curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • Для Ubuntu 16.04 используйте следующую команду:

      curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
  4. Выйдите из режима суперпользователя.

    exit
    
  5. Обновите список источников и выполните команду установки с помощью пакета разработчика unixODBC.

    sudo apt-get update
    sudo apt-get install mssql-tools18 unixodbc-dev
    

    Примечание.

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

    sudo apt-get update  
    sudo apt-get install mssql-tools18
    
  6. Необязательно. Добавьте /opt/mssql-tools18/bin/PATH в переменную среды в оболочке Bash.

    Чтобы сделать sqlcmd и bcp доступными из оболочки Bash для сеансов входа, измените файл PATH с помощью следующей ~/.bash_profile команды:

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

    Чтобы сделать sqlcmd и bcp доступными из оболочки Bash для интерактивных или неинтерактивных сеансов входа, измените PATH файл ~/.bashrc с помощью следующей команды:

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

Установка агента высокого уровня доступности SQL Server

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

sudo apt-get install mssql-server-ha

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

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

Включение групп доступности и перезапуск SQL Server

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

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

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

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

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

    Важно!

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

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

    • Замените <PrivateKeyPassword> собственным паролем.
    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 = '<PrivateKeyPassword>'
            );
    GO
    

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

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

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

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

    • sles2 Замените <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>@sles2:/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 = '<PrivateKeyPassword>'
    );
    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 нужным именем группы доступности.
  • Замените значения ubuntu1, ubuntu2, и ubuntu3 на имена экземпляров SQL Server, где размещаются реплики.
CREATE AVAILABILITY
GROUP [ag1]
WITH (
        DB_FAILOVER = ON,
        CLUSTER_TYPE = EXTERNAL
        )
FOR REPLICA
    ON N'ubuntu1'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu1:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'ubuntu2'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu2:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'ubuntu3'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu3: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. Выполните следующие команды на вторичных репликах, чтобы присоединить их к группе доступности:

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

    GRANT ALTER, CONTROL, VIEW DEFINITION
        ON AVAILABILITY GROUP::ag1 TO pacemakerLogin;
    GO
    
    GRANT VIEW SERVER STATE TO pacemakerLogin;
    GO
    
  3. После объединения вторичных реплик их можно увидеть в обозревателе объектов 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 mode
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;
GO

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

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

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

sudo crm

configure

primitive ag1_cluster \
ocf:mssql:ag \
params ag_name="ag1" \
meta failure-timeout=60s \
op start timeout=60s \
op stop timeout=60s \
op promote timeout=60s \
op demote timeout=10s \
op monitor timeout=60s interval=10s \
op monitor timeout=60s on-fail=demote interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s

ms ms-ag1 ag1_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true"

commit

Эта приведенная выше команда создает ресурс ag1_cluster, то есть ресурс группы доступности. Затем он создает ресурс ms-ag1 (основной или вторичный ресурс в Pacemaker, а затем добавляет в него ресурс группы доступности. Это гарантирует, что ресурс группы доступности выполняется на всех трех узлах в кластере, но только один из этих узлов является основным.)

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

sudo crm resource status ms-ag1
sudo crm status

Результат должен быть аналогичным приведенному ниже:

resource ms-ag1 is running on: ubuntu1 Master
resource ms-ag1 is running on: ubuntu3
resource ms-ag1 is running on: ubuntu2

Выходные данные выглядят примерно так, как показано в следующем примере. Сведения о добавлении ограничений на совместное размещение и повышение уровня доступности см. в руководстве по настройке прослушивателя группы доступности на виртуальных машинах Linux.

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * Clone Set: ms-ag1 [ag1_cluster] (promotable):
  * Masters: [ ubuntu1 ]
  * Slaves : [ ubuntu2 ubuntu3 ]
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

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

sudo crm configure group virtualip-group azure-load-balancer virtualip

Выходные crm status данные будут выглядеть примерно так:

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * Clone Set: ms-ag1 [ag1_cluster] (promotable):
    * Masters: [ ubuntu1 ]
    * Slaves : [ ubuntu2 ubuntu3 ]
  * Resource Group:  virtual ip-group:
    * azure-load-balancer  (ocf  :: heartbeat:azure-lb):           Started ubuntu1     
    * virtualip     (ocf :: heartbeat: IPaddr2):                   Started ubuntu1
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

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