
Voici Ă quoi ressemble la redondance
Les codes de redondance* sont largement utilisés dans les systÚmes informatiques pour améliorer la fiabilité du stockage des données. Chez Yandex, ils sont utilisés dans de nombreux projets. Par exemple, l'utilisation de codes de redondance à la place de la réplication dans notre systÚme de stockage d'objets interne permet d'économiser des millions sans diminuer la fiabilité. Mais malgré leur large utilisation, une description claire de leur fonctionnement est rare. Ceux qui souhaitent comprendre se heurtent généralement à ce qui suit (voir ):

Je m'appelle Vadim, et chez Yandex, je travaille sur le développement du systÚme de stockage d'objets interne MDS. Dans cet article, je vais expliquer les principes théoriques des codes de redondance (codes de Reed-Solomon et LRC) en des termes simples. Je vais décrire leur fonctionnement sans mathématiques complexes ni termes rares. à la fin, je donnerai des exemples d'utilisation des codes de redondance chez Yandex.
Je ne vais pas aborder en dĂ©tail certains aspects mathĂ©matiques, mais je fournirai des liens pour ceux qui souhaitent approfondir. Je souligne Ă©galement que certaines dĂ©finitions mathĂ©matiques peuvent ne pas ĂȘtre strictes, car l'article s'adresse non pas Ă des mathĂ©maticiens mais Ă des ingĂ©nieurs dĂ©sireux de comprendre le cĆur du sujet.
* Dans la littérature anglophone, les codes de redondance sont souvent appelés erasure codes.
1. La nature des codes de redondance
La nature de tous les codes de redondance est extrĂȘmement simple : stocker (ou transmettre) des donnĂ©es de maniĂšre Ă ce qu'elles ne soient pas perdues en cas d'erreurs (pannes de disque, erreurs de transmission des donnĂ©es, etc.).
Dans la plupart des* codes de redondance, les données sont divisées en n blocs de données, et m blocs de codes de redondance sont générés, ce qui donne un total de n + m blocs. Les codes de redondance sont construits de maniÚre à ce que l'on puisse récupérer n blocs de données en n'utilisant qu'une partie des n + m blocs. Nous allons ici examiner uniquement les codes de redondance bloqués, c'est-à -dire ceux dans lesquels les données sont divisées en blocs.

Pour récupérer tous les n blocs de données, il faut au minimum n des n + m blocs, car il est impossible d'obtenir n blocs avec seulement n-1 bloc (dans ce cas, il faudrait prendre 1 bloc « dans l'air »). Suffit-il d'avoir n blocs aléatoires parmi n + m blocs pour restaurer toutes les données ? Cela dépend du type de codes dRedondance, par exemple les codes de Reed-Solomon permettent de récupérer toutes les données avec des blocs aléatoires n, tandis que les codes de redondance LRC ne le permettent pas toujours.
Stockage des données
Dans les systĂšmes de stockage de donnĂ©es, en rĂšgle gĂ©nĂ©rale, chacun des blocs de donnĂ©es et des blocs de codes de redondance est enregistrĂ© sur un disque distinct. Ainsi, en cas de panne d'un disque alĂ©atoire, les donnĂ©es d'origine pourront toujours ĂȘtre restaurĂ©es et lues. Les donnĂ©es pourront ĂȘtre restaurĂ©es mĂȘme en cas de panne simultanĂ©e de plusieurs disques.
Transmission de données
Les codes de redondance peuvent ĂȘtre utilisĂ©s pour une transmission fiable des donnĂ©es sur un rĂ©seau peu fiable. Les donnĂ©es transmises sont divisĂ©es en blocs, pour lesquels des codes de redondance sont calculĂ©s. Tant les blocs de donnĂ©es que les blocs de codes de redondance sont transmis sur le rĂ©seau. En cas d'erreurs dans des blocs alĂ©atoires (jusqu'Ă un certain nombre de blocs), les donnĂ©es peuvent tout de mĂȘme ĂȘtre transmises sans erreur sur le rĂ©seau. Les codes de Reed-Solomon, par exemple, sont utilisĂ©s pour la transmission de donnĂ©es sur des lignes de communication optique et dans les communications par satellite.
* Il existe également des codes de redondance dans lesquels les données ne sont pas divisées en blocs, comme les codes de Hamming et les codes CRC, largement utilisés pour la transmission de données dans les réseaux Ethernet. Ce sont des codes de codage à épreuve d'erreurs, destinés à la détection des erreurs plutÎt qu'à leur correction (le code de Hamming permet également de corriger partiellement les erreurs).
2. Codes de Reed-Solomon
Les codes de Reed-Solomon sont parmi les codes de redondance les plus largement utilisés, inventés dans les années 1960 et qui ont d'abord été largement appliqués dans les années 1980 pour la production en série de disques compacts.
Deux questions clés pour comprendre les codes de Reed-Solomon sont : 1) comment créer des blocs de codes de redondance ; 2) comment restaurer les données à l'aide de blocs de codes de redondance. Trouvons les réponses à ces questions.
Pour simplifier, nous allons considĂ©rer que n=6 et m=4. D'autres schĂ©mas peuvent ĂȘtre examinĂ©s par analogie.
Comment créer des blocs de codes de redondance
Chaque bloc de codes d'erreur est comptĂ© indĂ©pendamment des autres. Pour le calcul de chaque bloc, tous les n blocs de donnĂ©es sont utilisĂ©s. Dans le schĂ©ma ci-dessous, X1-X6 reprĂ©sentent les blocs de donnĂ©es, P1âP4 les blocs de codes d'erreur.

