Настройка экземпляра отказоустойчивого кластера RHEL для SQL Server
Область применения: SQL Server — Linux
Это руководство содержит инструкции по созданию отказоустойчивого кластера общих дисков с двумя узлами для SQL Server на основе Red Hat Enterprise Linux. Уровень кластеризации основан на надстройке высокого уровня доступности Red Hat Enterprise Linux (RHEL), созданной на базе Pacemaker. Экземпляр SQL Server активен либо в одном, либо в другом узле.
Примечание.
Для доступа к надстройке высокого уровня доступности и документации по Red Hat требуется подписка.
Как показано на схеме ниже, хранилище представляется двум серверам. Компоненты кластеризации — Corosync и Pacemaker — координируют обмен данными и управление ресурсами. Один из серверов имеет активное подключение к ресурсам хранилища и SQL Server. Когда Pacemaker обнаруживает сбой, компоненты кластеризации отвечают за перемещение ресурсов на другой узел.
Дополнительные сведения о конфигурации кластера, параметрах агентов ресурсов и управлении см. в справочной документации по RHEL.
Примечание.
На этом этапе интеграция SQL Server с Pacemaker не связана с WSFC в Windows. В SQL Server нет знаний о присутствии кластера, все оркестрации находятся за пределами, и служба управляется как автономный экземпляр Pacemaker. Например, динамические представления sys.dm_os_cluster_nodes
кластера и sys.dm_os_cluster_properties
не будут выполнять записи.
Чтобы использовать строку подключения, указывающую на строковое имя сервера, а не IP-адрес, им потребуется зарегистрировать на DNS-сервере IP-адрес, использованный для создания ресурса виртуального IP-адреса (как описано в следующих разделах) с выбранным именем сервера.
В следующих разделах описаны действия по настройке решения отказоустойчивого кластера.
Необходимые компоненты
Для выполнения следующего законченного сценария нужны два компьютера для развертывания двухузлового кластера и сервера для настройки сервера NFS. Ниже описано, как будут настроены эти серверы.
Настройка и настройка операционной системы на каждом узле кластера
Сначала необходимо настроить операционную систему в узлах кластера. Для этого пошагового руководства используйте RHEL с допустимой подпиской для надстройки высокой доступности.
Установка и настройка SQL Server в каждом узле кластера
Установите и настройте SQL Server в обоих узлах. Подробные инструкции см. в статье Установка SQL Server в Linux.
В целях настройки назначьте один узел первичным, а другой — вторичным. Используйте приведенные ниже условия для работы с этим руководством.
Остановите и отключите SQL Server во вторичном узле.
В следующем примере показаны остановка и отключение SQL Server:
sudo systemctl stop mssql-server sudo systemctl disable mssql-server
Примечание.
Во время установки главный ключ сервера для экземпляра SQL Server создается и помещается в папку /var/opt/mssql/secrets/machine-key
. В Linux SQL Server всегда выполняется как локальная учетная запись mssql
. Так как это локальная учетная запись, ее удостоверение не является общим во всех узлах. Поэтому необходимо скопировать ключ шифрования с первичного узла на каждый дополнительный узел, чтобы каждая локальная mssql
учетная запись может получить доступ к ней для расшифровки главного ключа сервера.
На основном узле создайте имя входа SQL Server для Pacemaker и предоставьте разрешение на вход для запуска
sp_server_diagnostics
. Pacemaker использует эту учетную запись, чтобы проверить, в каком узле запущен SQL Server.sudo systemctl start mssql-server
Подключитесь к базе данных
master
SQL Server с помощью учетной записи SA и выполните следующую команду:USE [master] GO CREATE LOGIN [<loginName>] with PASSWORD= N'<loginPassword>' ALTER SERVER ROLE [sysadmin] ADD MEMBER [<loginName>]
Вы также можете задать разрешения на более детальном уровне. Для входа Pacemaker требуется
VIEW SERVER STATE
запросить состояние работоспособности иALTER ANY LINKED SERVER
sp_server_diagnostics
setupadmin
обновить имя экземпляра FCI с именем ресурса, выполнив и выполнивsp_dropserver
командуsp_addserver
.Остановите и отключите SQL Server в первичном узле.
В каждом узле кластера настройте файл hosts. Файл hosts должен содержать IP-адрес и имя каждого узла кластера.
Проверьте IP-адрес для каждого узла. Для отображения IP-адреса текущего узла выполните следующий сценарий.
sudo ip addr show
Задайте имя компьютера в каждом узле. Присвойте каждому узлу уникальное имя длиной не более 15 символов. Задайте имя компьютера, добавив его к
/etc/hosts
. Следующий сценарий позволяет изменить/etc/hosts
с помощьюvi
.sudo vi /etc/hosts
В следующем примере показан файл
/etc/hosts
с дополнениями для двух узловsqlfcivm1
иsqlfcivm2
.127.0.0.1 localhost localhost4 localhost4.localdomain4 ::1 localhost localhost6 localhost6.localdomain6 10.128.18.128 sqlfcivm1 10.128.16.77 sqlfcivm2
В следующем разделе вы настроите общее хранилище и переместите файлы базы данных в это хранилище.
Настройка общего хранилища и перемещение файлов базы данных
Существуют различные решения для предоставления общего хранилища. В этом пошаговом руководстве демонстрируется настройка общего хранилища с NFS. Мы рекомендуем использовать Kerberos для защиты NFS (см. пример: https://www.certdepot.net/rhel7-use-kerberos-control-access-nfs-network-shares/).
Предупреждение
Если вы не защищаете NFS, любой пользователь, который может получить доступ к сети и спуфинировать IP-адрес узла SQL, сможет получить доступ к файлам данных. Как всегда, проведите моделирование угроз для вашей системы, прежде чем использовать ее в рабочей среде. Другой вариант хранения — использовать общую папку SMB.
Настройка общего хранилища с NFS
Внимание
Размещение файлов базы данных на сервере NFS с версией <4 не поддерживается в этом выпуске. Это относится и к использованию NFS для отказоустойчивой кластеризации общих дисков, а также для баз данных в некластеризованных экземплярах. Мы работаем над включением других версий сервера NFS в будущих выпусках.
На сервере NFS выполните следующие действия.
Установите
nfs-utils
sudo yum -y install nfs-utils
Включите и запустите
rpcbind
.sudo systemctl enable rpcbind && sudo systemctl start rpcbind
Включите и запустите
nfs-server
.sudo systemctl enable nfs-server && sudo systemctl start nfs-server
Измените
/etc/exports
, чтобы экспортировать каталог, общий доступ к которому необходимо предоставить. Вам нужна одна строка для каждой нужной общей папки. Например:/mnt/nfs 10.8.8.0/24(rw,sync,no_subtree_check,no_root_squash)
Экспортируйте общие папки:
sudo exportfs -rav
Убедитесь в том, что пути являются общими или экспортированными. На сервере NFS выполните следующую команду:
sudo showmount -e
Добавьте исключение в SELinux:
sudo setsebool -P nfs_export_all_rw 1
Откройте брандмауэр на сервере.
sudo firewall-cmd --permanent --add-service=nfs sudo firewall-cmd --permanent --add-service=mountd sudo firewall-cmd --permanent --add-service=rpc-bind sudo firewall-cmd --reload
Настройка всех узлов кластера для подключения к общему хранилищу NFS
Выполните указанные ниже действия во всех узлах кластера.
Установите
nfs-utils
sudo yum -y install nfs-utils
Откройте брандмауэр в клиентах и на сервере NFS:
sudo firewall-cmd --permanent --add-service=nfs sudo firewall-cmd --permanent --add-service=mountd sudo firewall-cmd --permanent --add-service=rpc-bind sudo firewall-cmd --reload
Убедитесь в том, что общие папки NFS доступны на клиентских компьютерах.
sudo showmount -e <IP OF NFS SERVER>
Повторите эти действия во всех узлах кластера.
Дополнительные сведения об использовании NFS см. в следующих статьях:
- Серверы и брандмауэры NFS | Stack Exchange
- Подключение тома NFS | Руководство для сетевых администраторов Linux
- Конфигурация сервера NFS | Портал для клиентов Red Hat
Подключение каталога файлов базы данных для указания общего хранилища
Только в основном узле сохраните файлы базы данных во временном расположении. Приведенный ниже скрипт создает временный каталог, копирует файлы базы данных в него и удаляет старые файлы базы данных. При запуске SQL Server от имени локального пользователя
mssql
необходимо убедиться, что после передачи данных в подключенную общую папку локальный пользователь имеет доступ на чтение и запись в общую папку.sudo su mssql mkdir /var/opt/mssql/tmp cp /var/opt/mssql/data/* /var/opt/mssql/tmp rm /var/opt/mssql/data/* exit
На всех узлах кластера измените
/etc/fstab
файл, чтобы включить команду подключения.<IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs timeo=14,intr
Пример изменения показан в приведенном ниже скрипте.
10.8.8.0:/mnt/nfs /var/opt/mssql/data nfs timeo=14,intr
Примечание.
Если вы используете ресурс файловой системы (FS), как рекомендуется здесь, не нужно сохранять команду подключения в /etc/fstab. Pacemaker подключает папки при запуске кластеризованного ресурса файловой системы. Ограждение гарантирует, что файловая система не будет подключена дважды.
Выполните команду
mount -a
, чтобы система обновила подключенные пути.Скопируйте файлы базы данных и журналов, сохраненные в
/var/opt/mssql/tmp
, в новую подключенную общую папку/var/opt/mssql/data
. Этот шаг необходимо выполнить только на основном узле. Убедитесь, что вы предоставляете разрешения на запись локальномуmssql
пользователю.sudo chown mssql /var/opt/mssql/data sudo chgrp mssql /var/opt/mssql/data sudo su mssql cp /var/opt/mssql/tmp/* /var/opt/mssql/data/ rm /var/opt/mssql/tmp/* exit
Убедитесь в том, что SQL Server успешно запускается с новым путем к файлу. Выполните это действие в каждом узле. На этом этапе SQL Server должен выполняться только в одном узле в каждый момент времени. Они не могут выполняться одновременно, так как они будут пытаться одновременно получить доступ к файлам данных (чтобы избежать случайного запуска SQL Server на обоих узлах, используйте ресурс кластера файловой системы, чтобы убедиться, что общая папка не подключена дважды разными узлами). Приведенные ниже команды запускают SQL Server, проверяют его состояние, а затем останавливают SQL Server.
sudo systemctl start mssql-server sudo systemctl status mssql-server sudo systemctl stop mssql-server
На этом этапе оба экземпляра SQL Server настроены для запуска с файлами базы данных в общем хранилище. Следующим шагом является настройка SQL Server для Pacemaker.
Установка и настройка Pacemaker в каждом узле кластера
На обоих узлах кластера создайте файлы для хранения имени пользователя и пароля SQL Server для входа с помощью Pacemaker. Следующая команда создает и заполняет такой файл:
sudo touch /var/opt/mssql/secrets/passwd echo '<loginName>' | sudo tee -a /var/opt/mssql/secrets/passwd echo '<loginPassword>' | sudo tee -a /var/opt/mssql/secrets/passwd sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 600 /var/opt/mssql/secrets/passwd
В брандмауэрах на обоих узлах кластера откройте порты для Pacemaker. Чтобы открыть эти порты с помощью
firewalld
, выполните следующую команду:sudo firewall-cmd --permanent --add-service=high-availability sudo firewall-cmd --reload
Если вы используете другой брандмауэр, который не имеет встроенной конфигурации высокого уровня доступности, для связи с другими узлами в кластере необходимо открыть следующие порты:
- TCP: порты 2224, 3121, 21064
- UDP: порт 5405
Установите пакеты Pacemaker на каждом узле.
sudo yum install pacemaker pcs fence-agents-all resource-agents
Задайте пароль для пользователя по умолчанию, который создается при установке пакетов Pacemaker и Corosync. Используйте одинаковый пароль на обоих узлах.
sudo passwd hacluster
Включите и запустите службу
pcsd
и Pacemaker. Это позволит узлам повторно подключаться к кластеру после перезагрузки. Выполните следующую команду на обоих узлах:sudo systemctl enable pcsd sudo systemctl start pcsd sudo systemctl enable pacemaker
Установите агент ресурсов отказоустойчивого кластера для SQL Server. Выполните следующие команды на обоих узлах.
sudo yum install mssql-server-ha
Настройка агента ограждения
Устройство STONITH предоставляет агент ограждения. В статье Настройка кластера Pacemaker в Red Hat Enterprise Linux в Azure приводится пример создания устройства STONITH для этого кластера в Azure. Измените инструкции для своей среды.
Создайте кластер.
Создайте кластер в одном из узлов.
sudo pcs cluster auth <nodeName1 nodeName2 ...> -u hacluster sudo pcs cluster setup --name <clusterName> <nodeName1 nodeName2 ...> sudo pcs cluster start --all
Настройте кластерные ресурсы для SQL Server, файловой системы и виртуального IP-адреса, а затем отправьте конфигурацию в кластер. Потребуются следующие сведения:
- Имя ресурса SQL Server: имя кластеризованного ресурса SQL Server.
- Имя ресурса плавающего IP-адреса: имя ресурса виртуального IP-адреса.
- IP-адрес: IP-адрес, используемый клиентами для подключения к кластеризованному экземпляру SQL Server.
- Имя ресурса файловой системы: имя ресурса файловой системы.
- device (устройство): путь к общей папке NFS.
- directory (каталог): локальный путь подключения к общей папке.
- fstype: тип общей папки (т. е
nfs
. )
Замените значения в приведенном ниже скрипте значениями для своей среды. Запустите его в одном узле, чтобы настроить и запустить кластеризованную службу.
sudo pcs cluster cib cfg sudo pcs -f cfg resource create <sqlServerResourceName> ocf:mssql:fci sudo pcs -f cfg resource create <floatingIPResourceName> ocf:heartbeat:IPaddr2 ip=<ip Address> sudo pcs -f cfg resource create <fileShareResourceName> Filesystem device=<networkPath> directory=<localPath> fstype=<fileShareType> sudo pcs -f cfg constraint colocation add <virtualIPResourceName> <sqlResourceName> sudo pcs -f cfg constraint colocation add <fileShareResourceName> <sqlResourceName> sudo pcs cluster cib-push cfg
Например, следующий сценарий создает кластеризованный ресурс
mssqlha
SQL Server и ресурс с плавающей IP-адресом10.0.0.99
. Кроме того, он создает ресурс файловой системы и добавляет ограничения, чтобы все ресурсы находились в одном узле с ресурсом SQL.sudo pcs cluster cib cfg sudo pcs -f cfg resource create mssqlha ocf:mssql:fci sudo pcs -f cfg resource create virtualip ocf:heartbeat:IPaddr2 ip=10.0.0.99 sudo pcs -f cfg resource create fs Filesystem device="10.8.8.0:/mnt/nfs" directory="/var/opt/mssql/data" fstype="nfs" sudo pcs -f cfg constraint colocation add virtualip mssqlha sudo pcs -f cfg constraint colocation add fs mssqlha sudo pcs cluster cib-push cfg
После отправки конфигурации SQL Server запустится в одном узле.
Убедитесь в том, что SQL Server запущен.
sudo pcs status
В следующем примере показаны результаты успешного запуска кластеризованного экземпляра SQL Server Pacemaker.
fs (ocf::heartbeat:Filesystem): Started sqlfcivm1 virtualip (ocf::heartbeat:IPaddr2): Started sqlfcivm1 mssqlha (ocf::mssql:fci): Started sqlfcivm1 PCSD Status: sqlfcivm1: Online sqlfcivm2: Online Daemon Status: corosync: active/disabled pacemaker: active/enabled pcsd: active/enabled