注意:

在 OCI 上为 DR 部署 Microsoft SQL Server Distributed Always On 可用性组

简介

Distributed Always On 可用性组(分布式可用性组)是 Microsoft SQL Server 中的一项强大功能,它扩展了 SQL Server 传统可用性组的功能。

通过分布式可用性组,您可以创建跨在不同 Oracle Cloud Infrastructure (OCI) 区域中运行的多个 Windows Server 故障转移集群 (WSFC) 的灾难恢复 (Disaster Recovery,DR) 解决方案。

这使您能够为在 OCI 上运行的关键 SQL Server 数据库实现更高级别的可用性、灾难恢复功能和地理分布。

本教程的排除项

在本教程中,我们将不介绍如何逐步创建单个 Microsoft SQL Server Always On 可用性组。有关详细信息,请参阅在 OCI 上为 HA 和 DR 部署 Microsoft SQL Server Always On 可用性组

请参阅以下官方 Microsoft 文档:

目标

先决条件

任务 1:创建分布式可用性组

创建分布式可用性组 (distributed-aoag),该组由两个已运行的 Always On 可用性组组成。

如前所述,我们假设两个独立的 Always On 可用性组已在两个不同的 OCI 区域中启动并运行。

第二个“始终可用”组 (marseille-aoag),即备用组,需要没有关联的数据库,因此在创建分布式可用性组之前,第二个“始终可用”组几乎需要为空,因此没有任何关联的可用性数据库。您可以像往常一样使用关联的初始数据库创建第二个“始终可用”组,之后可以删除仅用于创建第二个“始终可用”组的此数据库。这是因为图形界面无法创建与任何数据库关联的“始终可用”组。

  1. 在第一个“始终可用”组上创建分布式可用性组。

    连接到第一个服务器上的 SQL Server(本示例中为巴黎站点 sql-srv1 节点),然后运行以下 SQL 命令。

    注:

    • 监听程序名称为 paris-sql-listmars-sql-list

    • 要使用的 TCP 端口,5022 是端点的端口,必须使用。这通常与监听程序端口 (1433) 不同。

    • 可用性组名称必须正好是已运行的 Always On 可用性组使用的名称。

    USE MASTER;
    CREATE AVAILABILITY GROUP [distributed-aoag]  
       WITH (DISTRIBUTED)   
       AVAILABILITY GROUP ON  
          'paris-aoag' WITH    
          (   
             LISTENER_URL = 'tcp://paris-sql-list.acme.corp:5022',    
             AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
             FAILOVER_MODE = MANUAL,   
             SEEDING_MODE = AUTOMATIC   
          ),   
          'marseille-aoag' WITH    
          (   
             LISTENER_URL = 'tcp://mars-sql-list.acme.corp:5022',   
             AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
             FAILOVER_MODE = MANUAL,   
             SEEDING_MODE = AUTOMATIC   
          );    
    GO
    
  2. 加入第二个 Always On 可用性组上的分布式可用性组。

    连接到第二个 Always On 可用性组(Marseille 站点 sql-srv3 服务器)的第一个服务器上的 SQL Server,然后运行以下 SQL 命令。

    USE MASTER;
    ALTER AVAILABILITY GROUP [distributed-aoag]   
       JOIN   
       AVAILABILITY GROUP ON  
          'paris-aoag' WITH    
          (   
             LISTENER_URL = 'tcp://paris-sql-list.acme.corp:5022',    
             AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
             FAILOVER_MODE = MANUAL,   
             SEEDING_MODE = AUTOMATIC   
          ),   
          'marseille-aoag' WITH    
          (   
             LISTENER_URL = 'tcp://mars-sql-list.acme.corp:5022',   
             AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
             FAILOVER_MODE = MANUAL,   
             SEEDING_MODE = AUTOMATIC   
          );    
    GO 
    
  3. 与传统可用性组不同,分布式可用性组不需要 WSFC 中的资源组或角色,这一点非常重要。所有元数据都在 SQL Server 中进行管理。这意味着即使是 SQL Server Management Studio 也不会直接显示分布式可用性组中的数据库名称。

    要查看此信息,请运行以下 Transact-SQL 脚本。

    --View metadata and status of the Distributed Availability Group
    SELECT r.replica_server_name, r.endpoint_url,
    rs.connected_state_desc, rs.role_desc, rs.operational_state_desc,
    rs.recovery_health_desc,rs.synchronization_health_desc,
    r.availability_mode_desc, r.failover_mode_desc
    FROM sys.dm_hadr_availability_replica_states rs 
    INNER JOIN sys.availability_replicas r
    ON rs.replica_id=r.replica_id
    ORDER BY r.replica_server_name   
    

    图像

注:为了适应区域之间的潜在网络延迟,我们已使用异步提交复制配置了主和辅助 Always On 可用性组。这样可以最大限度地降低主数据库的性能开销。在每个 Always On 可用性组中,我们选择了在副本之间进行同步提交复制,以确保高可用性。但是,对于异步提交副本之间的故障转移(如果是分布式可用性组),减少数据丢失需要在启动故障转移之前临时切换到同步提交模式。对于 failover_mode,分布式可用性组的唯一可用模式是手动模式。

