Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
大型分布式系统,例如云基础结构,在本质上都是不可靠的。 Azure Service Fabric 使开发人员能够编写出可以在不可靠基础结构上运行的服务。 若要编写高质量的服务,开发人员需要能够引入这种不可靠的基础结构来测试其服务的稳定性。
故障分析服务使开发人员能够引入故障操作,在存在故障的情况下测试服务。 但是,目标模拟故障仅使你能够达到此目的。 若要进一步测试,可以使用 Service Fabric 中的测试方案:混沌测试和故障转移测试。 这些方案在整个群集模拟连续交叉出现的故障,包括常规故障和非常规故障,时间跨度很长。 使用速率参数和故障类型配置测试后,可以通过 C# API 或 PowerShell 启动该测试,以在群集和服务中触发故障。
警告
ChaosTestScenario 被更易复原、基于服务的混沌取代。 有关更多详细信息,请参阅新文章 受控混沌 。
混沌测试
整个 Service Fabric 群集中的混沌情景会生成故障。 此方案将几个月或几年内出现的故障压缩为数小时。 交错故障结合高故障率,可以找出可能会被忽视的边界情况。 这会使服务的代码质量得到显著提高。
在混沌测试中模拟的故障
- 重新启动节点
- 重新启动已部署的代码包
- 删除副本
- 重新启动副本
- 移动主副本(可选)
- 移动辅助副本(可选)
混沌测试在指定时间段内运行故障和群集验证的多次循环。 让群集达到稳定状态以及验证成功所用的时间也是可配置的。 如果在验证群集时遇到一次故障,则方案失败。
例如,考虑一个运行一小时、最多容许三个同时发生故障的测试集。 测试会引发三个故障,然后验证群集运行状况。 测试重复之前的步骤,直到集群变得不正常或者经过一小时。 如果群集在任何迭代中运行不正常,也就是说,它不会在配置的时间内稳定下来,则测试会失败并出现异常。 此异常指出系统出现问题,并且需要进一步调查。
当前形式下,混沌测试故障生成引擎只引入安全故障。 这意味着在没有外部故障的情况下,绝对不会出现仲裁丢失或数据丢失。
重要的配置选项
- TimeToRun:测试在成功完成之前运行的总时间。 测试也可以提前完成来代替验证失败。
- MaxClusterStabilizationTimeout:在测试失败之前,等待群集变得正常的最长时间。 执行的检查包括群集运行状况是否正常、服务运行状况是否正常、对于服务分区而言目标副本集是否达到设定的大小以及是否不存在 InBuild 副本。
- MaxConcurrentFaults:每次循环中并发故障的最大数量。 数字越大,测试越激烈,因此故障转移和过渡组合会更加复杂。 测试保证,在没有外部故障的情况下,不会发生法定人数或数据丢失,无论此配置设置多高。
- EnableMoveReplicaFaults:启用或禁用导致主副本或辅助副本移动的故障。 默认情况下,这些故障处于禁用状态。
- WaitTimeBetweenIterations:迭代轮次之间的等待时间,即在一轮故障及相应验证之后的等待。
如何运行混沌测试
C# 示例
using System;
using System.Fabric;
using System.Fabric.Testability.Scenario;
using System.Threading;
using System.Threading.Tasks;
class Test
{
public static int Main(string[] args)
{
string clusterConnection = "localhost:19000";
Console.WriteLine("Starting Chaos Test Scenario...");
try
{
RunChaosTestScenarioAsync(clusterConnection).Wait();
}
catch (AggregateException ae)
{
Console.WriteLine("Chaos Test Scenario did not complete: ");
foreach (Exception ex in ae.InnerExceptions)
{
if (ex is FabricException)
{
Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
}
}
return -1;
}
Console.WriteLine("Chaos Test Scenario completed.");
return 0;
}
static async Task RunChaosTestScenarioAsync(string clusterConnection)
{
TimeSpan maxClusterStabilizationTimeout = TimeSpan.FromSeconds(180);
uint maxConcurrentFaults = 3;
bool enableMoveReplicaFaults = true;
// Create FabricClient with connection and security information here.
FabricClient fabricClient = new FabricClient(clusterConnection);
// The chaos test scenario should run at least 60 minutes or until it fails.
TimeSpan timeToRun = TimeSpan.FromMinutes(60);
ChaosTestScenarioParameters scenarioParameters = new ChaosTestScenarioParameters(
maxClusterStabilizationTimeout,
maxConcurrentFaults,
enableMoveReplicaFaults,
timeToRun);
// Other related parameters:
// Pause between two iterations for a random duration bound by this value.
// scenarioParameters.WaitTimeBetweenIterations = TimeSpan.FromSeconds(30);
// Pause between concurrent actions for a random duration bound by this value.
// scenarioParameters.WaitTimeBetweenFaults = TimeSpan.FromSeconds(10);
// Create the scenario class and execute it asynchronously.
ChaosTestScenario chaosScenario = new ChaosTestScenario(fabricClient, scenarioParameters);
try
{
await chaosScenario.ExecuteAsync(CancellationToken.None);
}
catch (AggregateException ae)
{
throw ae.InnerException;
}
}
}
PowerShell
Service Fabric PowerShell 模块包括两种开始混乱方案的方法。
Invoke-ServiceFabricChaosTestScenario 是基于客户端的,如果客户端计算机在测试中途关闭,则不会引入进一步的错误。 或者,有一组命令旨在使测试在计算机关闭时保持运行。
Start-ServiceFabricChaos 使用名为 FaultAnalysisService 的有状态可靠系统服务,确保故障持续存在直至 TimeToRun 结束。
Stop-ServiceFabricChaos 可用于手动停止场景,Get-ServiceFabricChaosReport 将获取报表。 有关详细信息,请参阅 Azure Service Fabric PowerShell 参考 和 在 Service Fabric 群集中引发受控混乱。
$connection = "localhost:19000"
$timeToRun = 60
$maxStabilizationTimeSecs = 180
$concurrentFaults = 3
$waitTimeBetweenIterationsSec = 60
Connect-ServiceFabricCluster $connection
Invoke-ServiceFabricChaosTestScenario -TimeToRunMinute $timeToRun -MaxClusterStabilizationTimeoutSec $maxStabilizationTimeSecs -MaxConcurrentFaults $concurrentFaults -EnableMoveReplicaFaults -WaitTimeBetweenIterationsSec $waitTimeBetweenIterationsSec
故障转移测试
故障转移测试方案是针对特定服务分区的混沌测试方案的一个变体。 它在特定服务分区上测试故障转移的效果,同时让其他服务不受影响。 一旦配置好目标分区信息和其他参数,它就可以作为一个客户端工具运行,使用 C# API 或 PowerShell 生成针对一个服务分区的故障。 该方案遍历一系列的模拟故障和服务验证过程,同时业务逻辑并行运行以提供工作负荷。 服务验证失败指出存在需要进一步调查的问题。
在故障转移测试中模拟的故障
- 重新启动分区所在的已部署代码包
- 删除主要/次要副本或无状态实例
- 重新启动主/辅助副本(如果是持久化服务)
- 移动主副本
- 移动次要副本
- 重新启动分区
故障转移测试会引发一个特定的故障,然后在服务上运行测试以确保其稳定性。 与混沌测试中可能出现多个故障相比,故障转移测试一次仅引入一个故障。 如果服务分区在每次故障后配置超时内未稳定,测试将失败。 测试只引发安全故障。 这意味着,如果没有外部故障,则不会发生法定人数或数据丢失。
重要的配置选项
- PartitionSelector:选择器对象,指定需要作为目标的分区。
- TimeToRun:测试在完成之前将要运行的总时间。
- MaxServiceStabilizationTimeout:在测试失败之前,等待群集变得正常的最长时间。 执行的检查包括服务运行状况是否正常、对于所有分区而言目标副本集是否达到设定的大小以及是否不存在 InBuild 副本。
- WaitTimeBetweenFaults:每次故障和验证循环之间等待的时间量。
如何运行故障转移测试
C#
using System;
using System.Fabric;
using System.Fabric.Testability.Scenario;
using System.Threading;
using System.Threading.Tasks;
class Test
{
public static int Main(string[] args)
{
string clusterConnection = "localhost:19000";
Uri serviceName = new Uri("fabric:/samples/PersistentToDoListApp/PersistentToDoListService");
Console.WriteLine("Starting Chaos Test Scenario...");
try
{
RunFailoverTestScenarioAsync(clusterConnection, serviceName).Wait();
}
catch (AggregateException ae)
{
Console.WriteLine("Chaos Test Scenario did not complete: ");
foreach (Exception ex in ae.InnerExceptions)
{
if (ex is FabricException)
{
Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
}
}
return -1;
}
Console.WriteLine("Chaos Test Scenario completed.");
return 0;
}
static async Task RunFailoverTestScenarioAsync(string clusterConnection, Uri serviceName)
{
TimeSpan maxServiceStabilizationTimeout = TimeSpan.FromSeconds(180);
PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);
// Create FabricClient with connection and security information here.
FabricClient fabricClient = new FabricClient(clusterConnection);
// The chaos test scenario should run at least 60 minutes or until it fails.
TimeSpan timeToRun = TimeSpan.FromMinutes(60);
FailoverTestScenarioParameters scenarioParameters = new FailoverTestScenarioParameters(
randomPartitionSelector,
timeToRun,
maxServiceStabilizationTimeout);
// Other related parameters:
// Pause between two iterations for a random duration bound by this value.
// scenarioParameters.WaitTimeBetweenIterations = TimeSpan.FromSeconds(30);
// Pause between concurrent actions for a random duration bound by this value.
// scenarioParameters.WaitTimeBetweenFaults = TimeSpan.FromSeconds(10);
// Create the scenario class and execute it asynchronously.
FailoverTestScenario failoverScenario = new FailoverTestScenario(fabricClient, scenarioParameters);
try
{
await failoverScenario.ExecuteAsync(CancellationToken.None);
}
catch (AggregateException ae)
{
throw ae.InnerException;
}
}
}
PowerShell
$connection = "localhost:19000"
$timeToRun = 60
$maxStabilizationTimeSecs = 180
$waitTimeBetweenFaultsSec = 10
$serviceName = "fabric:/SampleApp/SampleService"
Connect-ServiceFabricCluster $connection
Invoke-ServiceFabricFailoverTestScenario -TimeToRunMinute $timeToRun -MaxServiceStabilizationTimeoutSec $maxStabilizationTimeSecs -WaitTimeBetweenFaultsSec $waitTimeBetweenFaultsSec -ServiceName $serviceName -PartitionKindSingleton