通过


为 Linux 上的 SQL Server 创建和配置可用性组

适用于:Linux 上的 SQL Server

本教程演示如何为 Linux 上的 SQL Server 创建和配置可用性组(AG)。 与 Windows 上的 SQL Server 2016 (13.x) 和早期版本不同,可以先启用 AG,也可以不创建基础 Pacemaker 群集。 如果需要,稍后会与群集集成。

本教程包括以下任务:

  • 启用可用性组。
  • 创建可用性组终结点和证书。
  • 使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 创建可用性组。
  • 为 Pacemaker 创建 SQL Server 登录和权限。
  • 在 Pacemaker 群集中创建可用性组资源(仅限外部类型)。

先决条件

按照为 Linux 上的 SQL Server 部署 Pacemaker 群集中所述部署 Pacemaker 高可用性群集。

启用可用性组功能

与在 Windows 中不同,无法使用 PowerShell 或 SQL Server 配置管理器启用可用性组 (AG) 功能。 在 Linux 上,可以通过两种方式启用可用性组功能:使用 mssql-conf 实用工具或手动编辑 mssql.conf 文件。

重要

必须为仅配置副本启用 AG 功能,即使在 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 才支持可用性组(AG)的终结点。 必须从同一 AG 中作为副本参与的所有其他实例上的一个实例还原证书。 即使是仅用于配置的副本,也需要办理证书过程。

只能使用 Transact-SQL 创建终结点和还原证书。 还可以使用非 SQL Server 生成的证书。 还需要一个进程来管理和替换任何过期的证书。

重要

如果计划使用 SQL Server Management Studio 向导创建 AG,则仍需要使用 Linux 上的 Transact-SQL 创建和还原证书。

有关可用于各种命令的选项的完整语法(包括安全性),请参阅:

注意

虽然要创建的是可用性组,但端点类型将使用 FOR DATABASE_MIRRORING,这是因为某些基础特性曾与现已弃用的功能共享。

