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


Создание и настройка группы доступности для 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 (только внешний тип).

Предварительные условия

Разверните кластер Pacemaker с высоким уровнем доступности, как описано в статье Развертывание кластера Pacemaker для SQL Server на Linux.

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

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

Внимание

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

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

Внимание

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

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

Примечание.

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

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

    • Скопируйте 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
    

    Внимание

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

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

    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. Предоставьте логинам, связанным с LinAG1 и 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

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

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

  2. В диалоговом окне "Введение" нажмите кнопку Далее.

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

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

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

  5. В диалоговом окне "Указание реплик" щелкните Добавить реплику.

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

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

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

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

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

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

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

  9. Если вы хотите изменить параметры резервного копирования, перейдите на вкладку "Параметры резервного копирования". Дополнительные сведения о параметрах резервного копирования с помощью групп доступности см. в статье "Настройка резервных копий на вторичных репликах группы доступности Always On".

  10. Если вы используете доступные для чтения вторичные файлы или создаете группу доступности с типом кластера None для масштабирования чтения, можно создать прослушиватель, выбрав вкладку Прослушивателя . Вы также можете добавить прослушиватель позже. Чтобы создать прослушиватель, выберите параметр "Создать прослушиватель группы доступности " и введите имя, ПОРТ TCP/IP и следует ли использовать статический или автоматически назначенный DHCP-IP-адрес. Для группы доступности с типом кластера 'Нет' IP-адрес должен быть статическим и быть установленным на основной IP-адрес.

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

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

    1. Выберите вкладку "Маршрутизация только для чтения".

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

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

  12. Выберите Далее.

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

  14. В диалоговом окне проверки, если результат не отображается как успешный, проведите расследование. Некоторые предупреждения допустимы и не являются смертельными, например, если вы не создаете прослушиватель. Выберите Далее.

  15. В диалоговом окне "Сводка" нажмите кнопку Готово. Теперь начинается процесс создания AG.

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

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

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

    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. Три реплики с маршрутизацией только для чтения (внешний тип кластера)

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

  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)

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

  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 введите команду:

    sudo emacs /var/opt/mssql/secrets/passwd
    

    Эта команда открывает редактор Emacs.

  3. Введите в редакторе следующие две строки:

    PMLogin
    
    <password>
    
  4. Ctrl Удерживайте клавишу, а затем XнажмитеC, чтобы выйти и сохранить файл.

  5. Выполните:

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

    чтобы заблокировать файл.

  6. Повторите шаги 1-5 на других серверах, которые служат репликами.

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

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

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

  1. Чтобы создать ресурс 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.

Следующий шаг

В этом руководстве вы узнали, как создать и настроить группу доступности для SQL Server на Linux. Вы научились выполнять следующие задачи:

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

Для выполнения большинства задач администрирования AG, включая обновления и отработку отказа, см. статью: