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

适用于:SQL Server - Linux

本教程介绍如何为 Linux 上的 SQL Server 创建和配置可用性组 (AG)。 与 Windows 上的 SQL Server 2016 (13.x) 及更早版本不同,可以在创建或不创建基础 Pacemaker 群集的情况下启用 AG。 如果需要,稍后才会与群集进行集成。

本教程包括以下任务:

  • 启用可用性组。
  • 创建可用性组终结点和证书。
  • 使用 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 实用程序,或手动编辑 mssql.conf 文件。

重要

必须为仅配置副本启用 AG 功能,即使在 SQL Server Express 上也是如此。

使用 mssql-conf 实用程序

出现提示时,请发出以下命令:

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

编辑 mssql.conf 文件

还可以修改位于 /var/opt/mssql 文件夹下的 mssql.conf 文件,以添加以下行:

[hadr]

hadr.hadrenabled = 1

重启 SQL Server

启用可用性组后,与在 Windows 中一样,必须使用以下命令重启 SQL Server:

sudo systemctl restart mssql-server

创建可用性组终结点和证书

可用性组使用 TCP 终结点进行通信。 在 Linux 下,仅当证书用于身份验证时,才支持 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 = '<StrongPassword>';
    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 = '<StrongPassword>';
    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 = '<StrongPassword>';
    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. LinAGN1 上创建与 LinAGN2LinAGN3 关联的实例级登录名和用户。

    CREATE LOGIN LinAGN2_Login WITH PASSWORD = '<StrongPassword>';
    CREATE USER LinAGN2_User FOR LOGIN LinAGN2_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login WITH PASSWORD = '<StrongPassword>';
    CREATE USER LinAGN3_User FOR LOGIN LinAGN3_Login;
    GO
    
  7. LinAGN1 上还原 LinAGN2_CertLinAGN3_Cert。 具有其他副本的证书是 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. 向与 LinAG2LinAGN3 关联的登录名授予连接到 LinAGN1 上的端点的权限。

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

    CREATE LOGIN LinAGN1_Login WITH PASSWORD = '<StrongPassword>';
    CREATE USER LinAGN1_User FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login WITH PASSWORD = '<StrongPassword>';
    CREATE USER LinAGN3_User FOR LOGIN LinAGN3_Login;
    GO
    
  10. LinAGN2 上还原 LinAGN1_CertLinAGN3_Cert

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

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

    CREATE LOGIN LinAGN1_Login WITH PASSWORD = '<StrongPassword>';
    CREATE USER LinAGN1_User FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN2_Login WITH PASSWORD = '<StrongPassword>';
    CREATE USER LinAGN2_User FOR LOGIN LinAGN2_Login;
    GO
    
  13. LinAGN3 上还原 LinAGN1_CertLinAGN2_Cert

    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;
    GO
    
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GO
    

创建可用性组

本文介绍如何使用 SQL Server Management Studio 或 Transact-SQL 以创建 SQL Server 的可用性组。

使用 SQL Server Management Studio

本部分介绍如何使用 SSMS 和新可用性组向导创建群集类型为“外部”的 AG。

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

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

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

    Screenshot of Create Availability Group showing cluster type.

  4. 在“选择数据库”对话框中,选择将参与 AG 的数据库。 每个数据库在添加到 AG 之前必须具有完整备份。 选择“下一步”。

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

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

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

  8. 现在应该在指定副本对话框中列出所有三个实例。 如果使用“外部”群集类型,对于真正的次要副本,请确保可用性模式与主副本的可用性模式匹配,并将故障转移模式设置为“外部”。 对于仅配置副本,请选择“仅配置”可用性模式。

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

    Screenshot of Create Availability Group showing the readable secondary option.

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

    Screenshot of Create Availability Group showing the Replicas page.

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

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

    Screenshot of Create Availability Group showing the listener option.

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

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

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

    3. 选择每个 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 是可用性组的名称。
    • DBName 是与可用性组一起使用的数据库的名称。 它也可以是以逗号分隔的名称列表。
    • ListenerName 是与任何基础服务器/节点均不同的名称。 它将与 IPAddress 一起在 DNS 中注册。
    • 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 是可用性组的名称。
  • DBName 是将与可用性组一起使用的数据库的名称。 它也可以是以逗号分隔的名称列表。
  • 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
  1. 将辅助副本联接到 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 实例的权限,以及可用性组本身的权限。 这些步骤用于创建登录和关联权限,以及指示 Pacemaker 如何登录 SQL Server 的文件。

  1. 在连接到第一个副本的查询窗口中,执行以下脚本:

    CREATE LOGIN PMLogin WITH PASSWORD ='<StrongPassword>';
    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
    
    <StrongPassword>
    
  4. 按住 Ctrl 键,再按 X,然后按 C 退出并保存文件。

  5. 执行

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

    锁定文件。

  6. 在充当副本的其他服务器上重复步骤 1-5。

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

在 SQL Server 中创建可用性组后,如果指定了“外部”群集类型,则必须在 Pacemaker 中创建相应的资源。 与 AG 关联的资源有两个:AG 本身和 IP 地址。 如果不使用侦听器功能,则 IP 地址资源配置是可选的,但建议这样做。

创建的 AG 资源是一种特殊的资源,称为“克隆”。 该 AG 资源基本上在每个节点上都有副本,并且有一个控制资源称为“master”。 master 与承载主副本的服务器相关联。 其他资源承载次要副本(常规副本或仅配置副本),并且可以在故障转移时提升为主副本。

注意

无偏差通信

本文包含对术语“从属”的引用,Microsoft 认为该术语在此上下文中存在冒犯性。 本文使用该术语的原因是,当前软件中存在该术语。 在从软件中删除该术语后,我们会将其从本文中删除。

  1. 用以下语法创建 AG 资源:

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

    其中 NameForAGResource 是针对 AG 而为该群集资源指定的唯一名称,AGName 是已创建的 AG 的名称。

    在 RHEL 7.7 和 Ubuntu 18.04 及更高版本中,可能会在使用 --master 时遇到一个警告,或者类似于 sqlag_monitor_0 on ag1 'not configured' (6): call=6, status=complete, exitreason='Resource must be configured with notify=true' 的错误。 要避免这种情况,请使用以下方法:

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s master notify=true
    
  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> <NameForAGResource>-master INFINITY with-rsc-role=Master
    

    其中 NameForIPResource 是 IP 资源的名称,NameForAGResource 是 AG 资源的名称。

  4. 创建排序约束以确保 AG 资源在 IP 地址之前启动并运行。 虽然并置约束意味着排序约束,但这将强制执行它。

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

    其中 NameForIPResource 是 IP 资源的名称,NameForAGResource 是 AG 资源的名称。

下一步

在本教程中,你了解了如何为 Linux 上的 SQL Server 创建和配置可用性组。 你已了解如何执行以下操作:

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

对于大多数 AG 管理任务,包括升级和故障转移,请参阅: