在 Windows 和 Linux 上配置 SQL Server AlwaysOn 可用性组(跨平台)

适用于: SQL Server 2017 (14.x) 及更高版本

本文介绍后述操作的步骤:创建“Always On 可用性组 (AG)”,且一个副本在 Windows 服务器上,另一个副本在 Linux 服务器上。

重要

SQL Server 跨平台可用性组(包括具有完整高可用性和灾难恢复支持的异类副本)随 DH2i DxEnterprise 一起提供。 有关详细信息,请参阅具有混合操作系统的 SQL Server 可用性组

观看以下视频,了解 DH2i 的跨平台可用性组。

此配置是跨平台的,因为副本在不同的操作系统上。 使用此配置从一个平台迁移到另一个平台或实现灾难恢复 (DR)。 此配置不支持高可用性。

群集类型为“None”的可用性组示意图。

在继续之前,应熟悉 Windows 和 Linux 上 SQL Server 实例的安装和配置。

场景

在此方案中,两台服务器使用不同的操作系统。 名为 WinSQLInstance 的 Windows Server 2022 承载主副本。 名为 LinuxSQLInstance 的 Linux 服务器承载次要副本。

配置 AG

创建 AG 的步骤与为“读取缩放”工作负载创建 AG 的步骤相同。 由于没有群集管理器,AG 群集类型为 NONE。

注意

