为 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 群集中创建可用性组资源(仅限外部类型)。

先决条件

部署Pacemaker高可用性集群。 更多信息请参见“在 Linux 上部署 Pacemaker 集群用于 Linux 上的 SQL Server”。

启用可用性组功能

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

Important

必须为仅配置副本启用 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 的端点。 您必须将证书从一个实例恢复到同一可用性组中作为副本参与的所有其他实例上。 即使是仅用于配置的副本,也需要办理证书过程。

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

Important

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

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

Note

虽然你要创建的是可用性组,但端点类型仍使用 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. 向与 LinAGN1LinAGN2 关联的登录名授予连接到 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 中的“新建可用性组向导”创建群集类型为 External 的 AG。

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

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

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

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

  4. “选择数据库” 对话框中,选择你想参与 AG 的数据库。 在将数据库添加到可用性组之前,必须先对其执行完整备份。 选择“下一步”。

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

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

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

  8. 这三个实例都出现在 “指定副本” 对话框中。 如果你使用的集群类型为 External,对于作为真正次要副本的辅助副本,请确保其可用性模式与主副本的可用性模式一致,并将故障转移模式设置为 External。 对于仅配置副本,请选择“仅配置”可用性模式。

    下面的示例显示具有两个副本的可用性组:一个“外部”群集类型和一个“仅配置”副本。

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

    下面的示例显示具有两个副本的可用性组:一个“无”群集类型和一个“仅配置”副本。

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

  9. 如果您想更改备份偏好设置,请选择 备份偏好 标签。有关AG备份偏好的更多信息,请参见 “配置Always On可用性组的次级副本备份”。

  10. 如果您使用可读辅助节点,或为读取扩展创建了一个集群类型为“None”的可用性组,则可以通过选择侦听器选项卡来创建侦听器。您也可以稍后添加侦听器。 要创建监听器,选择 “创建可用性组监听器 ”选项,输入名称、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 高可用性”文件夹下查看副本上的可用性组。

使用 Transact-SQL

本节展示了使用Transact-SQL创建AG的示例。 创建 AG 后,可以配置侦听器和只读路由。 可以使用 ALTER AVAILABILITY GROUP修改 AG 本身,但不能在 SQL Server 2017 (14.x) 中更改群集类型。 如果不打算创建群集类型为“外部”的 AG,则必须将其删除并使用群集类型“无”重新创建它。

更多信息及其他选项,请参见:

示例 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 是 AG 的名称。
    • DBName 是用于 AG 的数据库的名称。 也可以是逗号分隔的名单。
    • ListenerName 是与任何底层服务器或节点不同的名称。 你要在 DNS 中注册它,并连同 IPAddress 一起注册。
    • IPAddress 是 的 ListenerNameIP 地址。 而且它很独特,且不匹配任何服务器或节点。 应用程序和最终用户将使用 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:具有只读路由的两个副本(“无”群集类型)

这个例子创建了一个使用集群类型 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 是 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. 将辅助副本联接到可用性组并启动自动种子设定。

    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上,向文件添加以下两行 /var/opt/mssql/secrets/passwd

    PMLogin
    
    <password>
    

    你可能需要提升权限 sudo 才能编辑这个文件。

  3. 锁定文件:

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  4. 在其他充当副本的服务器上重复步骤 1-5。

在 Pacemaker 群集中创建高可用性组资源(仅限外部)

在 SQL Server 中创建 AG 后,当指定群集类型为“外部”时,必须在 Pacemaker 中创建相应的资源。 AG 需要两个资源:可用性组资源和 IP 地址资源。 如果不使用侦听器,则配置 IP 地址资源是可选的。 但是,当你需要侦听器功能时,建议使用此方法。

创建的 AG 资源是一种称为 克隆的资源类型。 AG 资源在每个节点上都有副本,并有一个称为 提升的 资源的控制资源。 被提升的资源对应于承载主副本的服务器。 其他资源托管次级副本(常规或仅配置),它们可以在故障切换中被提升。

Note

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

Pacemaker HA 智能体 v1

  1. 使用 Pacemaker HA 智能体 (v1) 在 Pacemaker 中创建可用性组资源:(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 软件代理程序 第二版 (预览版)

在 SQL Server 2025(17.x)及累积更新(CU)3 及以后版本中,包中mssql-server-ha提供了适用于 Red Hat Enterprise Linux(RHEL)和 Ubuntu 的新 Pacemaker HA 代理 v2。

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

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

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

  • 支持 TLS 1.3,以便在 Pacemaker 群集和 SQL Server 之间进行通信。

Pacemaker HA 代理 v2 目前为预览版。 现有的 Pacemaker HA 代理(v1)继续获得全面支持,适用于生产环境中的部署。

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 服务中的任意一个停止运行,可用性组故障转移操作将无法按预期工作。

Note

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;
    
  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 资源不会删除该可用性组。 重新创建资源后,Pacemaker 会自动恢复管理和 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 资源的名称。