Uso della classe RecoveryManager per correggere i problemi delle mappe partizioniUsing the RecoveryManager class to fix shard map problems

La classe RecoveryManager consente alle applicazioni ADO.NET di rilevare e correggere facilmente le eventuali incoerenze tra la mappa globale partizioni e la mappa locale partizioni in un ambiente di database partizionato.The RecoveryManager class provides ADO.Net applications the ability to easily detect and correct any inconsistencies between the global shard map (GSM) and the local shard map (LSM) in a sharded database environment.

La mappa globale partizioni e la mappa locale partizioni tengono traccia del mapping di ogni database in un ambiente partizionato.The GSM and LSM track the mapping of each database in a sharded environment. Si verifica a volte un'interruzione tra la mappa globale partizioni e la mappa locale partizioni.Occasionally, a break occurs between the GSM and the LSM. In tal caso usare la classe RecoveryManager per rilevare e correggere l'interruzione.In that case, use the RecoveryManager class to detect and repair the break.

La classe RecoveryManager fa parte della Libreria client dei database elastici.The RecoveryManager class is part of the Elastic Database client library.

Mappa partizioni

Per le definizioni dei termini, vedere il Glossario degli strumenti di database elastici.For term definitions, see Elastic Database tools glossary. Per informazioni su come usare ShardMapManager per gestire dati in una soluzione partizionata, vedere Gestione mappe partizioni.To understand how the ShardMapManager is used to manage data in a sharded solution, see Shard map management.

Perché usare Gestione ripristinoWhy use the recovery manager?

In un ambiente di database partizionato c'è un unico tenant per database e ci sono molti database per server.In a sharded database environment, there is one tenant per database, and many databases per server. Nell'ambiente possono anche esserci molti server.There can also be many servers in the environment. Ogni database è mappato nella mappa partizioni, quindi le chiamate possono essere instradate correttamente al server e al database appropriati.Each database is mapped in the shard map, so calls can be routed to the correct server and database. I database vengono rilevati in base a una chiave di partizionamento orizzontale e a ogni partizione viene assegnato un intervallo di valori di chiave.Databases are tracked according to a sharding key, and each shard is assigned a range of key values. Ad esempio, una chiave di partizionamento orizzontale può rappresentare i nomi dei clienti da "D" a "F."For example, a sharding key may represent the customer names from "D" to "F." Il mapping di tutte le partizioni (ovvero i database) e i relativi intervalli di mapping sono inclusi nella mappa globale partizioni.The mapping of all shards (aka databases) and their mapping ranges are contained in the global shard map (GSM). Ogni database include anche una mappa degli intervalli presenti nella partizione, ovvero la mappa locale partizioni.Each database also contains a map of the ranges contained on the shard that is known as the local shard map (LSM). Quando un'app si connette a una partizione, il mapping viene memorizzato nella cache insieme all'app per consentire un recupero rapido.When an app connects to a shard, the mapping is cached with the app for quick retrieval. La mappa locale partizioni si usa per convalidare i dati memorizzati nella cache.The LSM is used to validate cached data.

La mappa globale e locale delle partizioni potrebbero perdere la sincronizzazione per i motivi seguenti:The GSM and LSM may become out of sync for the following reasons:

  1. L'eliminazione di una partizione con un intervallo che si ritiene non più usato o la ridenominazione della partizione.The deletion of a shard whose range is believed to no longer be in use, or renaming of a shard. Eliminazione dei risultati di una partizione in un mapping di partizione orfana.Deleting a shard results in an orphaned shard mapping. Analogamente, anche un database rinominato può causare un mapping di partizione orfana.Similarly, a renamed database can cause an orphaned shard mapping. A seconda della finalità della modifica, potrebbe essere necessario rimuovere la partizione o aggiornarne il percorso.Depending on the intent of the change, the shard may need to be removed or the shard location needs to be updated. Per ripristinare un database eliminato, vedere Ripristinare un database SQL di Azure con il portale di Azure.To recover a deleted database, see Restore a deleted database.
  2. Si verifica un evento di failover geografico.A geo-failover event occurs. Per continuare, è necessario aggiornare il nome del server e il nome del database dello strumento di gestione della mappa partizioni all'interno dell'applicazione e quindi aggiornare i dettagli del mapping di partizione per tutte le partizioni nella mappa partizioni.To continue, one must update the server name, and database name of shard map manager in the application and then update the shard mapping details for all shards in a shard map. In caso di failover geografico, è necessario che la logica di ripristino sia automatizzata nel flusso di lavoro di failover.If there is a geo-failover, such recovery logic should be automated within the failover workflow. L'automazione delle azioni di ripristino rende possibile la gestibilità senza problemi dei database abilitati per la replica geografica, evitando interventi manuali.Automating recovery actions enables a frictionless manageability for geo-enabled databases and avoids manual human actions. Per informazioni sulle opzioni per ripristinare un database in caso di interruzione del data center, vedere Continuità aziendale e Ripristino di emergenza.To learn about options to recover a database if there is a data center outage, see Business Continuity and Disaster Recovery.
  3. Una partizione o un database ShardMapManager viene ripristinato a una condizione precedente.Either a shard or the ShardMapManager database is restored to an earlier point-in time. Per informazioni sul recupero temporizzato tramite i backup, vedere l'articolo sul ripristino mediante backup.To learn about point in time recovery using backups, see Recovery using backups.

Per altre informazioni sugli strumenti di database elastici per i database SQL di Azure, la replica geografica e il ripristino, vedere:For more information about Azure SQL Database Elastic Database tools, geo-replication and Restore, see the following:

Ripristino di RecoveryManager da un oggetto ShardMapManagerRetrieving RecoveryManager from a ShardMapManager

Il primo passaggio consiste nel creare un'istanza di RecoveryManager.The first step is to create a RecoveryManager instance. Il metodo GetRecoveryManager restituisce la funzionalità di Gestione ripristino per l'istanza corrente di ShardMapManager.The GetRecoveryManager method returns the recovery manager for the current ShardMapManager instance. Per risolvere eventuali incoerenze in una mappa partizioni, è necessario ripristinare prima di tutto RecoveryManager per una mappa partizioni specifica.To address any inconsistencies in the shard map, you must first retrieve the RecoveryManager for the particular shard map.

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

In questo esempio RecoveryManager viene inizializzato da ShardMapManager.In this example, the RecoveryManager is initialized from the ShardMapManager. Anche ShardMapManager che contiene un oggetto ShardMap è già inizializzato.The ShardMapManager containing a ShardMap is also already initialized.

Poiché questo codice dell'applicazione manipola la mappa partizioni stessa, le credenziali usate nel metodo factory, nell'esempio precedente smmConnectionString, devono essere credenziali con autorizzazioni di lettura/scrittura per il database GSM a cui si fa riferimento nella stringa di connessione.Since this application code manipulates the shard map itself, the credentials used in the factory method (in the preceding example, smmConnectionString) should be credentials that have read-write permissions on the GSM database referenced by the connection string. Queste credenziali sono in genere diverse da quelle usate per aprire connessioni per il routing dipendente dai dati.These credentials are typically different from credentials used to open connections for data-dependent routing. Per ulteriori informazioni, vedere Gestione delle credenziali nella libreria client dei database elastici.For more information, see Using credentials in the elastic database client.

Rimozione di una partizione da ShardMap dopo l'eliminazione di una partizioneRemoving a shard from the ShardMap after a shard is deleted

Il metodo DetachShard scollega la partizione specificata dalla mappa partizioni ed elimina i mapping associati alla partizione.The DetachShard method detaches the given shard from the shard map and deletes mappings associated with the shard.

  • Il parametro location corrisponde al percorso della partizione, cioè il nome del server e il nome del database, della partizione che viene scollegata.The location parameter is the shard location, specifically server name and database name, of the shard being detached.
  • Il parametro shardMapName è il nome della mappa partizioni.The shardMapName parameter is the shard map name. È richiesto solo quando più mappe partizioni sono gestite dallo stesso gestore delle mappe partizioni.This is only required when multiple shard maps are managed by the same shard map manager. facoltativo.Optional.

Importante

usare questa tecnica solo se si è certi che l'intervallo per il mapping aggiornato sia vuoto.Use this technique only if you are certain that the range for the updated mapping is empty. Poiché i metodi descritti precedentemente non controllano i dati dell'intervallo da spostare, è consigliabile includere i controlli nel codice.The methods above do not check data for the range being moved, so it is best to include checks in your code.

Questo esempio rimuove le partizioni dalla mappa partizioni.This example removes shards from the shard map.

rm.DetachShard(s.Location, customerMap);

La mappa partizioni riflette il percorso della partizione nella mappa globale delle partizioni precedente l'eliminazione della partizione.The shard map reflects the shard location in the GSM before the deletion of the shard. Poiché la partizione è stata eliminata, si presuppone che questa operazione sia stata intenzionale che l'intervallo di chiavi di partizionamento orizzontale non venga più usato.Because the shard was deleted, it is assumed this was intentional, and the sharding key range is no longer in use. Se non è questo il caso, è possibile eseguire un ripristino temporizzato.If not, you can execute point-in time restore. Per ripristinare le partizioni da un punto nel tempo precedente.to recover the shard from an earlier point-in-time. In questo caso, vedere la sezione seguente per rilevare le incoerenze della partizione. Per eseguire il ripristino, vedere Recupero temporizzato.(In that case, review the following section to detect shard inconsistencies.) To recover, see Point in time recovery.

Presupponendo che l'eliminazione del database sia stata intenzionale, l'azione di pulizia amministrativa finale consiste nell'eliminare la voce relativa alla partizione nel gestore delle mappe partizioni.Since it is assumed the database deletion was intentional, the final administrative cleanup action is to delete the entry to the shard in the shard map manager. In questo modo si impedisce all'applicazione di scrivere inavvertitamente informazioni in un intervallo non previsto.This prevents the application from inadvertently writing information to a range that is not expected.

Per rilevare le differenze nei mappingTo detect mapping differences

Il metodo DetectMappingDifferences seleziona e restituisce una della mappe partizioni, locale o globale, come origine di dati reali e riconcilia i mapping in entrambi i tipi di mappa partizioni, globale e locale.The DetectMappingDifferences method selects and returns one of the shard maps (either local or global) as the source of truth and reconciles mappings on both shard maps (GSM and LSM).

rm.DetectMappingDifferences(location, shardMapName);
  • Il percorso specifica il nome del server e il nome del database.The location specifies the server name and database name.
  • Il parametro shardMapName è il nome della mappa partizioni.The shardMapName parameter is the shard map name. È richiesto solo se più mappe partizioni sono gestite dallo stesso gestore delle mappe partizioni.This is only required if multiple shard maps are managed by the same shard map manager. Facoltativo.Optional.

Per risolvere le differenze nei mappingTo resolve mapping differences

Il metodo ResolveMappingDifferences seleziona una delle mappe partizioni, locale o globale, come origine di dati reali e riconcilia i mapping in entrambi i tipi di mappa partizioni, globale e locale.The ResolveMappingDifferences method selects one of the shard maps (either local or global) as the source of truth and reconciles mappings on both shard maps (GSM and LSM).

ResolveMappingDifferences (RecoveryToken, MappingDifferenceResolution.KeepShardMapping);
  • Il parametro RecoveryToken enumera le differenze nei mapping tra la mappa globale di partizioni e la mappa locale di partizioni per la partizione specifica.The RecoveryToken parameter enumerates the differences in the mappings between the GSM and the LSM for the specific shard.
  • L' enumerazione MappingDifferenceResolution viene usata per indicare il metodo per risolvere la differenza tra i mapping di partizione.The MappingDifferenceResolution enumeration is used to indicate the method for resolving the difference between the shard mappings.
  • È consigliabile usare MappingDifferenceResolution.KeepShardMapping qualora la mappa locale partizioni contenga il mapping corretto e quindi si dovrà usare il mapping presente nella partizione.MappingDifferenceResolution.KeepShardMapping is recommended that when the LSM contains the accurate mapping and therefore the mapping in the shard should be used. Questo si verifica in genere nel caso di un failover, dove la partizione ora risiede in un nuovo server.This is typically the case if there is a failover: the shard now resides on a new server. Poiché la partizione deve essere prima rimossa dalla mappa globale partizioni, tramite il metodo RecoveryManager.DetachShard, non esiste più un mapping nella mappa globale partizioni.Since the shard must first be removed from the GSM (using the RecoveryManager.DetachShard method), a mapping no longer exists on the GSM. Per ristabilire il mapping della partizione è quindi necessario usare la mappa locale partizioni.Therefore, the LSM must be used to re-establish the shard mapping.

