Настройка экземпляра отказоустойчивого кластера 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 обнаруживает сбой, компоненты кластеризации отвечают за перемещение ресурсов на другой узел.

Кластер SQL с общим диском Red Hat Enterprise Linux 7.

Дополнительные сведения о конфигурации кластера, параметрах агентов ресурсов и управлении см. в справочной документации по 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 в каждом узле кластера

  1. Установите и настройте SQL Server в обоих узлах. Подробные инструкции см. в статье Установка SQL Server в Linux.

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

  3. Остановите и отключите 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 учетная запись может получить доступ к ней для расшифровки главного ключа сервера.

  1. На основном узле создайте имя входа 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_diagnosticssetupadmin обновить имя экземпляра FCI с именем ресурса, выполнив и выполнив sp_dropserver командуsp_addserver.

  2. Остановите и отключите SQL Server в первичном узле.

  3. В каждом узле кластера настройте файл 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 выполните следующие действия.

  1. Установите nfs-utils

    sudo yum -y install nfs-utils
    
  2. Включите и запустите rpcbind.

    sudo systemctl enable rpcbind && sudo systemctl start rpcbind
    
  3. Включите и запустите nfs-server.

    sudo systemctl enable nfs-server && sudo systemctl start nfs-server
    
  4. Измените /etc/exports, чтобы экспортировать каталог, общий доступ к которому необходимо предоставить. Вам нужна одна строка для каждой нужной общей папки. Например:

    /mnt/nfs  10.8.8.0/24(rw,sync,no_subtree_check,no_root_squash)
    
  5. Экспортируйте общие папки:

    sudo exportfs -rav
    
  6. Убедитесь в том, что пути являются общими или экспортированными. На сервере NFS выполните следующую команду:

    sudo showmount -e
    
  7. Добавьте исключение в SELinux:

    sudo setsebool -P nfs_export_all_rw 1
    
  8. Откройте брандмауэр на сервере.

    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

Выполните указанные ниже действия во всех узлах кластера.

  1. Установите nfs-utils

    sudo yum -y install nfs-utils
    
  2. Откройте брандмауэр в клиентах и на сервере 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
    
  3. Убедитесь в том, что общие папки NFS доступны на клиентских компьютерах.

    sudo showmount -e <IP OF NFS SERVER>
    
  4. Повторите эти действия во всех узлах кластера.

Дополнительные сведения об использовании NFS см. в следующих статьях:

Подключение каталога файлов базы данных для указания общего хранилища

  1. Только в основном узле сохраните файлы базы данных во временном расположении. Приведенный ниже скрипт создает временный каталог, копирует файлы базы данных в него и удаляет старые файлы базы данных. При запуске 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
    
  2. На всех узлах кластера измените /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 подключает папки при запуске кластеризованного ресурса файловой системы. Ограждение гарантирует, что файловая система не будет подключена дважды.

  1. Выполните команду mount -a, чтобы система обновила подключенные пути.

  2. Скопируйте файлы базы данных и журналов, сохраненные в /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
    
  3. Убедитесь в том, что 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 в каждом узле кластера

  1. На обоих узлах кластера создайте файлы для хранения имени пользователя и пароля 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
    
  2. В брандмауэрах на обоих узлах кластера откройте порты для Pacemaker. Чтобы открыть эти порты с помощью firewalld, выполните следующую команду:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    Если вы используете другой брандмауэр, который не имеет встроенной конфигурации высокого уровня доступности, для связи с другими узлами в кластере необходимо открыть следующие порты:

    • TCP: порты 2224, 3121, 21064
    • UDP: порт 5405
  3. Установите пакеты Pacemaker на каждом узле.

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  4. Задайте пароль для пользователя по умолчанию, который создается при установке пакетов Pacemaker и Corosync. Используйте одинаковый пароль на обоих узлах.

    sudo passwd hacluster
    
  5. Включите и запустите службу pcsd и Pacemaker. Это позволит узлам повторно подключаться к кластеру после перезагрузки. Выполните следующую команду на обоих узлах:

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  6. Установите агент ресурсов отказоустойчивого кластера для SQL Server. Выполните следующие команды на обоих узлах.

    sudo yum install mssql-server-ha
    

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

Устройство STONITH предоставляет агент ограждения. В статье Настройка кластера Pacemaker в Red Hat Enterprise Linux в Azure приводится пример создания устройства STONITH для этого кластера в Azure. Измените инструкции для своей среды.

Создайте кластер.

  1. Создайте кластер в одном из узлов.

    sudo pcs cluster auth <nodeName1 nodeName2 ...> -u hacluster
    sudo pcs cluster setup --name <clusterName> <nodeName1 nodeName2 ...>
    sudo pcs cluster start --all
    
  2. Настройте кластерные ресурсы для 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
    

    Например, следующий сценарий создает кластеризованный ресурс mssqlhaSQL 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 запустится в одном узле.

  3. Убедитесь в том, что 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