2017-02-03 10 views
0

서비스 패브릭과 함께 제공되는 카오스 테스트 기능을 사용하려고합니다. 문서에 설명 된대로 코드를 설정했습니다. https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-controlled-chaosStartChaosAsync 메서드를 실행하면 서비스 패브릭 클러스터에 아무런 영향을 미치지 않는 것 같습니다.

발생하는 문제는 클러스터에 표시되는 오류 이벤트가 거의 볼 수 없다는 것입니다. 다음은 혼돈 샘플 코드를 실행하는 콘솔 출력의 예입니다.

[StartedEvent], Timestamp=03/02/2017 16:32:21 
 
ChaosParameters: maxClusterStabilizationTimeout=00:00:30, waitTimeBetweenFaults=00:00:20, waitTimeBetweenIterations=00:00:30, maxConcurrentFaults=3, timeToRun=01:00:00, enableMoveReplicas=True, Context: 
 
ClusterHealthPolicy=ClusterHealthPolicy: MaxPercentUnhealthyNodes=0, MaxPercentUnhealthyApplications=0, ConsiderWarningAsError=True 
 

 

 
[ExecutingFaultsEvent], Timestamp=03/02/2017 16:32:26 
 
0 Faults: 
 

 
[ExecutingFaultsEvent], Timestamp=03/02/2017 16:33:00 
 
0 Faults: 
 

 
[ExecutingFaultsEvent], Timestamp=03/02/2017 16:33:33 
 
0 Faults: 
 

 
[ExecutingFaultsEvent], Timestamp=03/02/2017 16:34:06 
 
0 Faults: 
 

 
[ExecutingFaultsEvent], Timestamp=03/02/2017 16:34:40 
 
0 Faults: 
 

 
[ExecutingFaultsEvent], Timestamp=03/02/2017 16:35:13

나는 모든 구성 실종?

이러한 결과는 로컬 및 Azure 클러스터 모두에서 발생합니다. 나는 또한 C#과 PowerShell 예제를 모두 시도했으며 둘 다 같은 결과를 얻었다.

이 작업은 한 번 (로컬) 만보고 [ExecutingFaultsEvent]는 모든 노드를 다시 시작한 것입니다. 여기에 하나 이상의 유형의 결함도보아야합니까? 사전

+0

클러스터의 현재 상태를 추가 할 수 있습니까? 어떤 경고가있는 경우 "considerwarningaserror"로 카오스는 일을 건강하지 못한 것으로 간주하고 이동하지 않습니다. – masnider

+0

"ConsiderWarningsAsError"를 true로 설정하고 모든 엔티티가 정상임을 확인했지만이 코드를 실행할 때마다 여전히 동일한 문제가 표시됩니다. 이걸 진단하는 데 도움이 될만한 로그가 있습니까? –

+0

하늘색 서비스 패브릭 클러스터와 비슷한 문제가 발생하면서 어디서나이 문제가 발생 했습니까? – Kramer00

답변

0

문제는 제공된 샘플 코드입니다 (이 도메인에서, 일반적으로 유용한 샘플의 부족 ...)에서

감사합니다. 또한 즉각적인 만족 (혼란이 너무 오래 기다리지 않고 발생하는 것을보기 위해)을 위해서는 문서 샘플보다 적극적이어야합니다 (발견 한 것처럼 다시 작동하지는 않습니다 ...) .

  var startTimeUtc = DateTime.UtcNow; 
      var stabilizationTimeout = TimeSpan.FromSeconds(30.0); 
      var timeToRun = TimeSpan.FromMinutes(60.0); 
      var maxConcurrentFaults = 7; 
      var timeBetweenFaults = new TimeSpan(0, 0, 10); 
      var timeBetweenIterations = new TimeSpan(0, 0, 10); 
      Dictionary<string, string> _context = new Dictionary<string, string>(); 
      //Aggressive chaos... 
      var clusterHealthPolicy = new System.Fabric.Health.ClusterHealthPolicy() 
      { 
       MaxPercentUnhealthyApplications = 90, 
       MaxPercentUnhealthyNodes = 100 
      }; 

      var parameters = new ChaosParameters(
       stabilizationTimeout, 
       maxConcurrentFaults, 
       true, /* EnableMoveReplicaFault */ 
       timeToRun, 
       _context, 
       timeBetweenIterations, 
       timeBetweenFaults, 
       clusterHealthPolicy); 

참고 : 당신은 더 나은

(이와 샘플 코드의 IMPL 교체)

이 시도 ... ChaosParameters 생성자에 대한 다른 오버로드를 사용하여 제공 : 나는 당신이 새로운 정적 비동기 작업 반환 함수에서 이것을하는 것이 좋습니다 ...

전체 (작동 중) 샘플 :

public static async Task RunChaos() 
    { 
     var clusterConnectionString = "localhost:19000"; 
     using (var client = new FabricClient(clusterConnectionString)) 
     { 
      var startTimeUtc = DateTime.UtcNow; 
      var stabilizationTimeout = TimeSpan.FromSeconds(30.0); 
      var timeToRun = TimeSpan.FromMinutes(60.0); 
      var maxConcurrentFaults = 7; 
      var timeBetweenFaults = new TimeSpan(0, 0, 10); 
      var timeBetweenIterations = new TimeSpan(0, 0, 10); 
      Dictionary<string, string> _context = new Dictionary<string, string>(); 
      //Aggressive chaos... 
      var clusterHealthPolicy = new System.Fabric.Health.ClusterHealthPolicy() 
      { 
       MaxPercentUnhealthyApplications = 90, 
       MaxPercentUnhealthyNodes = 100 
      }; 

      var parameters = new ChaosParameters(
       stabilizationTimeout, 
       maxConcurrentFaults, 
       true, /* EnableMoveReplicaFault */ 
       timeToRun, 
       _context, 
       timeBetweenIterations, 
       timeBetweenFaults, 
       clusterHealthPolicy); 

      var token = new System.Threading.CancellationToken(); 

      try 
      { 
       await client.TestManager.StartChaosAsync(parameters, new TimeSpan(0, 30, 0), token); 
      } 
      catch (FabricChaosAlreadyRunningException) 
      { 
       Console.WriteLine("An instance of Chaos is already running in the cluster."); 
      } 

      var filter = new ChaosReportFilter(startTimeUtc, DateTime.MaxValue); 

      var eventSet = new HashSet<ChaosEvent>(new ChaosEventComparer()); 

      while (true) 
      { 
       var report = await client.TestManager.GetChaosReportAsync(filter); 

       foreach (var chaosEvent in report.History) 
       { 
        if (eventSet.Add(chaosEvent)) 
        { 
         Console.WriteLine(chaosEvent); 
        } 
       } 

       // When Chaos stops, a StoppedEvent is created. 
       // If a StoppedEvent is found, exit the loop. 
       var lastEvent = report.History.LastOrDefault(); 

       if (lastEvent is StoppedEvent) 
       { 
        break; 
       } 

       Task.Delay(TimeSpan.FromSeconds(1.0)).GetAwaiter().GetResult(); 
      } 
     } 
    }