Collegare una partizione a ShardMap dopo il ripristino di una partizioneAttach a shard to the ShardMap after a shard is restored

Il metodo AttachShard collega la partizione specificata alla mappa partizioni.The AttachShard method attaches the given shard to the shard map. Rileva quindi eventuali incoerenze nella mappa partizioni e aggiorna i mapping in modo che la partizione corrisponda al punto di ripristino della partizione.It then detects any shard map inconsistencies and updates the mappings to match the shard at the point of the shard restoration. Si presuppone che venga rinominato anche il database per riflettere il nome del database originale, precedente al ripristino della partizione, perché per impostazione predefinita il ripristino temporizzato usa un nuovo database a cui aggiunge il timestamp.It is assumed that the database is also renamed to reflect the original database name (before the shard was restored), since the point-in time restoration defaults to a new database appended with the timestamp.

rm.AttachShard(location, shardMapName)
  • Il parametro location corrisponde al nome del server e al nome del database della partizione che viene collegata.The location parameter is the server name and database name, of the shard being attached.
  • Il parametro shardMapName è il nome della mappa partizioni.The shardMapName parameter is the shard map name. È richiesto solo quando più mappe partizioni sono gestite dallo stesso gestore delle mappe partizioni.This is only required when multiple shard maps are managed by the same shard map manager. Facoltativo.Optional.

Questo esempio aggiunge una partizione alla mappa partizioni ripristinata di recente da una condizione precedente.This example adds a shard to the shard map that has been recently restored from an earlier point-in time. Poiché la partizione, ovvero il mapping per la partizione nella mappa locale partizioni, è stata ripristinata, è potenzialmente incoerenze con la voce della partizione nella mappa globale partizioni.Since the shard (namely the mapping for the shard in the LSM) has been restored, it is potentially inconsistent with the shard entry in the GSM. Esternamente a questo codice di esempio, la partizione è stata ripristinata e rinominata con il nome originale del database.Outside of this example code, the shard was restored and renamed to the original name of the database. Essendo stata ripristinata, si presuppone che il mapping nella mappa locale partizioni sia quello attendibile.Since it was restored, it is assumed the mapping in the LSM is the trusted mapping.

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

Aggiornamento dei percorsi della partizioni dopo un failover geografico, o ripristino, delle partizioniUpdating shard locations after a geo-failover (restore) of the shards

Nel caso di failover geografico, il database secondario è reso accessibile in scrittura e diventa il database primario.If there is a geo-failover, the secondary database is made write accessible and becomes the new primary database. Il nome del server, e potenzialmente il database a seconda della configurazione, può essere diverso da quello primario originale.The name of the server, and potentially the database (depending on your configuration), may be different from the original primary. È quindi necessario correggere le voci dei mapping per la partizione nella mappa globale partizioni e nella mappa locale partizioni.Therefore the mapping entries for the shard in the GSM and LSM must be fixed. In modo analogo, se il database viene ripristinato con un nome e un percorso diversi, oppure a una condizione precedente, potrebbero verificarsi incoerenze nelle mappe partizioni.Similarly, if the database is restored to a different name or location, or to an earlier point in time, this might cause inconsistencies in the shard maps. Il gestore delle mappe partizioni controlla la distribuzione delle connessioni aperte ai database corretti.The Shard Map Manager handles the distribution of open connections to the correct database. La distribuzione si basa sui dati contenuti nella mappa partizioni e sul valore della chiave di partizionamento orizzontale di destinazione della richiesta dell'applicazione.Distribution is based on the data in the shard map and the value of the sharding key that is the target of the applications request. Dopo un failover geografico queste informazioni devono essere aggiornate con il nome del server, il nome del database e il mapping di partizione corretti del database ripristinato.After a geo-failover, this information must be updated with the accurate server name, database name and shard mapping of the recovered database.