对于本文中的脚本,尖括号 <> 用于标识需要为环境替换的值。 脚本不需要尖括号。

  1. 在 Windows Server 2022 上安装 SQL Server 2022 (16.x),从 SQL Server 配置管理器启用 Always On 可用性组,并设置混合模式身份验证。

    提示

    如果要在 Azure 中验证此解决方案,请将两个服务器放在同一可用性集中,并确保它们在数据中心中相互独立。

    启用可用性组

    有关详细信息,请参阅启用和禁用 AlwaysOn 可用性组 (SQL Server)

    显示如何启用可用性组的屏幕截图。

    SQL Server 配置管理器指出计算机不是故障转移群集中的节点。

    启用可用性组后,重新启动 SQL Server。

    设置混合模式身份验证

    如需相关说明,请参阅更改服务器身份验证模式

  2. 在 Linux 上安装 SQL Server 2022 (16.x)。 有关说明,请参阅安装 SQL Server。 使用 mssql-conf 启用 hadr

    要从 shell 提示符通过 mssql-conf 启用 hadr,请发出以下命令:

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

    启用 hadr 后,重启 SQL Server 实例:

    sudo systemctl restart mssql-server.service
    
  3. 同时在两台服务器上配置 hosts 文件或向 DNS 注册服务器名称。

  4. 同时在 Windows 和 Linux 上为 TCP 1433 和 5022 打开防火墙端口。

  5. 在主副本上,创建数据库登录名和密码。

    CREATE LOGIN dbm_login WITH PASSWORD = '<C0m9L3xP@55w0rd!>';
    CREATE USER dbm_user FOR LOGIN dbm_login;
    GO
    
  6. 在主副本上,创建主密钥和证书,然后使用私钥备份证书。

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<C0m9L3xP@55w0rd!>';
    CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
    BACKUP CERTIFICATE dbm_certificate
    TO FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\dbm_certificate.cer'
    WITH PRIVATE KEY (
            FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\dbm_certificate.pvk',
            ENCRYPTION BY PASSWORD = '<C0m9L3xP@55w0rd!>'
        );
    GO
    
  7. 将证书和私钥复制到 Linux 服务器(次要副本)的 /var/opt/mssql/data 处。 可以使用 pscp 将文件复制到 Linux 服务器。

  8. 将私钥和证书的组和所有权设置为 mssql:mssql

    以下脚本设置文件的组和所有权。

    sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.pvk
    sudo chown mssql:mssql /var/opt/mssql/data/dbm_certificate.cer
    

    下图中为证书和密钥正确设置了所有权和组。

    Git Bash 窗口的屏幕截图,其中显示 /var/opt/mssql/data 文件夹中的 .cer 和 .pvk。

  9. 在次要副本上,创建数据库登录名和密码并创建主密钥。

    CREATE LOGIN dbm_login WITH PASSWORD = '<C0m9L3xP@55w0rd!>';
    CREATE USER dbm_user FOR LOGIN dbm_login;
    GO
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<M@st3rKeyP@55w0rD!>'
    GO
    
  10. 在次要副本上,还原复制到 /var/opt/mssql/data 的证书。

    CREATE CERTIFICATE dbm_certificate
        AUTHORIZATION dbm_user
        FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
        WITH PRIVATE KEY (
        FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
        DECRYPTION BY PASSWORD = '<C0m9L3xP@55w0rd!>'
    )
    GO
    
  11. 在主副本上,创建终结点。

    CREATE ENDPOINT [Hadr_endpoint]
        AS TCP (LISTENER_IP = (0.0.0.0), LISTENER_PORT = 5022)
        FOR DATA_MIRRORING (
            ROLE = ALL,
            AUTHENTICATION = CERTIFICATE dbm_certificate,
            ENCRYPTION = REQUIRED ALGORITHM AES
            );
    ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
    GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login];
    GO
    

    重要

    必须为侦听器 TCP 端口打开防火墙。 在上面的脚本中,端口是 5022。 使用任何可用的 TCP 端口。

  12. 在次要副本上,创建终结点。 在次要副本上重复上述脚本以创建端点。

  13. 在主副本上,使用 CLUSTER_TYPE = NONE 创建 AG。 示例脚本使用 SEEDING_MODE = AUTOMATIC 创建 AG。

    注意

    当 SQL Server 的 Windows 实例对数据和日志文件使用不同的路径时,SQL Server 的 Linux 实例的自动种子设定会失败,因为这些路径在次要副本上不存在。 若要对跨平台 AG 使用以下脚本,数据库要求数据和日志文件在 Windows 服务器上具有相同的路径。 或者,还可以更新脚本以设置 SEEDING_MODE = MANUAL,然后使用 NORECOVERY 备份和还原数据库,从而为数据库设定种子。

    此行为适用于 Azure Marketplace 映像。

    有关自动种子设定的详细信息,请参阅自动种子设定 - Disk Layout

    在运行脚本之前,请更新 AG 的值。

    • <WinSQLInstance> 替换为主副本 SQL Server 实例的服务器名称。

    • <LinuxSQLInstance> 替换为次要副本 SQL Server 实例的服务器名称。

    若要创建 AG,请更新值并在主副本上运行脚本。

    CREATE AVAILABILITY
    GROUP [ag1]
    WITH (CLUSTER_TYPE = NONE)
    FOR REPLICA
        ON N'<WinSQLInstance>'
    WITH (
        ENDPOINT_URL = N'tcp://<WinSQLInstance>:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        SEEDING_MODE = AUTOMATIC,
        FAILOVER_MODE = MANUAL,
        SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)
        ),
        N'<LinuxSQLInstance>'
    WITH (
        ENDPOINT_URL = N'tcp://<LinuxSQLInstance>:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        SEEDING_MODE = AUTOMATIC,
        FAILOVER_MODE = MANUAL,
        SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL);
        )
    GO
    

    有关详细信息,请参阅 CREATE AVAILABILITY GROUP (Transact-SQL)

  14. 在次要副本上,联接 AG。

    ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);
    ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
    GO
    
  15. 为 AG 创建数据库。 示例步骤使用名为 TestDB 的数据库。 如果使用自动种子设定,请为数据和日志文件设置相同的路径。

    在运行脚本之前,请更新数据库的值。

    • TestDB 替换为数据库的名称。

    • <F:\Path> 替换为数据库和日志文件的路径。 为数据库和日志文件使用相同的路径。

    也可以使用默认路径。

    若要创建数据库,请运行该脚本。

    CREATE DATABASE [TestDB]
       CONTAINMENT = NONE
      ON  PRIMARY ( NAME = N'TestDB', FILENAME = N'<F:\Path>\TestDB.mdf')
      LOG ON ( NAME = N'TestDB_log', FILENAME = N'<F:\Path>\TestDB_log.ldf');
    GO
    
  16. 完整备份数据库。

  17. 如果不使用自动种子设定,请在次要副本 (Linux) 服务器上还原数据库。 使用备份和还原将 SQL Server 数据库从 Windows 迁移到 Linux。 在次要副本上还原数据库 WITH NORECOVERY

  18. 将数据库添加到 AG。 更新示例脚本。 将 TestDB 替换为数据库的名称。 在主要副本上,运行 T-SQL 查询以将数据库添加到 AG。

    ALTER AG [ag1] ADD DATABASE TestDB;
    GO
    
  19. 验证是否在次要副本上填充了数据库。

故障转移主副本

每个可用性组仅有一个主要副本。 主要副本允许读取和写入操作。 若要更改哪个副本为主要副本,可进行故障转移。 在典型的可用性组中,群集管理器自动执行故障转移过程。 在群集类型为 NONE 的可用性组中,需手动执行故障转移过程。

