Создание и настройка группы доступности для SQL Server на Linux

Применимо к:SQL Server в Linux

В этом руководстве показано, как создать и настроить группу доступности для SQL Server в Linux. В отличие от SQL Server 2016 (13.x) и более ранних версий на Windows, вы можете включить группу доступности (AG) с или без создания базового кластера Pacemaker. Интеграция с кластером при необходимости происходит позже.

В руководстве рассматриваются следующие задачи:

  • включение групп доступности;
  • Создайте конечные точки и сертификаты для групп доступности.
  • Используйте SQL Server Management Studio (SSMS) или Transact-SQL для создания группы доступности.
  • Создайте имя входа и разрешения SQL Server для Pacemaker.
  • Создайте ресурсы групп доступности в кластере Pacemaker (только внешний тип).

Prerequisites

Развернуть кластер высокой доступности Pacemaker. Для получения дополнительной информации см. раздел «Развернуть кластер Pacemaker для SQL Server на Linux».

Включение компонента "Группы доступности"

В отличие от Windows, вы не можете использовать PowerShell или диспетчер конфигурации SQL Server для включения функции групп доступности (AG). В Linux можно включить функцию групп доступности двумя способами: использовать mssql-conf служебную программу или редактировать mssql.conf файл вручную.

Important

Необходимо включить функцию группы доступности для реплик, доступных только для конфигурации, даже в SQL Server Express.

Используйте утилиту mssql-conf

В командной строке выполните следующую команду:

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

Изменение файла mssql.conf

Вы также можете изменить файл, расположенный mssql.conf в папке /var/opt/mssql . Добавьте следующие строки:

[hadr]

hadr.hadrenabled = 1

Перезапуск SQL Server

После включения групп доступности необходимо перезапустить SQL Server. Используйте следующую команду:

sudo systemctl restart mssql-server

Создание конечных точек и сертификатов для групп доступности

Для взаимодействия группа доступности использует конечные точки TCP. В Linux SQL Server поддерживает конечные точки группы доступности только в том случае, если для проверки подлинности используются сертификаты. Необходимо восстановить сертификат из одного экземпляра на всех остальных экземплярах, которые участвуют в качестве реплик в той же группе доступности. Вам нужен процесс сертификации даже для реплики, предназначенной только для конфигурации.

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

Important

Если вы планируете использовать мастер SQL Server Management Studio для создания группы доступности, вам всё равно необходимо создать сертификаты и восстановить их с помощью Transact-SQL в Linux.

Полный синтаксис параметров, доступных для различных команд (включая безопасность), см. в следующих статьях:

Note

Хотя вы создаёте группу доступности, тип конечной точки использует FOR DATABASE_MIRRORING, потому что тип конечной точки разделяет основные аспекты с этой ныне устаревшей функцией.

В этом примере создаются сертификаты для конфигурации с тремя узлами. Имена экземпляров: LinAGN1, LinAGN2, и LinAGN3.

  1. Выполните следующий скрипт LinAGN1 , чтобы создать главный ключ, сертификат и конечную точку и создать резервную копию сертификата. Для этого примера конечная точка использует типичный TCP-порт 5022.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN1_Cert
    WITH SUBJECT = 'LinAGN1 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN1_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN1_Cert,
        ROLE = ALL
    );
    GO
    
  2. Выполните то же самое на LinAGN2:

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
    WITH SUBJECT = 'LinAGN2 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN2_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN2_Cert,
        ROLE = ALL
    );
    GO
    
  3. Наконец, выполните ту же последовательность на LinAGN3.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
    WITH SUBJECT = 'LinAGN3 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN3_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN3_Cert,
        ROLE = ALL
    );
    GO
    
  4. Используйте scp другую утилиту, чтобы скопировать резервные копии сертификата на каждый узел, который вы хотите включить в AG.

    В этом примере:

    • Скопируйте LinAGN1_Cert.cer в LinAGN2 и LinAGN3.
    • Скопируйте LinAGN2_Cert.cer в LinAGN1 и LinAGN3.
    • Скопируйте LinAGN3_Cert.cer в LinAGN1 и LinAGN2.
  5. Измените владельца и группу скопированных файлов сертификатов на mssql.

    sudo chown mssql:mssql <CertFileName>
    
  6. Создайте учетные записи на уровне экземпляра и пользователей, связанных с LinAGN2 и LinAGN3 на LinAGN1.

    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    

    Caution

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

  7. Восстановить LinAGN2_Cert и LinAGN3_Cert на LinAGN1. Сертификаты других реплик необходимы для связи и безопасности AG.

    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  8. Предоставьте логинам, связанным с LinAGN2 и LinAGN3, разрешение подключаться к конечной точке на LinAGN1.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    
  9. Создайте учетные записи на уровне экземпляра и пользователей, связанных с LinAGN1 и LinAGN3 на LinAGN2.

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    
  10. Восстановить LinAGN1_Cert и LinAGN3_Cert на LinAGN2.

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  11. Предоставьте логинам, связанным с LinAGN1 и LinAGN3, разрешение подключаться к конечной точке на LinAGN2.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    GO
    
  12. Создайте учетные записи на уровне экземпляра и пользователей, связанных с LinAGN1 и LinAGN2 на LinAGN3.

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
  13. Восстановить LinAGN1_Cert и LinAGN2_Cert на LinAGN3.

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
  14. Предоставьте логинам, связанным с LinAGN1 и LinAGN2, разрешение подключаться к конечной точке на LinAGN3.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GO
    

Создание группы доступности

В этом разделе показано, как использовать SQL Server Management Studio (SSMS) или Transact-SQL для создания группы доступности для SQL Server.

Используйте SQL Server Management Studio

В этом разделе показано, как создать AG с кластерным типом External с помощью SSMS с мастером новой группы доступности.

  1. В SSMS разверните Высокий уровень доступности Always On, щелкните правой кнопкой мыши на Группы доступности и выберите Новый мастер создания групп доступности.

  2. В диалоге «Введение » выберите «Далее».

  3. В диалоговом окне "Указать параметры группы доступности " введите имя группы доступности и выберите тип EXTERNAL кластера или NONE в раскрывающемся списке. Используйте EXTERNAL, когда развертываете Pacemaker. Используйте NONE для специализированных сценариев, таких как масштабирование чтения. Выбор опции для обнаружения работоспособности на уровне базы данных необязателен. Дополнительные сведения об этом параметре см. в разделе "Параметр отказоустойчивости обнаружения работоспособности на уровне базы данных группы доступности". Нажмите кнопку Далее.

    Снимок экрана создания группы доступности, показывающий тип кластера.

  4. В диалоговом диалоге «Выбрать базы данных » выберите базы данных, в которых хотите участвовать в AG. Каждая база данных должна иметь полную резервную копию, прежде чем добавить ее в группу доступности. Нажмите кнопку Далее.

  5. В диалоговом диалоге «Указать реплику » выберите « Добавить реплику».

  6. В диалоговом диалоге «Подключиться к серверу» введите имя Linux-экземпляра SQL Server для вторичной реплики и учетные данные для подключения. Нажмите Подключиться.

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

  8. Все три экземпляра отображаются в диалоге «Укажите реплики ». Если вы используете кластерный внешний тип, то для вторичной копии, которая является настоящей вторичной, убедитесь, что режим доступности совпадает с режимом основной реплики, и установите режим резервирования на внешний. Для реплики, поддерживающей только конфигурацию, выберите режим доступности "Только конфигурация".

    В следующем примере показана AG с двумя репликами, тип кластера "Внешний" и реплика только для конфигурации.

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

    В приведенном ниже примере показана группа доступности (AG) с двумя репликами, типом кластера "Нет" и репликой, предназначенной только для конфигурации.

    Снимок экрана окна создания группы доступности, показывающего страницу Реплики.

  9. Если хотите изменить настройки резервного копирования, выберите вкладку «Настройки резервного копирования ». Для получения дополнительной информации о предпочтениях резервного копирования с AG см. раздел «Настраивать резервные копии на вторичных репликах группы доступности Always On».

  10. Если вы используете доступные для чтения вторичные файлы или создаете группу доступности с типом кластера None для масштабирования чтения, можно создать прослушиватель, выбрав вкладку Прослушивателя . Вы также можете добавить прослушиватель позже. Для создания слушателя выберите опцию «Создать группу доступности» и введите имя, порт TCP/IP, а также определите, стоит ли использовать статический или автоматически назначенный DHCP IP-адрес. Для AG с типом кластера None используйте статический IP, совпадающий с IP-адресом основного устройства.

    Снимок экрана окна создания группы доступности с опцией для прослушивателя.

  11. Если создать слушатель для читаемых сценариев, SSMS позволяет создавать маршрутизацию только для чтения в мастере. Вы также можете добавить его позже, используя SSMS или Transact-SQL. Чтобы добавить маршрутизацию только для чтения сразу, выполните указанные ниже действия.

    1. Выберите вкладку Read-Only Маршрутизация .

    2. Введите URL реплик в режиме только для чтения. Эти URL-адреса аналогичны адресам конечных точек за тем исключением, что используется порт экземпляра, а не конечной точки.

      1. Выберите каждый URL-адрес, а затем в области ниже выберите реплики, доступные для чтения. Чтобы выбрать несколько элементов, удерживайте клавишу Shift или выделите-натяните.
  12. Нажмите кнопку Далее.

  13. Выберите способ инициализации вторичных реплик. Способ по умолчанию — автоматическое заполнение, для чего требуется одинаковый путь на всех серверах, входящих в группу доступности. Мастер настройки также может выполнять резервное копирование, копирование и восстановление (второй вариант); присоединить базу данных, если вы вручную создали резервную копию, скопировали и восстановили базу данных на репликах (третий вариант); или добавить базу данных позже (последний вариант). Как и в случае с сертификатами, если вы вручную делаете резервные копии и копируете их, задайте разрешения на файлы резервного копирования на других репликах. Нажмите кнопку Далее.

  14. В диалоге «Валидация », если мастер не возвращает «Успех » для всех проверок, проверьте дальше. Некоторые предупреждения допустимы и не являются смертельными, например, если вы не создаете прослушиватель. Нажмите кнопку Далее.

  15. В диалоге «Резюме » выберите «Закончить». Теперь начинается процесс создания AG.

  16. Когда создание AG завершено, выберите «Закрыть » на странице «Результаты ». Теперь вы можете видеть АГ (группу доступности) на репликах в динамических представлениях управления, а также в папке Always On High Availability в SSMS (SQL Server Management Studio).

Использование Transact-SQL

В этом разделе приведены примеры создания AG с помощью Transact-SQL. После создания группы доступности (AG) можно настроить прослушиватель и маршрутизацию для чтения (read-only routing). Вы можете изменить группу доступности (AG) с помощью ALTER AVAILABILITY GROUP, но нельзя изменить тип кластера в SQL Server 2017 (14.x). Если вы не имели в виду создать группу доступности с типом внешнего кластера, необходимо удалить ее и создать заново с типом кластера None.

Для получения дополнительной информации и других вариантов см.:

Пример A. Две реплики с репликой только для конфигурации (внешний тип кластера)

В этом примере показано, как создать группу доступности с двумя репликами, одна из которых предназначена исключительно для конфигурации.

  1. Выполните следующий оператор на основном узле реплики, который содержит копию для чтения/записи баз данных. В этом примере используется автоматическое заполнение.

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE <DBName>
    REPLICA ON
    N'LinAGN1' WITH (
       ENDPOINT_URL = N' TCP://LinAGN1.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
    ),
    N'LinAGN2' WITH (
       ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
       SEEDING_MODE = AUTOMATIC
    ),
    N'LinAGN3' WITH (
       ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
       AVAILABILITY_MODE = CONFIGURATION_ONLY
    );
    GO
    
  2. В окне запроса, подключённом к другой реплике, выполните следующее операторское соединение, чтобы подключить реплику к AG и начать сеидинг с первичной реплики во вторичную.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. В окне запроса, подключённом к реплике, предназначенной только для конфигурации, выполните следующее сообщение, чтобы соединить её с AG.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    