Procedure consigliateBest practices

Il failover geografico e il ripristino sono operazioni che di solito sono gestite da un amministratore del cloud dell'applicazione usando intenzionalmente una delle funzionalità di continuità aziendale dei database SQL di Azure.Geo-failover and recovery are operations typically managed by a cloud administrator of the application intentionally utilizing one of Azure SQL Databases business continuity features. La pianificazione della continuità aziendale richiede la definizione di processi, procedure e misure che garantiscano la continuità delle operazioni aziendali senza interruzioni.Business continuity planning requires processes, procedures, and measures to ensure that business operations can continue without interruption. In questo flusso di lavoro è necessario usare i metodi disponibili come parte della classe RecoveryManager per assicurare che la mappa globale partizioni e la mappa locale partizioni siano mantenute aggiornate con l'azione di ripristino eseguita.The methods available as part of the RecoveryManager class should be used within this work flow to ensure the GSM and LSM are kept up-to-date based on the recovery action taken. Per assicurarsi che la mappa globale partizioni e la mappa locale partizioni riflettano le informazioni corrette dopo un evento di failover, occorre eseguire cinque passaggi.There are five basic steps to properly ensuring the GSM and LSM reflect the accurate information after a failover event. Il codice dell'applicazione per eseguire questi passaggi può essere integrato negli strumenti e nel flusso di lavoro esistenti.The application code to execute these steps can be integrated into existing tools and workflow.

  1. Recuperare Gestione ripristino da ShardMapManager.Retrieve the RecoveryManager from the ShardMapManager.
  2. Scollegare la partizione precedente dalla mappa partizioni.Detach the old shard from the shard map.
  3. Collegare la nuova partizione alla mappa partizioni, includendo il percorso della nuova partizione.Attach the new shard to the shard map, including the new shard location.
  4. Rilevare le incoerenze nel mapping tra la mappa globale partizioni e la mappa locale partizioni.Detect inconsistencies in the mapping between the GSM and LSM.
  5. Risolvere le differenze tra la mappa globale partizioni e la mappa locale partizioni, considerando attendibile la mappa locale partizioni.Resolve differences between the GSM and the LSM, trusting the LSM.

L'esempio segue questa procedura:This example performs the following steps:

  1. Rimuove le partizioni dalla mappa partizioni che riflette i percorsi precedenti all'evento di failover.Removes shards from the Shard Map that reflect shard locations before the failover event.
  2. Collega le partizioni alla mappa partizioni riflettendo i nuovi percorsi delle partizioni. Il parametro "Configuration.SecondaryServer" è il nuovo nome del server, ma lo stesso nome del database.Attaches shards to the Shard Map reflecting the new shard locations (the parameter "Configuration.SecondaryServer" is the new server name but the same database name).
  3. Recupera i token di ripristino rilevando le differenze dei mapping tra la mappa globale partizioni e la mappa locale partizioni per ogni partizione.Retrieves the recovery tokens by detecting mapping differences between the GSM and the LSM for each shard.
  4. Risolve le incoerenze considerando attendibile il mapping dalla mappa locale partizioni di ogni partizione.Resolves the inconsistencies by trusting the mapping from the LSM of each shard.

    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); 
             } 
         } 
     } 
    

Risorse aggiuntiveAdditional resources

Se non si usano gli strumenti di database elastici,Not using elastic database tools yet? vedere la Guida introduttiva.Check out our Getting Started Guide. Se ci sono domande, è possibile visitare il forum sul database SQL mentre è possibile inserire le richieste di nuove funzionalità nel forum relativo a commenti e suggerimenti sul database SQL.For questions, please reach out to us on the SQL Database forum and for feature requests, please add them to the SQL Database feedback forum.