Test edilebilirlik senaryoları

Bulut altyapıları gibi büyük dağıtılmış sistemler doğal olarak güvenilir değildir. Azure Service Fabric, geliştiricilere güvenilir olmayan altyapılar üzerinde çalışacak hizmetler yazma olanağı sağlar. Yüksek kaliteli hizmetler yazmak için geliştiricilerin hizmetlerinin kararlılığını test etmek için bu kadar güvenilir olmayan bir altyapıya neden olması gerekir.

Hata Analizi Hizmeti, geliştiricilere hata durumunda hizmetleri test etmek için hata eylemlerine neden olma olanağı sağlar. Ancak, hedeflenen simülasyon hataları sizi yalnızca şu ana kadar alır. Testi daha ileriye götürmek için Service Fabric'teki test senaryolarını kullanabilirsiniz: kaos testi ve yük devretme testi. Bu senaryolar, küme genelinde uzun süreler boyunca hem düzgün hem de düzgün olmayan sürekli araya eklemeli hataların benzetimini gerçekleştirir. Test hızı ve hata türüyle yapılandırıldıktan sonra, kümede ve hizmetinizde hata oluşturmak için C# API'leri veya PowerShell aracılığıyla başlatılabilir.

Uyarı

ChaosTestScenario' un yerini daha dayanıklı, hizmet tabanlı bir Chaos aldı. Daha fazla ayrıntı için lütfen yeni Denetimli Kaos makalesine bakın.

Kaos testi

Kaos senaryosu, Service Fabric kümesinin tamamında hatalar oluşturur. Senaryo genellikle aylar veya yıllar içinde görülen hataları birkaç saate sıkıştırır. Araya kaydedilen hataların yüksek hata oranıyla birleşimi, aksi takdirde atlanan köşe servis taleplerini bulur. Bu, hizmetin kod kalitesinde önemli bir gelişmeye yol açar.

Kaos testinde simülasyonu yapılan hatalar

  • Düğümü yeniden başlatma
  • Dağıtılan kod paketini yeniden başlatma
  • Çoğaltmayı kaldırma
  • Çoğaltmayı yeniden başlatma
  • Birincil çoğaltmayı taşıma (isteğe bağlı)
  • İkincil çoğaltmayı taşıma (isteğe bağlı)

Kaos testi, belirtilen süre boyunca birden çok hata yinelemesi ve küme doğrulamaları çalıştırır. Kümenin kararlı hale getirmesi ve doğrulamanın başarılı olması için harcanan süre de yapılandırılabilir. Küme doğrulamada tek bir hatayla karşınıza çıktığında senaryo başarısız olur.

Örneğin, en fazla üç eşzamanlı hata ile bir saat boyunca çalışacak bir test kümesi düşünün. Test üç hataya neden olur ve kümenin durumunu doğrular. Küme iyi durumda olmayana veya bir saat geçene kadar test önceki adımda yinelenir. Küme herhangi bir yinelemede iyi durumda değilse ( örneğin, yapılandırılmış bir süre içinde kararlı hale gelmezse) test bir özel durumla başarısız olur. Bu özel durum, bir sorun olduğunu ve daha fazla araştırma gerektiğini gösterir.

Mevcut haliyle, kaos testindeki hata oluşturma altyapısı yalnızca güvenli hataların oluşmasına neden olur. Bu, dış hataların yokluğunda bir çekirdek veya veri kaybının asla gerçekleşmeyeceğini gösterir.

Önemli yapılandırma seçenekleri

  • TimeToRun: Testin başarıyla tamamlanmadan önce çalıştırılacağı toplam süre. Test, doğrulama hatasına göre daha önce tamamlanabilir.
  • MaxClusterStabilizationTimeout: Testin başarısız olması için kümenin iyi durumda olmasını bekleme süresi üst sınırı. Gerçekleştirilen denetimler küme durumunun tamam olup olmadığı, hizmet durumunun Tamam olup olmadığı, hizmet bölümü için hedef çoğaltma kümesi boyutuna ulaşılıp ulaşılmadığı ve InBuild çoğaltması olup olmadığıdır.
  • MaxConcurrentFaults: Her yinelemede ortaya çıkarılmış en fazla eşzamanlı hata sayısı. Sayı ne kadar yüksek olursa test o kadar agresif olur ve bu da daha karmaşık yük devretmeler ve geçiş birleşimleriyle sonuçlanır. Test, bu yapılandırmanın ne kadar yüksek olduğundan bağımsız olarak, dış hatalar olmadığında çekirdek veya veri kaybı yaşanmayacağını garanti eder.
  • EnableMoveReplicaFaults: Birincil veya ikincil çoğaltmaların taşınmasına neden olan hataları etkinleştirir veya devre dışı bırakır. Bu hatalar varsayılan olarak devre dışıdır.
  • WaitTimeBetweenIterations: Yinelemeler arasında beklenmesi gereken süre (örn. bir hata ve ilgili doğrulamadan sonra).

