Поделиться через


Настройка экземпляра отказоустойчивого кластера 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 Server с общим диском 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
    

    Подключитесь к базе данных SQL Server master с учетной записью sa и выполните следующую команду:

    USE [master];
    GO
    
    CREATE LOGIN [<loginName>]
        WITH PASSWORD = N'<password>';
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [<loginName>];
    

    Внимание

    Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

    Вы также можете задать разрешения на более детальном уровне. Для входа в Pacemaker необходимо VIEW SERVER STATE запросить состояние работоспособности с помощью sp_server_diagnostics, setupadmin и ALTER ANY LINKED SERVER, а также обновить имя экземпляра 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. Пример см. в статье RHEL7. Использование Kerberos для управления доступом к сетевым ресурсам NFS.

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

Если вы не защищаете 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 '<password>' | 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
    

    Внимание

    Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.

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

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

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

    • 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.
    • устройство: локальный путь, на котором оно смонтировано к общей папке.
    • 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
    

    Например, следующий сценарий создает ресурс кластеризованного SQL Server с именем mssqlha и ресурс с плавающим 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