Aracılığıyla paylaş


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ın ü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 olabilmesi gerekir.

Hata Analizi Hizmeti, geliştiricilere hataların varlığında hizmetleri test etmek için hata eylemlerine neden olma olanağı sağlar. Ancak, hedeflenen sanal hatalar sizi yalnızca şu ana kadar alır. Testi daha ileriye götürmek için Service Fabric'teki test senaryolarını kullanabilirsiniz: bir 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 kaydedilen 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 yerine daha dayanıklı, hizmet tabanlı bir Kaos uygulanıyor. 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 durumlarını 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 dengelenmesi ve doğrulamanın başarılı olması için harcanan süre de yapılandırılabilir. Senaryo, küme doğrulamasında tek bir hatayla karşıladığınızda başarısız olur.

Örneğin, en fazla üç eşzamanlı hatayla bir saat boyunca çalışacak bir test kümesi düşünün. Test üç hataya neden olur ve küme durumunu doğrular. Test, küme iyi durumda olmayana veya bir saat geçene kadar önceki adımda yinelenir. Küme herhangi bir yinelemede iyi durumda değilse ( örneğin, yapılandırılmış bir süre içinde sabitlenmezse) test bir özel durumla başarısız olur. Bu özel durum, bir şeylerin ters gittiğini ve daha fazla araştırılması 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 olmaması durumunda bir çekirdek veya veri kaybı yaşanmayacağı anlamına gelir.

Önemli yapılandırma seçenekleri

  • TimeToRun: Testin başarıyla tamamlanmadan önce çalıştırılacağı toplam süre. Test, doğrulama hatası yerine daha önce tamamlanabilir.
  • MaxClusterStabilizationTimeout: Testin başarısız olması için kümenin iyi duruma gelmesini 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 tetiklenen en fazla eşzamanlı hata sayısı. Sayı ne kadar yüksek olursa test o kadar agresif olur ve böylece daha karmaşık yük devretmeler ve geçiş bileşimleri elde eder. Test, bu yapılandırmanın ne kadar yüksek olduğundan bağımsız olarak, dış hata olmadığında çekirdek veya veri kaybı olmaması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ışı bırakılır.
  • WaitTimeBetweenIterations: Yinelemeler arasında beklenmesi gereken süre (örn. hatalardan ve karşılık gelen 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 senaryosuna başlamak için iki yol içerir. Invoke-ServiceFabricChaosTestScenario istemci tabanlıdır ve istemci makinesi test boyunca yarıda kapatılırsa, başka hata ortaya çıkarılmayacaktır. Alternatif olarak, makinenin kapatılması durumunda testin çalışmasını sağlamak için bir dizi komut vardır. Start-ServiceFabricChaos , FaultAnalysisService adlı durum bilgisi olan ve güvenilir bir sistem hizmeti kullanır ve TimeToRun çalıştırılana kadar hataların kullanılmaya devam edeceğinden emin olur. 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, hizmet bölümü için hatalar 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ğrulamadaki bir hata, 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 hizmetse)
  • Birincil çoğaltmayı taşıma
  • İkincil çoğaltmayı taşıma
  • Bölümü yeniden başlatın

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ılmış 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ın olmaması durumunda çekirdek veya veri kaybı yaşanmayacağı 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 duruma gelmesini bekleme süresi üst sınırı. Gerçekleştirilen denetimler, hizmet durumunun tamam olup olmadığı, hedef çoğaltma kümesi boyutunun tüm bölümler için sağlanıp sağlanmadığı ve InBuild çoğaltmasının mevcut olmadığıdır.
  • WaitTimeBetweenFaults: Her hata ve doğrulama döngüsü arasında bekleme süresi.

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