Résolution des problèmes : Perte de données potentielle concernant les réplicas de groupes de disponibilité avec validation asynchrone
S'applique à : SQL Server
Après avoir effectué un basculement manuel forcé sur un groupe de disponibilité vers un réplica secondaire avec validation asynchrone, vous pouvez constater que la perte de données est supérieure à votre RPO (objectif de point de récupération). Vous pouvez arriver au même constat quand vous calculez la perte de données potentielle d’un réplica secondaire avec validation asynchrone à l’aide de la méthode décrite dans Monitorer les performances des groupes de disponibilité AlwaysOn.
Un réplica secondaire avec validation synchrone élimine les pertes de données, mais le risque de perte de données potentielle d’un réplica secondaire avec validation asynchrone varie selon la part du journal encore en attente de renforcement sur le réplica secondaire.
Les sections suivantes décrivent les causes courantes du risque élevé de perte de données d’un réplica secondaire avec validation asynchrone, si tant est que votre instance de serveur ne fait pas l’objet d’une dégradation des performances systémiques sans rapport avec les groupes de disponibilité.
Une latence réseau élevée ou un débit réseau faible provoque l’accumulation des journaux sur le réplica principal
Le plus souvent, les bases de données dépassent le RPO car elles ne peuvent pas être envoyées au réplica secondaire suffisamment vite.
Explication
Le réplica principal active le contrôle de flux sur l’envoi de journaux en cas de dépassement du nombre maximal autorisé de messages n’ayant pas fait l’objet d’un accusé de réception envoyés au réplica secondaire. Tant qu’une partie de ces messages ne fait pas l’objet d’un accusé de réception, aucun bloc de journal supplémentaire ne peut être envoyé au réplica secondaire. Étant donné que la perte de données ne peut être évitée que si les données ont été renforcées sur le réplica secondaire, l’accumulation de messages de journal non envoyés augmente le risque de perte de données.
Diagnostic et résolution
Un grand nombre de messages renvoyés au réplica secondaire peut indiquer un niveau élevé de latence et de bruit réseau. Vous pouvez également comparer la valeur DMV log_send_rate avec l’objet de performance Log Bytes Flushed/sec. Si les journaux sont vidés sur le disque plus rapidement qu’ils ne sont envoyés, le risque de perte de données peut augmenter indéfiniment.
Il est également utile de vérifier les deux objets de performance suivants : SQL Server:Availability Replica > Flow Control Time (ms/sec)
et SQL Server:Availability Replica > Flow Control/sec
. Multipliez ces deux valeurs pour savoir le temps passé à attendre l’aboutissement du contrôle de flux au cours de la dernière seconde. Plus le temps d’attente du contrôle de flux est long, plus le taux d’envoi est faible.
Les métriques suivantes sont utiles pour diagnostiquer les problèmes liés à la latence et au débit du réseau. Vous pouvez utiliser d’autres outils Windows comme ping.exe et Moniteur réseau pour évaluer la latence et l’utilisation du réseau.
DMV
sys.dm_hadr_database_replica_states, log_send_queue_size
DMV
sys.dm_hadr_database_replica_states, log_send_rate
Compteur de performances
SQL Server:Database > Log Bytes Flushed/sec
Compteur de performances
SQL Server:Database Mirroring > Send/Receive Ack Time
Compteur de performances
SQL Server:Availability Replica > Bytes Sent to Replica/sec
Compteur de performances
SQL Server:Availability Replica > Bytes Sent to Transport/sec
Compteur de performances
SQL Server:Availability Replica > Flow Control Time (ms/sec)
Compteur de performances
SQL Server:Availability Replica > Flow Control/sec
Compteur de performances
SQL Server:Availability Replica > Resent Messages/sec
Pour remédier à ce problème, essayez d’augmenter votre bande passante réseau ou de supprimer/réduire le trafic réseau inutile.
Un goulot d’étranglement des E/S disque ralentit le renforcement du journal sur le réplica secondaire
Selon le déploiement du fichier de base de données, le renforcement du journal peut ralentir en raison d’une contention au niveau des E/S avec la charge de travail de création de rapports.
Explication
Le risque de perte de données est éliminé dès que le bloc de journal est renforcé sur le fichier journal. Il est donc impératif d’isoler le fichier journal du fichier de données. Si le fichier journal et le fichier de données sont mappés au même disque dur, la charge de travail de création de rapports caractérisée par des lectures intensives sur le fichier de données consomme les mêmes ressources d’E/S que l’opération de renforcement du journal. Si cette dernière est lente, l’envoi des accusés de réception au réplica principal peut ralentir, ce qui peut entraîner une activation excessive du contrôle de flux et de longs délais d’attente au niveau du contrôle flux.
Diagnostic et résolution
Si vous avez déterminé que le réseau n’est pas affecté par une latence élevée ou un débit faible, examinez le réplica secondaire à la recherche de contentions au niveau des E/S. Les requêtes de SQL Server : Minimiser les E/S disque sont utiles pour identifier les contentions. Des exemples dérivés de cet article sont proposés ci-dessous à toutes fins utiles.
Le script suivant vous permet de voir le nombre de lectures et d’écritures sur chaque fichier de données et de journal pour chaque base de données de disponibilité en cours d’exécution sur une instance de SQL Server. Les résultats sont triés selon le temps moyen de blocage des E/S, en millisecondes. Notez qu’il s’agit d’un cumul des valeurs générées depuis le dernier démarrage de l’instance du serveur. Vous devez donc calculer la différence entre deux mesures après un certain temps.
SELECT DB_NAME(database_id) AS
[Database Name] ,
file_id ,
io_stall_read_ms ,
num_of_reads ,
CAST(io_stall_read_ms / ( 1.0 + num_of_reads ) AS NUMERIC(10, 1)) AS [avg_read_stall_ms] ,
io_stall_write_ms ,
num_of_writes ,
CAST(io_stall_write_ms / ( 1.0 + num_of_writes ) AS NUMERIC(10, 1)) AS [avg_write_stall_ms] ,
io_stall_read_ms + io_stall_write_ms AS [io_stalls] ,
num_of_reads + num_of_writes AS [total_io] ,
CAST(( io_stall_read_ms + io_stall_write_ms ) / ( 1.0 + num_of_reads
+ num_of_writes) AS NUMERIC(10,1)) AS [avg_io_stall_ms]
FROM sys.dm_io_virtual_file_stats(NULL, NULL)
WHERE DB_NAME(database_id) IN (SELECT DISTINCT database_name FROM sys.dm_hadr_database_replica_cluster_states)
ORDER BY avg_io_stall_ms DESC;
La requête suivante fournit un instantané à un moment donné (non cumulé) de requêtes d’E/S en attente sur votre système.
SELECT DB_NAME(mf.database_id) AS [Database] ,
mf.physical_name ,
r.io_pending ,
r.io_pending_ms_ticks ,
r.io_type ,
fs.num_of_reads ,
fs.num_of_writes
FROM sys.dm_io_pending_io_requests AS r
INNER JOIN sys.dm_io_virtual_file_stats(NULL, NULL) AS fs ON r.io_handle = fs.file_handle
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.file_id = mf.file_id
ORDER BY r.io_pending , r.io_pending_ms_ticks DESC;
Vous pouvez comparer la façon dont les E/S de lecture et les E/S d’écriture correspondent les une aux autres pour identifier toute contention au niveau des E/S.
Voici quelques compteurs de performances supplémentaires qui peuvent vous aider à diagnostiquer les goulots d’étranglement au niveau des E/S :
Disque physique : Tous les compteurs
Disque physique : moyenne de s/transfert du disque
SQL Server : Bases de données > Temps d'attente de vidage du journal
SQL Server : Bases de données > Attentes de vidage du journal/s
SQL Server : Bases de données > Journaliser les lectures du disque/s du pool
Si vous identifiez un goulot d’étranglement au niveau des E/S et que vous avez placé le fichier journal et le fichier de données sur le même disque dur, la première chose à faire consiste à placer le fichier de données et le fichier journal sur des disques distincts. Cette pratique empêche la charge de travail de création de rapports de perturber le chemin de transfert du réplica principal au tampon journal et sa capacité à renforcer la transaction sur le réplica secondaire.
Étapes suivantes
Résolution des problèmes de performances dans SQL Server (s’applique à SQL Server 2012)