练习 - 具有读取缩放的异地分布自动故障转移组

已完成

在上一单元中,你了解了异地复制和自动故障转移组。 本练习将为 Azure SQL 数据库配置自动故障转移组。 然后,将启动故障转移并查看结果。

Azure SQL 中的自动故障转移组

若要为一个或多个数据库配置自动故障转移组并查看结果,需要完成以下步骤:

  1. 配置环境。
  2. 在故障转移区域中创建空的 Azure SQL 数据库服务器。
  3. 在服务器之间创建故障转移组。
  4. 配置网络。
  5. 将一个或多个数据库添加到故障转移组。
  6. 配置命令提示符应用程序。
  7. 了解正在运行的应用程序。
  8. 启动故障转移。
  9. 恢复故障。

本练习将引导你为 AdventureWorks 数据库配置自动故障转移组。 然后,使用简单的命令行应用程序来了解读写操作发生的位置,以及重试逻辑在应用程序中的重要性。 最后,完成一项趣味练习,确定与同样具有自动故障转移组的业务关键数据库相关联的只读副本的数量。

配置环境

  1. 将以下代码复制到记事本或其他文本编辑器。 提供你的信息。 添加 SQL 身份验证密码。 对于 $drLocation,请提供一个区域,该区域是你希望故障转移组所在的区域。 最好是选择与你的当前服务器所在区域配对的区域。 可以查看配对区域列表。 至少不能是原始数据库所在的区域。 最后,添加本地计算机的 IP 地址。 如果需要确定 IP 地址,请在本地计算机上打开 PowerShell 并运行 (Invoke-WebRequest -Uri "https://ipinfo.io/ip").Content

    # Add your info
    $password = "password"
    $drLocation = "westus2"
    $ipAddress = "xx.xx.xx.xx"
    
  2. 在 Azure Cloud Shell 中运行更新的命令(在此页的右侧)。

  3. 在 Azure Cloud Shell 中运行以下脚本,为后续步骤配置变量:

    $admin = "cloudadmin"
    $resourceGroup = Get-AzResourceGroup | Where ResourceGroupName -like <rgn>Sandbox resource group name</rgn>
    $location = $resourceGroup.Location
    $resourceGroup = $resourceGroup.ResourceGroupName
    $database = "AdventureWorks"
    $server = Get-AzureRmSqlServer -ResourceGroupName $resourceGroup
    $server = $server.ServerName
    $drServer = "$($server)-dr"
    $failoverGroup = "$($server)-fg"
    $firewallRule = "AllowMyIp"
    Write-Host "Variables Received"
    
  4. 在 Azure Cloud Shell 中运行以下脚本,在故障转移区域中创建空的 Azure SQL 数据库服务器:

    # Create a backup server in the failover region
    New-AzSqlServer -ResourceGroupName $resourceGroup `
        -ServerName $drServer `
        -Location $drLocation `
        -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential `
        -ArgumentList $admin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))
    Write-Host "New Azure SQL Database logical server Created in different region"
    
  5. 在 Azure Cloud Shell 中运行以下脚本,在服务器之间创建故障转移组:

    # Create a failover group between the servers
    New-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
        -ServerName $server `
        -PartnerServerName $drServer `
        -FailoverGroupName $failoverGroup 
    Write-Host "New auto-failover group created between the two Azure SQL Database logical servers"
    
  6. 在 Azure Cloud Shell 中运行以下脚本,以配置网络:

    # Add a firewall rule that gives your VM access to the new server
    New-AzSqlServerFirewallRule -ResourceGroupName $resourceGroup `
        -ServerName $drServer `
        -FirewallRuleName $firewallRule `
        -StartIpAddress $ipAddress `
        -EndIpAddress $ipAddress;
    

    出于演示自动故障转移组的目的,此网络设置已经足够。 这与在企业环境中执行的操作略有不同。 在企业环境中,需要访问权限的计算机很可能是构成某种类型的应用程序的一组资源。 如果数据库发生故障转移,你可能还希望将应用程序、VM、其他资源故障转移到该新区域。 两组资源都需要访问其他区域中的资源、服务器和数据库。 为此,可以使用虚拟网络对等互联、虚拟网络与虚拟网络的连接或其他可行方式(例如 Azure ExpressRoute)。 这取决于你的场景。

  7. 在 Azure Cloud Shell 中运行以下脚本,将一个或多个数据库添加到故障转移组:

    # Add the database or databases to the failover group
    Get-AzSqlDatabase -ResourceGroupName $resourceGroup `
        -ServerName $server -DatabaseName $database | `
        Add-AzSqlDatabaseToFailoverGroup -ResourceGroupName $resourceGroup `
        -ServerName $server `
        -FailoverGroupName $failoverGroup
    Write-Host "AdventureWorks database added to the auto-failover group"
    

    运行此脚本需要一段时间。 你正在还原另一个区域中的数据库,这涉及将数据从原始区域复制到灾难恢复区域。 可以按照下一节中的步骤进行操作,然后返回查看以下脚本是否已完成。

现已为 AdventureWorks 数据库部署并配置了自动故障转移组。

配置命令提示符应用程序

在本节中,你将使用两个 ostress 工作负载来检查故障转移组中主服务器和辅助服务器的 Updateability(无论数据库处于 ReadWrite 还是 ReadOnly 状态)。 此方案旨在模拟具有读写工作负载的应用程序。

  1. 打开两个单独的命令提示符窗口。 设置窗口,以便你可以看到此窗口(浏览器)和两个命令提示符窗口。

  2. 在两个命令提示符中,像在之前的练习中一样转到 Availability 文件夹。 例如,可以使用以下命令:

    cd C:\Users\username\mslearn-azure-sql-fundamentals\05-Availability
    
  3. 你将使用第一个命令提示符窗口检查创建的故障转移组中主服务器的状态。 使用服务器名称和密码运行以下命令:

    .\ostress.exe -S"<server-name>-fg.database.windows.net" -Q"SELECT DATABASEPROPERTYEX(DB_NAME(),'Updateability')" -U"cloudadmin" -d"AdventureWorks" -P"password" -n1 -r5000 -oprimary
    

    备注

    使用自动故障转移组,可以连接到故障转移组名称,即数据库的抽象。

  4. 你将使用第二个命令提示符窗口检查创建的故障转移组中辅助服务器的状态。 使用服务器名称和密码运行以下命令:

    ostress.exe -S"<server-name>-fg.secondary.database.windows.net" -Q"SELECT DATABASEPROPERTYEX(DB_NAME(),'Updateability')" -U"cloudadmin" -d"AdventureWorks" -P"password" -n1 -r5000 -osecondary
    

第一个命令的结果应为 READ_WRITE,因为它检查主要故障转移组服务器,而你尚未启动任何故障转移。

第二个命令的结果应为 READ_ONLY,因为它检查你配置的灾难恢复或辅助服务器。 在任何指定时间,你都应只能从一台服务器进行写入。

后续步骤将介绍发生故障转移时两台服务器会发生什么情况。

启动故障转移并查看结果

  1. 使用此页面右侧的 Azure Cloud Shell 终端来检查辅助服务器的状态:

    (Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
        -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
    

    结果会指明自动故障转移组中的辅助服务器是用作主数据库还是辅助数据库。

  2. 你现在可以看到发生故障转移时会发生什么情况。 通过在 Azure Cloud Shell 终端中输入以下 Azure PowerShell 命令来启动手动故障转移:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    

    发生故障转移时,你可能会注意到连接暂时断开,但由于应用不断重试,应用程序不会完全发生故障。 故障转移完成后,你应注意到 READ_WRITEREAD_ONLY 结果将恢复,且两者不会更改。

    Azure SQL 数据库和 Azure SQL 托管实例中的自动故障转移组的一大好处在于,无需在故障转移后更新连接字符串。 可以继续连接到面向写入工作负载的主服务器 (<failover-group>.database.windows.net),以及面向读取工作负载的辅助服务器 (<failover-group>.secondary.database.windows.net)。 Azure 将负责将你路由到相应区域/服务器中的相应数据库。

  3. 在 Azure Cloud Shell 中运行以下脚本,检查辅助服务器的状态:

    (Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
        -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
    

    此服务器现在应为主要角色。

  4. 在 Azure Cloud Shell 中运行以下脚本,进行故障恢复:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $server -FailoverGroupName $failoverGroup
    
  5. 最后,再次检查辅助服务器的状态。 在 Azure Cloud Shell 中运行以下脚本:

    (Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
        -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
    
  6. 现在,你可以关闭两个命令提示符窗口,并最大化 Microsoft Learn 浏览器窗口。

在此练习中,你学习了如何部署和配置自动故障转移组。 还从应用程序的角度了解了这种操作的意义。 自动故障转移组只是进一步了解 Azure SQL 中的可用性和读取缩放的一种方式。