Учебник. Настройка групп доступности для 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 с предварительно включенным репозиторием с высоким уровнем доступности.
Получите список образов виртуальных машин, которые предлагают 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 символов.
Нам нужно создать 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
команд и запрашиваете пароль, дополнительные команды не будут выполняться. Выполните каждую команду по отдельности.
Чтобы открыть порты брандмауэра Pacemaker, выполните следующие команды на каждой виртуальной машине:
sudo firewall-cmd --permanent --add-service=high-availability sudo firewall-cmd --reload
Обновите и установите пакеты 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
Задайте пароль для пользователя по умолчанию, который создается при установке пакетов Pacemaker. Используйте на всех узлах один и тот же пароль.
sudo passwd hacluster
Используйте следующую команду, чтобы открыть файл "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
Выполните команды на всех узлах. Эти команды позволяют узлам повторно присоединиться к кластеру после перезапуска каждого узла.
sudo systemctl enable pcsd sudo systemctl start pcsd sudo systemctl enable pacemaker
Удалите любые существующие конфигурации кластера со всех узлов. Выполните следующую команду:
sudo pcs cluster destroy sudo systemctl enable pacemaker
Выполните следующие команды на первичном узле, чтобы настроить кластер.
- При выполнении
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
- При выполнении
Запустите следующую команду, чтобы убедиться, что все узлы подключены к сети.
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
Установите для ожидаемых голосов в динамическом кластере значение "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), выполните следующие действия:
- Переход к https://portal.azure.com.
- Откройте область свойств идентификатора Microsoft Entra и запишите ее
Tenant ID
. - Щелкните Регистрация приложений.
- Выберите Создать регистрацию.
- Введите имя, например
<resourceGroupName>-app
. Для поддерживаемых типов учетных записей выберите учетные записи только в этом каталоге организации (только Майкрософт — один клиент). - Выберите веб-код ресурса (URI перенаправления) и введите URL-адрес (например,
http://localhost
) и нажмите кнопку "Добавить". URL-адрес входа может быть любым допустимым URL-адресом. После этого нажмите кнопку "Зарегистрировать". - Выберите сертификаты и секреты для новой регистрации приложения, а затем выберите новый секрет клиента.
- Введите описание нового ключа (секрет клиента), а затем нажмите кнопку "Добавить".
- Запишите значение секрета. Он используется в качестве пароля для субъекта-службы.
- Выберите Обзор. Запишите идентификатор приложения. Он используется в качестве имени пользователя (идентификатор входа в систему в следующих шагах) субъекта-службы.
Создание пользовательской роли для агента ограждения
Следуйте инструкциям из руководства по созданию настраиваемой 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>
созданную в последнем шаге. Больше не используйте роль владельца.
- Перейдите к https://portal.azure.com
- Открытие области "Все ресурсы"
- Выберите виртуальную машину первого узла кластера.
- Выберите Управление доступом (IAM)
- Выберите Добавить назначение роли
- Выберите роль
Linux Fence Agent Role-<username>
из списка Роль - В списке "Выбор " введите имя созданного ранее приложения.
<resourceGroupName>-app
- Выберите Сохранить
- Повторите эти действия для всех узлов кластера.
Создание устройств 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
Создание сертификата
В настоящее время мы не поддерживаем аутентификацию домена приложения на конечной точке группы доступности. Поэтому для шифрования конечной точки группы доступности необходимо использовать сертификат.
Подключитесь ко всем узлам с помощью 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>';
- Замените
Подключитесь к первичной реплике с помощью 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.
Копирование сертификата во вторичные реплики и создание сертификатов на сервере
Скопируйте два созданные файлы в одно и то же место на всех серверах, где будут размещаться реплики доступности.
Выполните следующую команду
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>
Выполните следующую команду на целевом сервере:
- Замените
<username>
именем пользователя. - Команда
mv
перемещает файлы или каталоги из одного места в другое. - Команда
chown
используется для изменения владельца и группы файлов, каталогов или ссылок. - Выполните эти команды для всех вторичных реплик.
sudo -i mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/ cd /var/opt/mssql/data chown mssql:mssql dbm_certificate.*
- Замените
Следующий сценарий 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.
Создайте файл .
sudo vi /var/opt/mssql/secrets/passwd
Добавьте в файл следующие строки:
pacemakerLogin <password>
Чтобы выйти из редактора vi, сначала нажмите клавишу Esc, а затем введите команду
:wq
для записи файла и выхода.Сделайте файл доступным для чтения только по корневому каталогу:
sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 400 /var/opt/mssql/secrets/passwd
Присоединение вторичных реплик к группе доступности
Чтобы присоединить вторичные реплики к группе доступности, необходимо открыть порт 5022 на брандмауэре для всех серверов. Выполните следующую команду в сеансе SSH:
sudo firewall-cmd --zone=public --add-port=5022/tcp --permanent sudo firewall-cmd --reload
Выполните следующие команды на вторичных репликах, чтобы присоединить их к группе доступности:
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL); GO ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE; GO
Выполните следующий сценарий Transact-SQL на первичной реплике и каждой вторичной реплике:
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin; GO GRANT VIEW SERVER STATE TO pacemakerLogin; GO
После объединения вторичных реплик их можно увидеть в обозревателе объектов SSMS, развернув узел высокого уровня доступности Always On:
Добавление базы данных в группу доступности
Мы следуйте статье о настройке группы доступности при добавлении базы данных.
В рамках этого шага используются приведенные ниже команды 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 (подчиненный), который Майкрософт считает оскорбительным при использовании в этом контексте. Термин присутствует в этой статье, так как в настоящее время он присутствует в программном обеспечении. При удалении термина из программного обеспечения мы удалим его из статьи.
Создание кластерного ресурса группы доступности
Используйте одну из следующих команд в зависимости от выбранной ранее среды, чтобы создать ресурс
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
Перед продолжением работы убедитесь, что ресурсы подключены к сети, используя следующую команду:
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-адреса
Для создания ресурса виртуального 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.
Задайте для свойства с поддержкой stonith значение false:
sudo pcs property set stonith-enabled=false
Создайте ресурс виртуального IP-адреса с помощью следующей команды. Замените
<availableIP>
неиспользуемый IP-адрес.sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<availableIP>
Добавление ограничений
Чтобы ресурс 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
Создайте ограничение очередности, чтобы ресурс группы доступности запускался до ресурса 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
Чтобы проверить ограничения, выполните следующую команду:
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.
Выполните следующую команду, чтобы вручную выполнить отработку отказа первичной реплики в
<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
При повторном проверке ограничений вы увидите, что еще одно ограничение было добавлено из-за отработки отказа вручную:
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:
Удалите ограничение 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
Проверьте кластерные ресурсы с помощью команды
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 (Тестирование устройства ограждения).