Tous les blocs de donnĂ©es doivent ĂȘtre de la mĂȘme taille. Des bits nuls peuvent ĂȘtre utilisĂ©s pour l'alignement. Les blocs de codes d'erreur obtenus auront la mĂȘme taille que les blocs de donnĂ©es. Tous les blocs de donnĂ©es sont divisĂ©s en mots (par exemple, de 16 bits). Supposons que nous avons divisĂ© les blocs de donnĂ©es en k mots. Alors, tous les blocs de codes d'erreur seront Ă©galement divisĂ©s en k mots.

Pour le calcul du iÚme mot de chaque bloc de codes d'erreur, les iÚmes mots de tous les blocs de données seront utilisés. Ils seront calculés selon la formule suivante :

Ici, les valeurs x représentent les mots des blocs de données, p les mots des blocs de codes d'erreur, et tous les alpha, beta, gamma et delta sont des nombres spécifiquement choisis, identiques pour tous les i. Il faut préciser que toutes ces valeurs ne sont pas des nombres ordinaires, mais des éléments du corps de Galois, avec des opérations +, -, *, / qui ne sont pas les opérations habituelles, mais des opérations spéciales définies sur les éléments du corps de Galois.
Pourquoi les corps de Galois sont-ils nécessaires ?

à premiÚre vue, cela semble simple : nous divisons les données en blocs, les blocs en mots, et avec les mots des blocs de données, nous calculons les mots des blocs de codes d'erreur, et nous obtenons les blocs de codes d'erreur. En général, c'est ainsi que cela fonctionne, mais le diable est dans les détails :
- Comme mentionnĂ© ci-dessus, la taille du mot est fixe, dans notre exemple 16 bits. Les formules ci-dessus pour les codes de Reed-Solomon sont telles que, lorsque des entiers ordinaires sont utilisĂ©s, le rĂ©sultat du calcul de p peut ne pas ĂȘtre reprĂ©sentable par un mot de taille admissible.
- Lors de la rĂ©cupĂ©ration des donnĂ©es, les formules ci-dessus seront considĂ©rĂ©es comme un systĂšme d'Ă©quations Ă rĂ©soudre pour rĂ©cupĂ©rer les donnĂ©es. Dans le processus de rĂ©solution, il peut ĂȘtre nĂ©cessaire de diviser des entiers les uns par les autres, ce qui aboutira Ă un nombre rĂ©el qui ne peut pas ĂȘtre reprĂ©sentĂ© avec prĂ©cision en mĂ©moire informatique.
Ces problĂšmes empĂȘchent d'utiliser des entiers pour les codes de Reed-Solomon. La solution est originale et peut ĂȘtre dĂ©crite comme suit : inventons des nombres spĂ©ciaux qui peuvent ĂȘtre reprĂ©sentĂ©s par des mots de longueur appropriĂ©e (par exemple, 16 bits), et le rĂ©sultat de toutes les opĂ©rations sur eux (addition, soustraction, multiplication, division) sera Ă©galement reprĂ©sentĂ© en mĂ©moire de l'ordinateur par des mots de la mĂȘme longueur.
Ces « nombres spéciaux » sont étudiés depuis longtemps par les mathématiciens, et on les appelle des corps. Un corps est un ensemble d'éléments avec des opérations de addition, soustraction, multiplication et division définies.
Les corps de Galois* sont des corps pour lesquels il existe un et un seul rĂ©sultat pour chaque opĂ©ration (+, -, *, /) pour n'importe quelle paire d'Ă©lĂ©ments du corps. Des corps de Galois peuvent ĂȘtre construits pour des nombres qui sont des puissances de 2 : 2, 4, 8, 16, etc. (en rĂ©alitĂ©, toute puissance d'un nombre premier p, mais en pratique, nous nous intĂ©ressons uniquement aux puissances de 2). Par exemple, pour des mots de taille 16 bits, ce corps contient 65 536 Ă©lĂ©ments, pour chaque paire desquels il est possible de trouver le rĂ©sultat de toute opĂ©ration (+, -, *, /). Les valeurs x, p, alpha, beta, gamma, delta des Ă©quations ci-dessus seront considĂ©rĂ©es comme des Ă©lĂ©ments du corps de Galois lors des calculs.
Ainsi, nous avons un systĂšme d'Ă©quations qui permet de construire des blocs de codes de redondance en Ă©crivant un programme informatique adĂ©quat. Ce mĂȘme systĂšme d'Ă©quations peut ĂȘtre utilisĂ© pour rĂ©cupĂ©rer des donnĂ©es.
* Ce n'est pas une définition stricte, plutÎt une description.
Comment récupérer des données
La récupération est nécessaire lorsque, dans n + m blocs, une partie des blocs est manquante. Cela peut concerner à la fois des blocs de données et des blocs de codes de redondance. L'absence de blocs de données et/ou de blocs de codes de redondance signifie que dans les équations ci-dessus, les variables correspondantes x et/ou p sont inconnues.
Les Ă©quations pour les codes de Reed-Solomon peuvent ĂȘtre considĂ©rĂ©es comme un systĂšme d'Ă©quations dans lequel toutes les valeurs alpha, beta, gamma, delta sont des constantes, tous les x et p correspondant aux blocs disponibles sont des variables connues, tandis que les autres x et p sont inconnus.
Par exemple, supposons que les blocs de données 1, 2, 3 et le bloc de codes de redondance 2 soient indisponibles, alors pour le iÚme groupe de mots, le systÚme d'équations suivant sera le suivant (les inconnues sont marquées en rouge) :

Nous avons un systÚme de 4 équations avec 4 inconnues, ce qui signifie que nous pouvons le résoudre et récupérer les données !
De ce systÚme d'équations découlent plusieurs conclusions sur la restauration des données pour les codes de Reed-Solomon (n blocs de données, m blocs de codes de redondance) :
- Les donnĂ©es peuvent ĂȘtre rĂ©cupĂ©rĂ©es en cas de perte de n'importe quels m blocs ou moins. En cas de perte de m+1 blocs ou plus, les donnĂ©es ne peuvent pas ĂȘtre rĂ©cupĂ©rĂ©es : il est impossible de rĂ©soudre un systĂšme de m Ă©quations avec m + 1 inconnues.
- Pour restaurer mĂȘme un seul bloc de donnĂ©es, il faut utiliser n'importe quels n des blocs restants, tout en pouvant utiliser n'importe quel code de redondance.
Que faut-il savoir d'autre
Dans la description ci-dessus, j'ignore un certain nombre de questions importantes, dont l'examen nécessite une plongée plus approfondie dans les mathématiques. En particulier, je ne dis rien sur ce qui suit :
- Le systĂšme d'Ă©quations pour les codes de Reed-Solomon doit avoir une (unique) solution quelle que soit la combinaison des inconnues (pas plus de m inconnues). Ă partir de cette exigence, les valeurs d'alpha, bĂȘta, gamma, et delta sont choisies.
- Le systĂšme d'Ă©quations doit ĂȘtre capable d'ĂȘtre construit automatiquement (selon les blocs qui sont inaccessibles) et rĂ©solu.
- Il faut construire un corps de Galois : pour une taille de mot donnée, savoir trouver le résultat de n'importe quelle opération (+, -, *, /) pour deux éléments quelconques.
à la fin de l'article, il y a des liens vers la littérature sur ces questions importantes.
Choix de n et m
Comment choisir pratiquement n et m ? Dans la pratique, dans les systÚmes de stockage de données, les codes de redondance sont utilisés pour économiser de l'espace, donc m est toujours choisi inférieur à n. Leurs valeurs spécifiques dépendent de plusieurs facteurs, y compris :
- FiabilitĂ© du stockage des donnĂ©es. Plus m est grand, plus le nombre de pannes de disque pouvant ĂȘtre tolĂ©rĂ© est Ă©levĂ©, donc plus la fiabilitĂ© est accrue.
- Redondance du stockage. Plus le ratio m/n est élevé, plus la redondance du stockage sera importante, et plus le coût du systÚme sera élevé.
- Temps de traitement des requĂȘtes. Plus la somme n + m est grande, plus le temps de rĂ©ponse aux requĂȘtes sera long. En effet, pour lire les donnĂ©es (en cas de restauration), il faut lire n blocs, stockĂ©s sur n disques diffĂ©rents, donc le temps de lecture sera dĂ©terminĂ© par le disque le plus lent.
De plus, le stockage des donnĂ©es dans plusieurs centres de donnĂ©es impose des restrictions supplĂ©mentaires sur le choix de n et m : lors de la dĂ©faillance d'un centre de donnĂ©es, les donnĂ©es doivent toujours ĂȘtre accessibles en lecture. Par exemple, lorsque des donnĂ©es sont stockĂ©es dans 3 centres de donnĂ©es, la condition suivante doit ĂȘtre remplie : m >= n/2, sinon il se peut que les donnĂ©es ne soient pas accessibles en lecture lors de la dĂ©connexion d'un centre de donnĂ©es.
3. LRC â Codes de Reconstruction Locaux
Pour récupérer les données à l'aide des codes de Reed-Solomon, il est nécessaire d'utiliser n blocs de données arbitraires. C'est un inconvénient majeur pour les systÚmes de stockage de données répartis, car pour récupérer les données d'un disque défectueux, il faudra lire les données de la plupart des autres disques, créant ainsi une charge supplémentaire importante sur les disques et le réseau.
Les erreurs les plus courantes sont l'indisponibilité d'un bloc de données en raison de la panne ou de la surcharge d'un disque. Peut-on réduire la charge excessive lors de la récupération des données dans un tel cas (le plus fréquent) ? Il s'avÚre que oui : des codes de redondance LRC existent spécifiquement à cet effet.
LRC (Local Reconstruction Codes) â codes de redondance conçus par Microsoft pour une utilisation dans Windows Azure Storage. L'idĂ©e des LRC est trĂšs simple : diviser tous les blocs de donnĂ©es en deux (ou plusieurs) groupes et calculer une partie des blocs de codes de redondance pour chaque groupe sĂ©parĂ©ment. Ainsi, une partie des blocs de codes de redondance sera calculĂ©e Ă l'aide de tous les blocs de donnĂ©es (dans les LRC, ils sont appelĂ©s codes de redondance globaux), et une autre partie â Ă l'aide de l'un des deux groupes de blocs de donnĂ©es (appelĂ©s codes de redondance locaux).
Les LRC sont notĂ©s par trois nombres : n-r-l, oĂč n est le nombre de blocs de donnĂ©es, r est le nombre de blocs de codes de redondance globaux, et l est le nombre de blocs de codes de redondance locaux. Pour lire les donnĂ©es lors de l'indisponibilitĂ© d'un bloc de donnĂ©es, il suffit de lire seulement n/l blocs â c'est l fois moins que dans les codes de Reed-Solomon.
Prenons par exemple le schĂ©ma LRC 6-2-2. X1âX6 â 6 blocs de donnĂ©es, P1, P2 â 2 blocs de redondance globaux, P3, P4 â 2 blocs de redondance locaux.

Les blocs de codes de redondance P1, P2 sont calculĂ©s Ă l'aide de tous les blocs de donnĂ©es. Le bloc de codes de redondance P3 â Ă l'aide des blocs de donnĂ©es X1âX3, le bloc de codes de redondance P4 â Ă l'aide des blocs de donnĂ©es X4âX6.
Le reste se fait dans LRC de la mĂȘme maniĂšre que pour les codes de Reed-Solomon. Les Ă©quations pour le calcul des mots des blocs de codes d'excĂ©dent seront les suivantes :

Pour sélectionner les nombres alpha, beta, gamma, delta, il est nécessaire de respecter une série de conditions garantissant la possibilité de récupérer les données (c'est-à -dire de résoudre le systÚme d'équations). Vous pouvez en savoir plus à ce sujet dans .
En pratique, l'opération XOR est également utilisée pour le calcul des codes d'excédent locaux P3, P4.
Du systÚme d'équations pour LRC, on peut tirer plusieurs conclusions :
- Pour récupérer n'importe quel bloc de données, il suffit de lire n/l blocs (n/2 dans notre exemple).
- Si r + l blocs ne sont pas accessibles et que tous les blocs appartiennent Ă un mĂȘme groupe, alors les donnĂ©es ne peuvent pas ĂȘtre rĂ©cupĂ©rĂ©es. Cela peut ĂȘtre illustrĂ© par un exemple. Supposons que les blocs X1âX3 et P3 ne soient pas accessibles : ce sont r + l blocs d'un mĂȘme groupe, soit 4 dans notre cas. Nous avons alors un systĂšme de 3 Ă©quations avec 4 inconnues, qui ne peut pas ĂȘtre rĂ©solu.
- Dans tous les autres cas d'indisponibilitĂ© de r + l blocs (lorsqu'au moins un bloc de chaque groupe est accessible), les donnĂ©es dans LRC peuvent ĂȘtre rĂ©cupĂ©rĂ©es.
Ainsi, LRC a un avantage sur les codes de Reed-Solomon en matiĂšre de rĂ©cupĂ©ration de donnĂ©es aprĂšs des erreurs simples. Dans les codes de Reed-Solomon, pour rĂ©cupĂ©rer mĂȘme un seul bloc de donnĂ©es, n blocs doivent ĂȘtre utilisĂ©s, tandis que dans LRC, il suffit d'utiliser n/l blocs (n/2 dans notre exemple) pour rĂ©cupĂ©rer un bloc de donnĂ©es. D'un autre cĂŽtĂ©, LRC est dĂ©savantagĂ© par rapport aux codes de Reed-Solomon en ce qui concerne le nombre maximum d'erreurs tolĂ©rĂ©es. Dans les exemples ci-dessus, les codes de Reed-Solomon peuvent rĂ©cupĂ©rer des donnĂ©es mĂȘme avec 4 erreurs, alors que pour LRC, il existe 2 combinaisons de 4 erreurs oĂč les donnĂ©es ne peuvent pas ĂȘtre rĂ©cupĂ©rĂ©es.
Ce qui est plus important dépend de la situation concrÚte, mais souvent, l'économie de surcharge d'excédent que LRC offre l'emporte sur une fiabilité de stockage légÚrement inférieure.
4. Autres codes d'excédent
Outre les codes de Reed-Solomon et LRC, il existe de nombreux autres codes d'excédent. Différents codes d'excédent utilisent des mathématiques différentes. Voici quelques autres codes d'excédent :
- Code d'excĂ©dent utilisant un opĂ©rateur XOR. L'opĂ©ration XOR est effectuĂ©e sur n blocs de donnĂ©es, et un bloc de codes d'excĂ©dent en rĂ©sulte, soit le schĂ©ma n+1 (n blocs de donnĂ©es, 1 code d'excĂ©dent). UtilisĂ© dans , oĂč les blocs de donnĂ©es et de codes d'excĂ©dent sont Ă©crits de maniĂšre cyclique sur tous les disques du tableau.
- L'algorithme even-odd, basé sur l'opération XOR. Permet de construire 2 blocs de codes de redondance, soit le schéma n+2.
- L'algorithme STAR, basé sur l'opération XOR. Permet de construire 3 blocs de codes de redondance, soit le schéma n+3.
- Les codes pyramides â encore des codes de redondance de Microsoft.
5. Utilisation dans Yandex
Plusieurs projets d'infrastructure de Yandex utilisent des codes de redondance pour un stockage fiable des données. Voici quelques exemples :
- Le stockage d'objets interne MDS, dont j'ai parlé au début de l'article.
- â SystĂšme MapReduce de Yandex.
- (Yandex DataBase) â base de donnĂ©es distribuĂ©e newSQL.
Dans MDS, des codes de redondance LRC sont utilisés, le schéma 8-2-2. Les données avec des codes de redondance sont écrites sur 12 disques différents dans différents serveurs dans 3 centres de données : 4 serveurs dans chaque centre de données. Pour plus de détails, lisez .
Dans YT, sont utilisés à la fois des codes de Reed-Solomon (schéma 6-3), qui ont été réalisés en premier, et des codes de redondance LRC (schéma 12-2-2), le LRC étant le moyen de stockage préféré.
Dans YDB, des codes de redondance basés sur even-odd (schéma 4-2) sont utilisés. Des informations sur les codes de redondance dans YDB ont déjà été .
L'utilisation de diffĂ©rents schĂ©mas de codes de redondance est dĂ©terminĂ©e par les exigences diverses qui sont posĂ©es aux systĂšmes. Par exemple, dans MDS, les donnĂ©es stockĂ©es par LRC sont rĂ©parties sur 3 centres de donnĂ©es. Il est important pour nous que les donnĂ©es restent accessibles en lecture lors d'une panne de n'importe quel centre de donnĂ©es, donc les blocs doivent ĂȘtre distribuĂ©s entre les centres de donnĂ©es de maniĂšre Ă ce qu'en cas d'inaccessibilitĂ© de l'un d'eux, le nombre de blocs inaccessibles ne dĂ©passe pas le seuil acceptable. Dans le schĂ©ma 8-2-2, il est possible de placer 4 blocs dans chaque centre de donnĂ©es, de sorte qu'en cas de dĂ©sactivation de n'importe quel centre de donnĂ©es, 4 blocs seront inaccessibles, mais les donnĂ©es pourront ĂȘtre lues. Quel que soit le schĂ©ma que nous choisissons pour le placement dans 3 centres de donnĂ©es, il doit en tout cas y avoir (r + l) / n >= 0,5, c'est-Ă -dire que la redondance de stockage sera d'au moins 50%.
Dans YT, la situation est différente : chaque cluster YT se trouve entiÚrement dans 1 centre de données (divers clusters dans différents centres de données), donc il n'y a pas de telle restriction. Le schéma 12-2-2 donne une redondance de 33%, donc le stockage des données devient moins cher, tout en permettant également de survivre à 4 pannes simultanées de disques, tout comme dans le schéma MDS.
Il existe encore de nombreuses particularitĂ©s concernant l'application des codes de redondance dans les systĂšmes de stockage et de traitement des donnĂ©es : nuances de la rĂ©cupĂ©ration des donnĂ©es, impact de la rĂ©cupĂ©ration sur le temps de rĂ©ponse, particularitĂ©s de l'Ă©criture des donnĂ©es, etc. Je prĂ©vois d'aborder sĂ©parĂ©ment ces aspects et d'autres concernant l'application des codes de redondance dans la pratique, si le sujet suscite de l'intĂ©rĂȘt.
6. Liens
- Série d'articles sur les codes de Reed-Solomon et les champs de Galois :
Ils abordent la mathématique de maniÚre accessible. - Article de Microsoft sur LRC :
Dans la section 2, la théorie est briÚvement expliquée, suivie d'une discussion sur l'expérience de l'application de LRC dans la pratique. - Schéma even-odd :
- Schéma STAR :
- Codes pyramidaux :
- Codes de redondance dans MDS :
- Codes de redondance dans YT :
- Codes de redondance dans YDB :
Source : habr.com