在群集类型为 NONE 的可用性组中,有两种对主要副本进行故障转移的方法:

  • 手动故障转移(无数据丢失)
  • 强制手动故障转移(会丢失数据)

手动故障转移(无数据丢失)

主要副本可用时使用此方法,但你需要暂时或永久更改托管主要副本的实例。 若要避免潜在的数据丢失,发出手动故障转移前,确保目标次要副本为最新版本。

手动故障转移(无数据丢失):

  1. 将当前的主要副本和目标次要副本设置为 SYNCHRONOUS_COMMIT

    ALTER AVAILABILITY GROUP [AGRScale] 
         MODIFY REPLICA ON N'<node2>' 
         WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
    
  2. 若要确定已将活动事务提交到主要副本和至少一个同步次要副本,请运行以下查询:

    SELECT ag.name, 
       drs.database_id, 
       drs.group_id, 
       drs.replica_id, 
       drs.synchronization_state_desc, 
       ag.sequence_number
    FROM sys.dm_hadr_database_replica_states drs, sys.availability_groups ag
    WHERE drs.group_id = ag.group_id; 
    

    synchronization_state_descSYNCHRONIZED 时,会同步次要副本。

  3. REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 更新为 1。

    以下脚本在名为 ag1 的可用性组上将 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 设置为 1。 运行以下脚本前,将 ag1 替换为可用性组的名称:

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    

    此设置可确保将每个活动事务提交到主要副本和至少一个同步次要副本。

    注意

    此设置并非特定于故障转移,应根据环境要求进行设置。

  4. 将主要副本和不参与故障转移的次要副本设置为脱机,以便为角色更改做好准备:

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 将目标次要副本升级为主要副本。

    ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    
  6. 将旧的主要和其他次要副本的角色更新为 SECONDARY,在托管旧的主要副本的 SQL Server 实例上运行以下命令:

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (ROLE = SECONDARY); 
    

    注意

    若要删除可用性组,请使用删除可用性组。 对于使用群集类型为 NONE 或 EXTERNAL 创建的可用性组,请对可用性组的所有副本执行该命令。

  7. 恢复数据移动,为托管主要副本的 SQL Server 实例上的可用性组中的每个数据库运行以下命令:

    ALTER DATABASE [db1]
         SET HADR RESUME
    
  8. 重新创建出于读取缩放目的创建且不受群集管理器管理的所有侦听器。 如果原始侦听器指向旧的主要副本,请将其删除,然后将其重新创建为指向新的主要副本。

强制手动故障转移(会丢失数据)

如果主要副本不可用且无法立即恢复,则需要强制执行向次要副本的故障转移(存在数据丢失)。 但是,如果原始主要副本在故障转移后恢复,它将承担主要角色。 若要避免每个副本处于不同的状态,在存在数据丢失的情况下进行强制故障转移后,从可用性组中删除原始主要副本。 原始主要副本重新联机后,从该副本完全删除该可用性组。

若要强制执行从主要副本 N1 到次要副本 N2 的手动故障转移(存在数据丢失),请执行以下步骤:

  1. 在次要副本 (N2) 上,启动强制故障转移:

    ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;
    
  2. 在新的主要副本 (N2) 上,删除原始主要副本 (N1):

    ALTER AVAILABILITY GROUP [AGRScale]
    REMOVE REPLICA ON N'N1';
    
  3. 验证所有的应用程序流量均指向侦听器和/或新的主要副本。

  4. 如果原始主要副本 (N1) 进入联机状态,则立即在原始主要副本 (N1) 上使可用性组 AGRScale 脱机:

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 如果存在数据或未同步的更改,则通过备份或其他可满足业务需求的数据复制选项来保存这些数据。

  6. 接下来,从原始主要副本 (N1) 中删除可用性组:

    DROP AVAILABILITY GROUP [AGRScale];
    
  7. 删除原始主要副本 (N1) 上的可用性组数据库:

    USE [master]
    GO
    DROP DATABASE [AGDBRScale]
    GO
    
  8. (可选)如果需要,现可将 N1 作为新的次要副本添加回可用性组 AGRScale 中。

本文回顾了创建跨平台 AG 以支持迁移或“读取缩放”工作负荷的步骤。 它可用于手动灾难恢复。 还介绍了如何对 AG 进行故障转移。 跨平台 AG 使用群集类型 NONE,不支持高可用性。