Пример B. Три реплики с маршрутизацией только для чтения (внешний тип кластера)

В этом примере показано, как настроить маршрутизацию только для чтения в рамках начального создания AG для трёх полноценных реплик.

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

    CREATE AVAILABILITY GROUP [<AGName>] WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE < DBName > REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN2.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:1433')
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:1433')
        ),
        N'LinAGN3' WITH (
            ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN2.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN3.FullyQualified.Name:1433')
        )
        LISTENER '<ListenerName>' (
            WITH IP = ('<IPAddress>', '<SubnetMask>'), Port = 1433
        );
    GO
    

    Несколько замечаний касательно этой конфигурации:

    • AGName — имя группы доступности.
    • DBName — это имя базы данных, которую вы используете с группой доступности. Это также может быть список имён, разделённый по запятой.
    • ListenerName — это название, отличающееся от любого из базовых серверов или узлов. Вы регистрируете его в DNS вместе с IPAddress.
    • IPAddress — IP-адрес для ListenerName. Он также уникален и не совпадает ни с одним сервером или узлом. Приложения и конечные пользователи используют либо ListenerName, либо IPAddress для подключения к AG.
      • SubnetMask — маска подсети IPAddress. В SQL Server 2019 (15.x) и предыдущих версиях это значение равно 255.255.255.255. В SQL Server 2022 (16.x) и более поздних версиях это значение равно 0.0.0.0.
  2. В окне запроса, подключенном к другой реплике, выполните следующую инструкцию, чтобы присоединить реплику к группе доступности и инициировать процесс заполнения из первичной к вторичной реплике.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. Повторите шаг 2 для третьей реплики.

Пример C: две реплики с маршрутизацией только для чтения (тип кластера None)

В этом примере создаётся конфигурация из двух реплик, использующая кластерный тип None. Используйте эту конфигурацию для сценария с масштабированием чтения, когда вы не ожидаете отказа. Этот этап создаёт слушатель, являющийся основной копией, и настраивает маршрутизацию только для чтения с функцией кругового режима.

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

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = NONE)
    FOR DATABASE <DBName> REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name: <PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(
                ALLOW_CONNECTIONS = READ_WRITE,
                READ_ONLY_ROUTING_LIST = (('LinAGN1.FullyQualified.Name'.'LinAGN2.FullyQualified.Name'))
            ),
            SECONDARY_ROLE(
                ALLOW_CONNECTIONS = ALL,
                READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:<PortOfInstance>'
            )
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                     ('LinAGN1.FullyQualified.Name',
                        'LinAGN2.FullyQualified.Name')
                     )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfInstance>')
        ),
        LISTENER '<ListenerName>' (WITH IP = (
                 '<PrimaryReplicaIPAddress>',
                 '<SubnetMask>'),
                Port = <PortOfListener>
        );
    GO
    

    В этом примере:

    • AGName — имя группы доступности.
    • DBName — это имя базы данных, которую вы используете с группой доступности. Это также может быть список имён, разделённый по запятой.
    • PortOfEndpoint — это номер порта для конечной точки, которую вы создаёте.
      • PortOfInstance— это номер порта для экземпляра SQL Server.
    • ListenerName — это временное название, отличающееся от любых базовых реплик.
    • PrimaryReplicaIPAddress — ЭТО IP-адрес первичной реплики.
      • SubnetMask — маска подсети IPAddress. В SQL Server 2019 (15.x) и предыдущих версиях это значение равно 255.255.255.255. В SQL Server 2022 (16.x) и более поздних версиях это значение равно 0.0.0.0.
  2. Присоедините вторичную реплику к группе доступности и инициируйте автоматическое заполнение.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = NONE);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    

