Explication de la parité Unraid

Explication de la parité Unraid

septembre 30, 2021 0 Par Tobias

La parité est utilisée par unRAID pour se protéger contre la perte de données. Si un lecteur de la matrice tombe en panne, les données des autres lecteurs peuvent être combinées avec les données de parité pour reconstituer les données manquantes.

Pourquoi avoir la parité ? Parce qu’il n’existe que deux types de disques durs dans le monde :

  • Les disques durs qui sont déjà tombés en panne.
  • Les disques durs qui ne sont pas encore tombés en panne, mais qui ont juste besoin d’un peu plus de temps avant de tomber en panne.

Comment fonctionne la parité

En général, un processus de parité est conçu pour détecter un changement de bit unique dans un ensemble de bits donné, en fixant la valeur d’un bit ajouté de telle sorte que la somme de cet ensemble de bits soit forcée à une valeur connue. Le bit ajouté est connu sous le nom de bit de parité.

Dans unRAID, les bits de parité sont stockés sur un lecteur de parité indépendant des lecteurs de données. Ce bit de parité fonctionne sur l’ensemble des bits dans la même position relative sur chaque lecteur. Ainsi, le 57ème bit du lecteur de parité est le bit de parité pour le 57ème bit de tous les lecteurs de données. Un contrôle de parité de la position du 57ème bit additionne donc tous les 57èmes bits de chaque lecteur, y compris le lecteur de parité, et vérifie que le total est un nombre ÉGAL. Si la valeur renvoyée n’est pas PLEINE, alors le bit de parité est basculé pour que le contrôle de parité renvoie un nombre PLEIN.

Pourquoi un nombre ÉGAL ? unRAID utilise une ” parité égale “, ce qui signifie simplement que le processus d’addition (à l’aide d’une opération mathématique appelée ” OU exclusif ” ou ” XOR “) sur cet ensemble de bits doit renvoyer une valeur ÉGALE.

Les données numériques sont stockées sous forme de 1 ou de 0. Ainsi, par exemple :

  • Si vous avez 4 lecteurs avec des valeurs de bit 1,1,1,1, la parité sera 0 (1+1+1+1+0=pair).
  • Si les valeurs binaires sont 1,0,0,0, la parité sera de 1 (1+0+0+0+1=pair).

Lorsqu’un lecteur est ajouté à une matrice unRAID protégée par parité, il est d’abord effacé en écrivant des zéros sur tous les bits de tous les secteurs de ce lecteur. Une valeur nulle n’aura aucun impact sur la parité. Une fois que le nouveau disque est rempli de zéros, unRAID peut le glisser silencieusement dans la matrice sans avoir besoin de reconstruire la parité. Plusieurs disques peuvent être ajoutés simultanément de cette manière.

Reconstruction des données

Il n’y a que deux situations dans lesquelles les données de parité sont utilisées par unRAID pour reconstruire les données :

  • lorsqu’un disque est en cours de reconstruction ; et
  • lorsqu’un secteur défectueux est détecté.

À ces moments-là, tous les disques (y compris la parité) sont lus pour reconstruire les données à écrire sur le disque cible. Comme la somme des bits est toujours égale, unRAID peut reconstruire une seule donnée manquante (la parité ou un disque de données), tant que les autres données sont correctes.

Dans les deux exemples ci-dessus, disons que le deuxième disque tombe en panne.

  • 1+x+1+1+0=pair, x doit être égal à 1
  • 1+x+0+0+1=pair, x doit être égal à 0

La parité étant très importante pour la reconstruction des données, assurez-vous que la parité est correcte en exécutant des contrôles de parité périodiquement.

Si vous retirez physiquement un seul disque de votre matrice, vous serez toujours en mesure de le lire et d’y écrire. Il est “simulé” par la lecture de tous les autres disques de données et de parité. De la même manière, le disque de parité est mis à jour si nécessaire lors de l’écriture sur le disque simulé. Si vous installez maintenant un disque de remplacement, il peut être entièrement reconstruit à partir du contenu reconstitué sur la base de la parité et de tous les autres disques de données.

