RecoveryManager sınıfı ile parça eşleme sorunlarını düzeltme

Şunlar için geçerlidir:Azure SQL Veritabanı

RecoveryManager sınıfı, ADO.NET uygulamalara parçalı veritabanı ortamındaki genel parça eşlemesi (GSM) ile yerel parça eşlemesi (LSM) arasındaki tutarsızlıkları kolayca algılama ve düzeltme olanağı sağlar.

GSM ve LSM, parçalanmış bir ortamdaki her veritabanının eşlemesini izler. Bazen GSM ile LSM arasında bir kesme oluşur. Bu durumda, kesmeyi algılamak ve onarmak için RecoveryManager sınıfını kullanın.

RecoveryManager sınıfı, Elastik Veritabanı istemci kitaplığının bir parçasıdır.

Shard map

Terim tanımları için bkz . Elastik Veritabanı araçları sözlüğü. ShardMapManager'ın parçalı çözümdeki verileri yönetmek için nasıl kullanıldığını anlamak için bkz. Parça eşleme yönetimi.

Kurtarma yöneticisini neden kullanmalısınız?

Parçalı veritabanı ortamında, veritabanı başına bir kiracı ve sunucu başına çok sayıda veritabanı vardır. Ortamda birçok sunucu da olabilir. Her veritabanı parça eşlemesine eşlenir, bu nedenle çağrılar doğru sunucuya ve veritabanına yönlendirilebilir. Veritabanları bir parçalama anahtarına göre izlenir ve her parçaya bir anahtar değerleri aralığı atanır. Örneğin, bir parçalama anahtarı "D" ile "F" arasındaki müşteri adlarını temsil edebilir. Tüm parçaların (veritabanları olarak da bilinir) ve bunların eşleme aralıklarının eşlemesi genel parça haritasında (GSM) yer alır. Her veritabanı, parça üzerinde bulunan ve yerel parça eşlemesi (LSM) olarak bilinen aralıkların bir haritasını da içerir. Bir uygulama bir parçaya bağlandığında, eşleme hızlı alma için uygulamayla önbelleğe alınır. LSM, önbelleğe alınan verileri doğrulamak için kullanılır.

GSM ve LSM aşağıdaki nedenlerle eşitlenmemiş olabilir:

  1. Aralığı artık kullanılmadığını veya bir parçanın yeniden adlandırılmadığını düşünülen bir parçanın silinmesi. Bir parça silindiğinde yalnız bırakılmış parça eşlemesi elde edilir. Benzer şekilde, yeniden adlandırılan bir veritabanı yalnız bırakılmış parça eşlemesine neden olabilir. Değişikliğin amacına bağlı olarak parçanın kaldırılması veya parça konumunun güncelleştirilmesi gerekebilir. Silinen veritabanını kurtarmak için bkz . Silinen veritabanını geri yükleme.
  2. Coğrafi yük devretme olayı gerçekleşir. Devam etmek için, uygulamadaki parça eşleme yöneticisinin sunucu adını ve veritabanı adını güncelleştirmeli ve ardından bir parça eşlemesindeki tüm parçalar için parça eşleme ayrıntılarını güncelleştirmelisiniz. Coğrafi yük devretme varsa, bu tür bir kurtarma mantığı yük devretme iş akışı içinde otomatikleştirilmiş olmalıdır. Kurtarma eylemlerini otomatikleştirmek, coğrafi olarak etkinleştirilmiş veritabanları için sorunsuz yönetilebilirlik sağlar ve el ile gerçekleştirilen insan eylemlerini önler. Veri merkezi kesintisi varsa veritabanını kurtarma seçenekleri hakkında bilgi edinmek için bkz . İş Sürekliliği ve Olağanüstü Durum Kurtarma.
  3. Bir parça veya ShardMapManager veritabanı önceki bir noktaya geri yüklenir. Yedeklemeleri kullanarak belirli bir noktaya kurtarma hakkında bilgi edinmek için bkz . Yedeklemeleri kullanarak kurtarma.

Azure SQL Veritabanı Elastik Veritabanı araçları, coğrafi çoğaltma ve Geri Yükleme hakkında daha fazla bilgi için aşağıdakilere bakın:

ShardMapManager'dan RecoveryManager alma

İlk adım bir RecoveryManager örneği oluşturmaktır. GetRecoveryManager yöntemi, geçerli ShardMapManager örneğinin kurtarma yöneticisini döndürür. Parça eşlemesindeki tutarsızlıkları gidermek için önce belirli parça eşlemesi için RecoveryManager'ı almanız gerekir.

 ShardMapManager smm = ShardMapManagerFactory.GetSqlShardMapManager(smmConnectionString,  
          ShardMapManagerLoadPolicy.Lazy);
          RecoveryManager rm = smm.GetRecoveryManager();

Bu örnekte RecoveryManager, ShardMapManager'dan başlatılır. ShardMap içeren ShardMapManager da zaten başlatıldı.