Создание имени входа и разрешений SQL Server для Pacemaker

Кластер отказоустойчивости Pacemaker, использующий SQL Server на Linux, должен получить доступ к экземпляру SQL Server и разрешениям на самой АГ. Эти действия создают логин и связанные разрешения, а также файл, который сообщает Pacemaker, как пройти аутентификацию в SQL Server.

  1. В окне запроса, подключенном к первой реплике, выполните следующий сценарий:

    CREATE LOGIN PMLogin
        WITH PASSWORD = '<password>';
    GO
    
    GRANT VIEW SERVER STATE TO PMLogin;
    GO
    
    GRANT ALTER, CONTROL, VIEW DEFINITION
    ON AVAILABILITY GROUP::<AGThatWasCreated> TO PMLogin;
    GO
    
  2. На узле 1 добавьте в файл следующие две строки /var/opt/mssql/secrets/passwd :

    PMLogin
    
    <password>
    

    Возможно, вам придётся повысить ваши права sudo , чтобы редактировать этот файл.

  3. Заблокируйте файл:

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  4. Повторите шаги 1-5 на других серверах, которые служат репликами.

Создайте ресурсы группы доступности в кластере Pacemaker (только для внешнего использования)

После создания AG в SQL Server, необходимо создать соответствующие ресурсы в Pacemaker при указании типа кластера "External". Группе доступности необходимы два ресурса: ресурс группы доступности и ресурс IP-адреса. Настройка ресурса IP-адреса является необязательным, если вы не используете прослушиватель. Однако рекомендуется, если вам нужны функции прослушивателя.

Создаваемый вами ресурс AG является типом ресурса, который называется клоном. Ресурс AG имеет копии на каждом узле и один контролирующий ресурс, называемый продвигаемым ресурсом. Продвигаемый ресурс соответствует серверу, на котором размещена основная реплика. Остальные ресурсы размещают вторичные копии (обычные или только конфигурационные), и их можно продвигать в режиме отказа.

Note

В SQL Server 2025 (17.x) с накопительным обновлением (CU) 3 и более поздних версий агент Ha Pacemaker версии 2 (предварительная версия) доступен для Red Hat Enterprise Linux (RHEL) и Ubuntu через mssql-server-ha пакет. Вы можете оценить Pacemaker HA агента v2 в непроизводственных развертываниях. Существующий агент Pacemaker HA (v1) всё ещё полностью поддерживается для производственных развертываний. Дополнительные сведения см. в статье Pacemaker HA agent версии 2 (предварительная версия).

Агент Pacemaker HA версии 1

  1. Создайте ресурс группы доступности в Pacemaker с помощью агента HA Pacemaker (v1): (ocf:mssql:ag)

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    В этом примере NameForAGResource — это уникальное имя, которое вы присваиваете этому кластерному ресурсу для группы доступности (AG), а AGName — это имя созданной вами группы доступности (AG).

  2. Создайте ресурс IP-адреса для шлюза приложений, который вы связываете с функциональностью прослушивателя.

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    В этом примере NameForIPResource это уникальное имя ресурса IP и IPAddress статический IP-адрес, назначенный ресурсу.

  3. Чтобы убедиться, что IP-адрес и ресурс AG выполняются на одном узле, настройте ограничение на совместное размещение.

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    В этом примере NameForIPResource — это имя ресурса IP, а NameForAGResource — имя ресурса AG.

  4. Создайте ограничение порядка, чтобы убедиться, что ресурс AG работает до IP-адреса. Хотя ограничение совместного размещения подразумевает ограничение упорядочения, этот шаг применяет его.

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    В этом примере NameForIPResource — это имя ресурса IP, а NameForAGResource — имя ресурса AG.

Агент Pacemaker HA версии 2 (предварительная версия)