此示例将创建用于一个三节点配置的证书。 实例名称为 LinAGN1LinAGN2LinAGN3

  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 复制到 LinAGN2LinAGN3
    • LinAGN2_Cert.cer 复制到 LinAGN1LinAGN3
    • LinAGN3_Cert.cer 复制到 LinAGN1LinAGN2
  5. 将所有权和与复制的证书文件相关联的组更改为 mssql

    sudo chown mssql:mssql <CertFileName>
    
  6. LinAGN2 上创建与 LinAGN3LinAGN1 关联的实例级登录名和用户。

    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_CertLinAGN3_CertLinAGN1 上。 具有其他副本的证书是 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. 向与 LinAGN2LinAGN3 关联的登录名授予连接到 LinAGN1 上的端点的权限。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    
  9. LinAGN1 上创建与 LinAGN3LinAGN2 关联的实例级登录名和用户。

    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_CertLinAGN3_CertLinAGN2 上。

    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. 向与 LinAGN1LinAGN3 关联的登录名授予连接到 LinAGN2 上的端点的权限。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    GO
    
  12. LinAGN1 上创建与 LinAGN2LinAGN3 关联的实例级登录名和用户。

    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_CertLinAGN2_CertLinAGN3 上。

    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. 向与 LinAG1LinAGN2 关联的登录名授予连接到 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 和新可用性组向导创建群集类型为“外部”的 AG。

  1. 在 SSMS 中展开“Always On 高可用性”,右键单击“可用性组”并选择“新建可用性组向导”。

  2. 在“简介”对话框中,选择“下一步”。

  3. 在“指定可用性组选项”对话框中,输入 AG 的名称,然后在下拉列表中选择群集类型 EXTERNALNONE。 部署 Pacemaker 时使用 EXTERNAL 。 使用 NONE 于特定场景,如读取扩展。选择数据库级别的健康检测选项是可选的。 有关此选项的详细信息,请参阅 可用性组数据库级别运行状况检测故障转移选项。 选择下一步

    “创建可用性组”的屏幕截图,显示群集类型。

  4. 在“选择数据库”对话框中,选择要参与 AG 的数据库。 每个数据库必须先进行完整备份,然后才能将其添加到可用性组 (AG)。 选择下一步

  5. 在“指定副本”对话框中,选择“添加副本”。

  6. 在“连接到服务器”对话框中,输入将作为次要副本的 SQL Server 的 Linux 实例的名称以及要连接的凭据。 选择“连接” 。

  7. 对包含仅配置副本或其他次要副本的实例重复前两个步骤。

  8. 这三个实例都显示在“指定副本”对话框中。 如果使用外部群集类型,对于作为真正的辅助副本的辅助副本,请确保可用性模式与主副本的可用性模式匹配,故障转移模式设置为“外部”。 对于仅配置副本,请选择“仅配置”可用性模式。

    下面的示例显示具有两个副本的 AG,一个“外部”群集类型和一个“仅配置”副本。

    “创建可用性组”的屏幕截图,显示可读辅助选项。

    下面的示例显示了一个 AG,其中包含两个副本、集群类型为无,以及一个仅用于配置的副本。

    “创建可用性组”的屏幕截图,显示“副本”页。

  9. 如果要更改备份首选项,请选择“备份首选项”选项卡。有关使用 AG 的备份首选项的详细信息,请参阅 在 AlwaysOn 可用性组的次要副本上配置备份

  10. 如果使用可读辅助数据库或创建群集类型为 None 的 AG 进行读取缩放,则可以通过选择“ 侦听器 ”选项卡来创建侦听器。还可以稍后添加侦听器。 若要创建侦听器,请选择 “创建可用性组侦听器 ”选项并输入名称、TCP/IP 端口,以及是使用静态还是自动分配的 DHCP IP 地址。 对于群集类型为 "None" 的 AG,IP 应设置为静态,并应当设置为主服务器的 IP 地址。

    “创建可用性组”的屏幕截图,显示侦听器选项。

  11. 如果为可读方案创建侦听器,SSMS 允许在向导中创建只读路由。 以后还可以通过 SSMS 或 Transact-SQL 添加它。 立即添加只读路由:

    1. 选择“只读路由”选项卡。

    2. 输入只读副本的 URL。 这些 URL 类似于终结点,只是它们使用的是实例的端口,而不是终结点。

      1. 选择每个 URL,并从底部选择可读副本。 若要选择多个,请按住 Shift 或选择拖动。
  12. 选择下一步

  13. 选择如何初始化次要副本。 默认情况下使用自动播种,这要求所有参与 AG 的服务器使用相同的路径。 可以选择让向导执行备份、复制和还原(第二个选项);如果您在副本上手动备份、复制和还原了数据库,可以让它加入(第三个选项);或者稍后添加数据库(最后一个选项)。 与证书一样,如果手动进行备份和复制,请在其他副本上的备份文件上设置权限。 选择下一步

  14. 在“验证”对话框中,如果向导未返回 成功 进行所有检查,请进一步调查。 某些警告是可接受的而不是致命的,例如,不创建侦听器。 选择下一步

  15. 在“摘要”对话框中,选择“完成”。 开始创建 AG 的过程。

  16. AG 创建完成后,选择“结果”上的“关闭”。 现在可以在动态管理视图中以及 SSMS 中的“Always On 高可用性”文件夹下查看副本上的 AG。

使用 Transact-SQL

本节介绍使用 Transact-SQL 创建 AG 的示例。 创建 AG 后,可以配置侦听器和只读路由。 可以使用 ALTER AVAILABILITY GROUP修改 AG 本身,但不能在 SQL Server 2017 (14.x) 中更改群集类型。 如果不打算创建群集类型为“外部”的 AG,则必须将其删除并使用群集类型“无”重新创建它。 有关详细信息和其他选项,请参阅以下链接:

示例 A:具有仅用于配置的副本的两个副本(外部群集类型)

此示例演示如何创建一个包含仅用于配置的副本的双副本可用性组 (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
    ),
    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 是 AG 的名称。
    • DBName 是用于 AG 的数据库的名称。 它也可以是以逗号分隔的名称列表。
    • ListenerName 是一个与任何基础服务器或节点不同的名称。 它与 DNS 一起注册 IPAddress
    • IPAddress 是与 ListenerName 相关联的 IP 地址。 它也是唯一的,与任何服务器或节点不同。 应用程序和最终用户将使用 ListenerNameIPAddress 连接到 AG 。
      • SubnetMaskIPAddress 的子网掩码。 在 SQL Server 2019(15.x)和以前的版本中,此值为 255.255.255.255。 在 SQL Server 2022(16.x)及更高版本中,此值为 0.0.0.0
  2. 在连接到其他副本的查询窗口中,执行以下语句,将副本加入 AG,并启动从主副本到次要副本的种子设定过程。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 对第三个副本重复步骤 2。