Bu uygulama kodu parça eşlemesinin kendisini işlediğinden, fabrika yönteminde kullanılan kimlik bilgileri (önceki örnekte smm Bağlan ionString), bağlantı dizesi tarafından başvuruda bulunılan GSM veritabanında okuma-yazma izinlerine sahip kimlik bilgileri olmalıdır. Bu kimlik bilgileri genellikle verilere bağımlı yönlendirme bağlantılarını açmak için kullanılan kimlik bilgilerinden farklıdır. Daha fazla bilgi için bkz . Elastik veritabanı istemcisinde kimlik bilgilerini kullanma.

Parça silindikten sonra parçanın ShardMap'ten kaldırılması

DetachShard yöntemi, verilen parçanın parça eşlemesinden ayrılmasını sağlar ve parçayla ilişkili eşlemeleri siler.

  • location parametresi, ayrılan parçanın parça konumu, özellikle sunucu adı ve veritabanı adıdır.
  • shardMapName parametresi parça eşleme adıdır. Bu yalnızca birden çok parça eşlemesi aynı parça eşleme yöneticisi tarafından yönetildiğinde gereklidir. isteğe bağlı.

Önemli

Bu tekniği yalnızca güncelleştirilmiş eşleme aralığının boş olduğundan eminseniz kullanın. Yukarıdaki yöntemler taşınan aralığın verilerini denetlemez, bu nedenle kodunuza denetimler eklemek en iyisidir.

Bu örnek parçaları parça eşlemesinden kaldırır.

rm.DetachShard(s.Location, customerMap);

Parça haritası, parça silinmeden önce GSM'deki parça konumunu yansıtır. Parça silindiğinden, bunun kasıtlı olduğu varsayılır ve parçalama anahtar aralığı artık kullanımda değildir. Aksi takdirde belirli bir noktaya geri yüklemeyi yürütebilirsiniz. öğesini seçin. (Bu durumda parça tutarsızlıklarını algılamak için aşağıdaki bölümü gözden geçirin.) Kurtarmak için bkz . Belirli bir noktaya kurtarma.

Veritabanı silme işleminin kasıtlı olduğu varsayıldığı için, son yönetim temizleme eylemi parça eşleme yöneticisindeki parçaya girişi silmektir. Bu, uygulamanın beklenmeyen bir aralığa yanlışlıkla bilgi yazmasını engeller.

Eşleme farklarını algılamak için

DetectMappingDifferences yöntemi, parça haritalarından birini (yerel veya genel) doğruluk kaynağı olarak seçer ve döndürür ve her iki parça eşlemesinde de (GSM ve LSM) eşlemeleri mutabık hale getirir.

rm.DetectMappingDifferences(location, shardMapName);
  • Konum, sunucu adını ve veritabanı adını belirtir.
  • shardMapName parametresi parça eşleme adıdır. Bu, yalnızca birden çok parça eşlemesi aynı parça eşleme yöneticisi tarafından yönetiliyorsa gereklidir. isteğe bağlı.

Eşleme farklarını çözmek için

ResolveMappingDifferences yöntemi, parça eşlemelerinden birini (yerel veya genel) doğruluk kaynağı olarak seçer ve her iki parça eşlemesinde de eşlemeleri (GSM ve LSM) uzlaştırmaktadır.

ResolveMappingDifferences (RecoveryToken, MappingDifferenceResolution.KeepShardMapping);
  • RecoveryToken parametresi, belirli parça için GSM ile LSM arasındaki eşlemelerdeki farkları numaralandırır.
  • MappingDifferenceResolution sabit listesi, parça eşlemeleri arasındaki farkı çözümleme yöntemini belirtmek için kullanılır.
  • MappingDifferenceResolution.KeepShardMapping , LSM doğru eşlemeyi içerdiğinde ve bu nedenle parçadaki eşlemenin kullanılması gerektiğinde önerilir. Yük devretme varsa genellikle bu durum geçerli olur: parça artık yeni bir sunucuda yer alır. Parçanın önce GSM'den kaldırılması gerektiğinden (RecoveryManager.DetachShard yöntemi kullanılarak), GSM üzerinde artık eşleme yoktur. Bu nedenle, parça eşlemesini yeniden oluşturmak için LSM kullanılmalıdır.

Parça geri yüklendikten sonra ShardMap'e parça ekleme

AttachShard yöntemi, verilen parçanın parça eşlemesine eklenmesini sağlar. Daha sonra parça eşleme tutarsızlıklarını algılar ve eşlemeleri parça geri yükleme noktasındaki parçayla eşleşecek şekilde güncelleştirir. Belirli bir noktaya geri yükleme varsayılan olarak zaman damgası eklenmiş yeni bir veritabanına eklendiğinden, veritabanının özgün veritabanı adını (parça geri yüklenmeden önce) yansıtacak şekilde yeniden adlandırıldığı varsayılır.

rm.AttachShard(location, shardMapName)
  • Location parametresi, eklenen parçanın sunucu adı ve veritabanı adıdır.
  • shardMapName parametresi parça eşleme adıdır. Bu yalnızca birden çok parça eşlemesi aynı parça eşleme yöneticisi tarafından yönetildiğinde gereklidir. isteğe bağlı.

Bu örnek, kısa süre önce önceki bir noktadan geri yüklenen parça eşlemesine bir parça ekler. Parça (LSM'deki parçanın eşlemesi) geri yüklendiğinden, GSM'deki parça girişiyle tutarsız olabilir. Bu örnek kodun dışında parça geri yüklendi ve veritabanının özgün adıyla yeniden adlandırıldı. Geri yüklendiğinden, LSM'deki eşlemenin güvenilir eşleme olduğu varsayılır.

rm.AttachShard(s.Location, customerMap);
var gs = rm.DetectMappingDifferences(s.Location);
   foreach (RecoveryToken g in gs)
    {
    rm.ResolveMappingDifferences(g, MappingDifferenceResolution.KeepShardMapping);
    }

Parçaların coğrafi yük devretmesi (geri yükleme) sonrasında parça konumlarını güncelleştirme

Coğrafi yük devretme varsa, ikincil veritabanı yazma erişilebilir hale gelir ve yeni birincil veritabanı olur. Sunucunun adı ve büyük olasılıkla veritabanı (yapılandırmanıza bağlı olarak) özgün birincilden farklı olabilir. Bu nedenle GSM ve LSM'deki parçanın eşleme girişleri düzeltilmelidir. Benzer şekilde, veritabanı farklı bir ada veya konuma veya zamanın önceki bir noktasına geri yüklenirse, bu durum parça eşlemelerinde tutarsızlıklara neden olabilir. Parça Eşleme Yöneticisi, açık bağlantıların doğru veritabanına dağıtımını işler. Dağıtım, parça eşlemesindeki verileri ve uygulama isteğinin hedefi olan parçalama anahtarının değerini temel alır. Coğrafi yük devretme işleminden sonra, bu bilgilerin kurtarılan veritabanının doğru sunucu adı, veritabanı adı ve parça eşlemesiyle güncelleştirilmesi gerekir.

En iyi yöntemler

Coğrafi yük devretme ve kurtarma, genellikle uygulamanın bulut yöneticisi tarafından kasıtlı olarak Azure SQL Veritabanı iş sürekliliği özellikleri kullanılarak yönetilen işlemlerdir. İş sürekliliği planlaması, iş operasyonlarının kesintiye uğramadan devam etmesini sağlamak için süreçler, yordamlar ve önlemler gerektirir. RecoveryManager sınıfının bir parçası olarak kullanılabilen yöntemler, GSM ve LSM'nin gerçekleştirilen kurtarma eylemine göre güncel tutulmasını sağlamak için bu iş akışı içinde kullanılmalıdır. GSM ve LSM'nin yük devretme olayından sonra doğru bilgileri yansıtmasını sağlamak için beş temel adım vardır. Bu adımları yürütmek için uygulama kodu mevcut araçlarla ve iş akışıyla tümleştirilebilir.

  1. ShardMapManager'dan RecoveryManager'ı alın.
  2. Eski parçanın parça haritasından ayrılması.
  3. Yeni parça konumunu da dahil olmak üzere yeni parça eşlemesine ekleyin.
  4. GSM ile LSM arasındaki eşlemedeki tutarsızlıkları tespit edin.
  5. GSM ile LSM arasındaki farkları çözerek LSM'ye güvenin.

Bu örnek aşağıdaki adımları gerçekleştirir:

  1. Parça Eşlemesinden yük devretme olayından önceki parça konumlarını yansıtan parçaları kaldırır.

  2. Parçaları, yeni parça konumlarını yansıtan Parça Eşlemesine ekler ("Configuration.SecondaryServer" parametresi yeni sunucu adıdır ancak aynı veritabanı adıdır).

  3. Her parça için GSM ile LSM arasındaki eşleme farklarını algılayarak kurtarma belirteçlerini alır.

  4. Her parçanın LSM'sinden eşlemeye güvenerek tutarsızlıkları giderir.

    var shards = smm.GetShards();
    foreach (shard s in shards)
    {
      if (s.Location.Server == Configuration.PrimaryServer)
          {
           ShardLocation slNew = new ShardLocation(Configuration.SecondaryServer, s.Location.Database);
           rm.DetachShard(s.Location);
           rm.AttachShard(slNew);
           var gs = rm.DetectMappingDifferences(slNew);
           foreach (RecoveryToken g in gs)
             {
                rm.ResolveMappingDifferences(g, MappingDifferenceResolution.KeepShardMapping);
             }
         }
     }
    

Ek kaynaklar

Elastik veritabanı araçlarını henüz kullanmıyor musunuz? Başlarken Kılavuzumuza göz atın. Sorular için, SQL Veritabanı ve özellik istekleri için Microsoft Soru-Cevap soru sayfasından bizimle iletişime geçin, yeni fikirler ekleyin veya SQL Veritabanı geri bildirim forumunda mevcut fikirler için oy verin.