Pacemaker HA agent v2 использует архитектуру на основе сервисов. Агент работает как выделенный системный сервис с названием mssql-pcsag, который отвечает за обработку специфических для SQL Server операций высокой доступности и коммуникацию с Pacemaker.

Вы управляете mssql-pcsag сервисом через стандартные системные системы управления. Запускайте, останавливайтесь, перезапускайте и при необходимости проверяйте статус этой службы с помощью следующих команд:

sudo systemctl start mssql-pcsag  # Start the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl stop mssql-pcsag  # Stop the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl restart mssql-pcsag  # Restart the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl status mssql-pcsag  # Check the status of the Pacemaker HA agent v2 (mssql-pcsag) service

Pacemaker взаимодействует с группами доступности SQL Server посредством службы mssql-pcsag. Для корректной работы мониторинга и аварийного переключения в группе доступности:

  • Кластер Pacemaker должен работать.
  • mssql-pcsag Служба должна быть запущена.

Хотя Pacemaker и mssql-pcsag являются отдельными компонентами, они работают вместе во время работы. Если либо Pacemaker, либо сервис mssql-pcsag останавливаются, операции резервирования группы доступности работают не так, как ожидалось.

Note

Перезапуск mssql-pcsag службы не перезапускает SQL Server. Аналогичным образом перезапуск SQL Server не перезапускает агент Pacemaker HA автоматически. Убедитесь, что обе службы запущены во время устранения неполадок.

Агент Pacemaker HA версии 2 предоставляет улучшения надежности и производительности по сравнению с предыдущим агентом, в том числе:

  • Улучшена эффективность отказа, чтобы сократить время планового и незапланированного отказа.

  • Поддержка гибких политик автоматического переключения, включая настройку уровня критерия отказа и тайм-аута проверки работоспособности.

    Пример. Следующая инструкция Transact-SQL изменяет уровень состояния сбоя существующей группы доступности с именем AG1 на уровень 2:

    ALTER AVAILABILITY GROUP AG1 SET (FAILURE_CONDITION_LEVEL = 2);
    

    Пример. Следующая инструкция Transact-SQL изменяет порог времени ожидания проверки работоспособности существующей группы доступности с именем AG1 на 60 000 миллисекунд (60 секунд).

    ALTER AVAILABILITY GROUP AG1 SET (HEALTH_CHECK_TIMEOUT = 60000);
    

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

    SELECT failure_condition_level,
           health_check_timeout
    FROM sys.availability_groups;
    
  • Поддержка TLS 1.3 для обмена данными между кластером Pacemaker и SQL Server.

  1. Создайте ресурс AG в Pacemaker с помощью агента высокой доступности Pacemaker v2: (ocf:mssql:agv2)

    sudo pcs resource create <NameForAGResource> ocf:mssql:agv2 ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    При обновлении агента высокой доступности (HA) Pacemaker версии 1 до версии 2 удалите существующий ресурс AG перед созданием agv2 ресурса.

    sudo pcs resource delete <NameForAGResource>
    

    Эта операция временно останавливает синхронизацию AG (группы доступности) во время повторного создания ресурса. Удаление и повторное создание ресурса Pacemaker AG не удаляет AG. После повторного создания ресурса Pacemaker автоматически возобновляет управление и синхронизацию АГ.

  2. Создайте ресурс IP-адреса для шлюза приложений, который вы связываете с функциональностью прослушивателя.

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    В этом примере NameForIPResource это уникальное имя ресурса IP и IPAddress статический IP-адрес, назначенный ресурсу.

  3. Чтобы убедиться, что IP-адрес и ресурс AG выполняются на одном узле, настройте ограничение на совместное размещение.

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    В этом примере NameForIPResource — это имя ресурса IP, а NameForAGResource — имя ресурса AG.

  4. Создайте ограничение очередности, чтобы ресурс AG запускался до ресурса IP-адреса. Хотя ограничение совместного размещения подразумевает ограничение упорядочения, этот шаг применяет его.

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    В этом примере NameForIPResource — это имя ресурса IP, а NameForAGResource — имя ресурса AG.