示例 C:具有只读路由的两个副本(“无”群集类型)

此示例显示使用群集类型“无”创建双副本配置。 将此配置用于不需要故障转移的读扩展场景。 此步骤创建的侦听器实际上是主要副本,并使用轮循机制支持只读路由。

  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 是 AG 的名称。
    • DBName 是用于 AG 的数据库的名称。 它也可以是以逗号分隔的名称列表。
    • PortOfEndpoint 是所创建的终结点使用的端口号。
      • PortOfInstance 是 SQL Server 实例使用的端口号。
    • ListenerName 是一个与任何基础副本不同但未实际使用的名称。
    • PrimaryReplicaIPAddress 是主要副本的 IP 地址。
      • SubnetMaskIPAddress 的子网掩码。 在 SQL Server 2019(15.x)和以前的版本中,此值为 255.255.255.255。 在 SQL Server 2022(16.x)及更高版本中,此值为 0.0.0.0
  2. 将次要副本联接到 AG 并启动自动播种。

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

为 Pacemaker 创建 SQL Server 登录和权限

Linux 上使用 SQL Server 的 Pacemaker 高可用性群集需要访问 SQL Server 实例,以及 AG 本身的权限。 这些步骤将创建登录名和关联的权限,以及告知 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 中创建 AG 后,当指定群集类型为“外部”时,必须在 Pacemaker 中创建相应的资源。 AG 需要两个资源:可用性组资源和 IP 地址资源。 如果不使用侦听器,则配置 IP 地址资源是可选的。 但是,当你需要侦听器功能时,建议使用此方法。

创建的 AG 资源是一种称为 克隆的资源类型。 AG 资源在每个节点上都有副本,另一个控制资源称为 主节点主服务器与托管主副本的服务器相关联。 其他资源托管次要副本(常规副本或仅配置副本),可以在故障转移中提升至 主节点

注意

在 SQL Server 2025(17.x)中,从累积更新(CU)3及更高版本开始,通过 mssql-server-ha 包,Red Hat Enterprise Linux(RHEL)和 Ubuntu 可以使用 Pacemaker HA 代理 v2(预览版)。 非生产部署可以评估 Pacemaker HA 代理 v2。 现有的 Pacemaker HA 代理(v1)继续获得全面支持,适用于生产环境中的部署。 有关详细信息,请参阅 Pacemaker HA 代理 v2 (预览版)。

Pacemaker HA 代理程序 v1

  1. 使用 Pacemaker HA 代理在 Pacemaker 中创建 AG 资源(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. 为与侦听器功能关联的 AG 创建 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 代理 v2 (预览版)

Pacemaker HA 代理 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 通过 mssql-pcsag 服务与 SQL Server 可用性组进行交互。 若要使可用性组监视和故障转移正常工作:

  • Pacemaker 群集必须正在运行。
  • 服务 mssql-pcsag 必须正在运行。

虽然 Pacemaker 并 mssql-pcsag 部署为单独的组件,但它们在运行时一起运行。 如果 Pacemaker 或服务 mssql-pcsag 已停止,可用性组故障转移操作将无法按预期运行。

注意

mssql-pcsag重启服务不会重启 SQL Server。 同样,重启 SQL Server 不会自动重启 Pacemaker HA 代理。 验证这两个服务在故障排除期间是否都在运行。

Pacemaker HA 代理 v2 对以前的代理引入了可靠性和性能改进,包括:

  • 改进了故障转移性能,以减少计划内和计划外故障转移时间。

  • 支持灵活的自动故障转移策略,包括配置 故障条件级别运行状况检查超时

    示例:以下 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. 使用 Pacemaker HA 代理 v2 在 Pacemaker 中创建 AG 资源:(ocf:mssql:agv2

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

    如果从 Pacemaker HA 代理 v1 升级到 v2,请先删除现有 AG 资源,然后再创建 agv2 资源:

    sudo pcs resource delete <NameForAGResource>
    

    此操作在重新创建资源时暂时停止 AG 同步。 删除和重新创建 Pacemaker AG 资源不会删除 AG。 重新创建资源后,Pacemaker 会自动恢复管理和 AG 同步。

  2. 为与侦听器功能关联的 AG 创建 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 资源的名称。