Vérification de la parité

Dans une synchronisation de parité, le système lit tous les disques de données et écrit la parité calculée sur le disque de parité.

Dans un contrôle de parité, le système lit tous les disques de données et le disque de parité, comparant la parité calculée avec la parité stockée. Cette opération a un drapeau :

 CORRECT - if a parity mismatch occurs, write parity disk with computed parity and report in syslog
 NOCORRECT - just report in syslog

Only the first 100 parity check errors are reported. (The messages in the system log are generated for each sector address where a parity mis-match occurs. So if you tried a parity-check on an array that doesn’t have valid parity, the system log would quickly become massive; hence the limit to 100 messages.)

These parity mis-matches are called ‘sync errors’ or ‘parity sync errors’. They are a count of how many block addresses were found where computed parity did not ‘synchronize’ with (i.e., match) stored parity. (A ‘block’ is 4096 bytes. This is also the linux PAGE size – the fundamental unit of I/O.)

Parity disk being valid means that there is a parity disk present, and sometime in the past a parity sync completed without error (or being cancelled). Once parity sync has completed, the parity disk will always be ‘valid’ (and have a green dot). ‘Valid’ in this sense means that it can be used to reconstruct a failed data disk.

(Actually, ‘valid’ is a status that applies to all array disks, both data disks and the parity disk. If all array disks are valid except for one of them, it means that the one that’s not valid can be reconstructed using the data from all the other ones.)

When a parity check/nocorrect produces errors, why is the Parity disk still marked ‘valid’? This is because if the system marked the parity disk ‘invalid’ because of a handful of parity errors, and then another disk failed, that other disk could not be reconstructed (because now there would be 2 invalid disks in the array). So the entire parity disk isn’t marked invalid because of detected parity errors. Of course, a user can always deem parity invalid by un-assigning it.

Once parity has been calculated there should only be 2 ways that there should be parity check errors:

  • Un arrêt non propre, c’est-à-dire une perte de puissance soudaine ou une réinitialisation du système. Dans ce cas, il peut y avoir des écritures en attente sur les disques de parité et/ou de données qui ne sont pas terminées, laissant la bande correspondante avec une parité incohérente.
  • Un défaut matériel non détecté (tel qu’une corruption silencieuse de la mémoire).

Le disque de parité

Taille

La taille du disque de parité doit être égale ou supérieure à celle du plus grand disque de données.

Performance

L’utilisation de la parité pour protéger vos données a inévitablement un impact sur les performances lorsque vous écrivez des données sur la matrice. Chaque fois qu’un disque de données est écrit, le disque de parité doit également être mis à jour. Chaque écriture sur un disque de données UnRAID protégé par parité entraîne 4 opérations sur le disque : une lecture et une écriture pour la parité, et une lecture et une écriture pour les données. Le plateau de chaque disque doit effectuer un tour complet après la lecture pour positionner la tête du disque sur le secteur en cours d’écriture.

L’écriture sur la matrice unRAID est également limitée par le lecteur le plus lent (vitesse de rotation) impliqué. Si seul le lecteur de parité est un lecteur 7200 RPM, vous êtes toujours limité par la vitesse du lecteur de données. Vous ne verrez aucune amélioration de la vitesse d’écriture à moins que plusieurs lecteurs de données plus lents ne soient écrits simultanément, et qu’un lecteur de parité plus rapide à 7200 tr/min n’essaie de suivre le rythme des deux.

Double parité

Pour les grandes matrices, la “double parité” – ou la possibilité d’avoir un deuxième disque de parité qui n’est pas simplement un miroir du premier. Cela permet d’avoir deux pannes de disque simultanées sans perdre de données.

Dans un système de redondance P + Q (comme dans un système RAID-6), il y aurait deux disques de redondance : ‘P’, qui est la parité XOR ordinaire, et ‘Q’, qui est un code Reed-Solomon. Ceci permet à unRAID de récupérer de n’importe quelle erreur de deux disques, avec un impact minimal sur les performances (il est nécessaire de clarifier que ceci est réellement utilisé).

Share