任务 2:分布式可用性组的故障转移过程

在本任务中,我们将讨论两个 Always On 可用性组之间的故障转移。数据库的故障转移过程由以下简单步骤和检查组成。

执行相应步骤:

  1. 运行以下脚本以检查同步是否正常,首先在当前主站点的当前主 SQL 上,然后在该次站点的主 SQL 上。

    执行的结果必须为 CONNECTED_STATE = CONNECTEDSYNCHRONIZATION_HEALTH = HEALTHY

    select ag.name, ag.is_distributed, ar.replica_server_name, ar.availability_mode_desc, ars.connected_state_desc, ars.role_desc, 
       ars.operational_state_desc, ars.synchronization_health_desc from sys.availability_groups ag  
       join sys.availability_replicas ar on ag.group_id=ar.group_id
       left join sys.dm_hadr_availability_replica_states ars
       on ars.replica_id=ar.replica_id
       where ag.is_distributed=1
    GO
    

    图像

    图像

  2. 更改可用性模式。首先在当前主站点的当前主 SQL Server 上运行以下脚本,然后在辅助站点的主 SQL Server 上运行。

    --Run this first on the primary replica of the primary AOAG and then again on the secondary AOAG
    USE MASTER;     
    ALTER AVAILABILITY GROUP [distributed-aoag]     
    MODIFY 
    AVAILABILITY GROUP ON
    'paris-aoag' WITH 
    ( 
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT 
    ), 
    'marseille-aoag' WITH     
    ( 
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT 
    );
    
  3. 要确保不丢失数据,请验证此步骤的结果。状态必须为 SYNCHRONIZED,对于全局主数据库和转发器上的每个数据库,last_hardened_lsn 应匹配。

    -- Run this query on the Global Primary and the forwarder
    -- Check the results to see if synchronization_state_desc is SYNCHRONIZED, and the last_hardened_lsn is the same per database on both the global primary and forwarder 
    -- If not rerun the query on both side every 5 seconds until it is the case
    --
    SELECT ag.name
             , drs.database_id
             , db_name(drs.database_id) as database_name
             , drs.group_id
             , drs.replica_id
             , drs.synchronization_state_desc
             , drs.last_hardened_lsn  
    FROM sys.dm_hadr_database_replica_states drs 
    INNER JOIN sys.availability_groups ag on drs.group_id = ag.group_id;
    

    图像

    图像

  4. 现在,您已准备好在当前主站点的当前主 SQL Server 上设置 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

    --Run this script into Primary AOAG
    USE MASTER;
    ALTER AVAILABILITY GROUP [distributed-aoag]
    SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    

    现在,您可以将主要“始终可用”组的角色从主要组更改为辅助组。

    --Run this script into Primary AOAG, this will terminate client applications connected to the primary replica of the primary AOAG
    USE MASTER;
    ALTER AVAILABILITY GROUP [distributed-aoag] SET (ROLE = SECONDARY);
    

    图像

  5. 将辅助 Always On 可用性组的角色从辅助组更改为主组。以下脚本将执行此角色更改,为数据库启用读取或写入操作。此外,分布式可用性组中 Always On 可用性组的角色也将相应更新。

    --Run this script into Secondary AOAG, this will terminate client applications connected to the primary replica of the primary AOAG
    ALTER AVAILABILITY GROUP [distributed-aoag] FORCE_FAILOVER_ALLOW_DATA_LOSS;
    

    运行以下脚本以检查状态。

    --check the status on the new primary (formerly standby site)
    select ag.name, ag.is_distributed, ar.replica_server_name, ar.availability_mode_desc, ars.connected_state_desc, ars.role_desc, 
       ars.operational_state_desc, ars.synchronization_health_desc from sys.availability_groups ag  
       join sys.availability_replicas ar on ag.group_id=ar.group_id
       left join sys.dm_hadr_availability_replica_states ars
       on ars.replica_id=ar.replica_id
       where ag.is_distributed=1
    GO
    

    图像

    图像

  6. 现在,在新的主 SQL Server 上,取消设置 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

    --Run this script into Primary AOAG
    ALTER AVAILABILITY GROUP [distributed-aoag] 
    SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);
    

    通过在主站点和辅助站点上运行以下脚本,将可用性模式改回标准模式。

    --Run this first on the primary replica of the primary AOAG and then again on the secondary AOAG
    ALTER AVAILABILITY GROUP [distributed-aoag]     
    MODIFY 
    AVAILABILITY GROUP ON
    'paris-aoag' WITH 
    ( 
       AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT 
    ), 
    'marseille-aoag' WITH     
    ( 
       AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT 
    );
    

任务 3:分布式 Always On 可用性组的故障恢复过程

要将巴黎恢复为主站点,将马赛恢复为辅助站点,只需执行新的切换以逆转同步,如任务 2 中所述。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心