Kaos testini çalıştırma

C# örneği

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 modülü, bir kaos senaryosu başlatmanın iki yolunu içerir. Invoke-ServiceFabricChaosTestScenario istemci tabanlıdır ve test boyunca istemci makinesi yarıda kapatılırsa başka hata ortaya çıkarılmayacaktır. Alternatif olarak, makinenin kapatılması durumunda testi çalışır durumda tutmak için bir dizi komut vardır. Start-ServiceFabricChaos , FaultAnalysisService adlı durum bilgisi olan ve güvenilir bir sistem hizmeti kullanarak TimeToRun çalıştırılana kadar hataların tanıtılmasını sağlar. Stop-ServiceFabricChaos senaryoyu el ile durdurmak için kullanılabilir ve Get-ServiceFabricChaosReport bir rapor alır. Daha fazla bilgi için bkz . Azure Service Fabric PowerShell başvurusu ve Service Fabric kümelerinde denetimli kaosu başlatma.

$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

Yük devretme testi

Yük devretme testi senaryosu, belirli bir hizmet bölümünü hedefleyen kaos testi senaryosunun bir sürümüdür. Diğer hizmetleri etkilenmeden bırakırken yük devretmenin belirli bir hizmet bölümü üzerindeki etkisini test eder. Hedef bölüm bilgileri ve diğer parametrelerle yapılandırıldıktan sonra, bir hizmet bölümü için hata oluşturmak üzere C# API'lerini veya PowerShell'i kullanan bir istemci tarafı aracı olarak çalışır. Senaryo, iş mantığınız bir iş yükü sağlamak için yan tarafta çalışırken bir dizi sanal hata ve hizmet doğrulaması aracılığıyla yinelenir. Hizmet doğrulamasında hata olması, daha fazla araştırma gerektiren bir sorunu gösterir.

Yük devretme testinde simülasyonu yapılan hatalar

  • Bölümün barındırıldığı dağıtılan kod paketini yeniden başlatma
  • Birincil/ikincil çoğaltmayı veya durum bilgisi olmayan örneği kaldırma
  • Birincil ikincil çoğaltmayı yeniden başlatma (kalıcı bir hizmet varsa)
  • Birincil çoğaltmayı taşıma
  • İkincil çoğaltmayı taşıma
  • Bölümü yeniden başlatma

Yük devretme testi seçilen bir hataya neden olur ve kararlılığını sağlamak için hizmette doğrulamayı çalıştırır. Yük devretme testi, kaos testindeki olası birden çok hatanın aksine aynı anda yalnızca bir hataya neden olur. Hizmet bölümü her hatadan sonra yapılandırılan zaman aşımı içinde kararlı değilse, test başarısız olur. Test yalnızca güvenli hatalara neden olur. Bu, dış hatalar olmadığında bir çekirdek veya veri kaybı oluşmayacağı anlamına gelir.

Önemli yapılandırma seçenekleri

  • PartitionSelector: Hedeflenmesi gereken bölümü belirten seçici nesnesi.
  • TimeToRun: Testin tamamlanmadan önce çalıştırılacağı toplam süre.
  • MaxServiceStabilizationTimeout: Testin başarısız olması için kümenin iyi durumda olmasını bekleme süresi üst sınırı. Gerçekleştirilen denetimler, hizmet durumunun Tamam olup olmadığı, tüm bölümler için hedef çoğaltma kümesi boyutuna ulaşılıp ulaşılmadığı ve InBuild çoğaltması olup olmadığıdır.
  • WaitTimeBetweenFaults: Her hata ve doğrulama döngüsü arasında bek süre.

Yük devretme testini çalıştırma

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