{"id":87758,"date":"2020-07-10T01:41:58","date_gmt":"2020-07-09T23:41:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye"},"modified":"2020-07-10T01:41:58","modified_gmt":"2020-07-09T23:41:58","slug":"kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye","title":{"rendered":"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/4d853e314dfea596b45a6aff00238bea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>S\u00e5dan ser redundans ud<\/em><\/p>\n<p><\/p>\n<p>Redundanskoder* anvendes i vid udstr\u00e6kning i computersystemer for at \u00f8ge p\u00e5lideligheden af datalagring. I Yandex anvendes de i mange projekter. For eksempel sparer brugen af redundanskoder i stedet for replikation i vores interne objektlagersystem millioner uden at mindske p\u00e5lideligheden. Men p\u00e5 trods af den brede anvendelse er en forst\u00e5elig beskrivelse af, hvordan redundanskoder fungerer, meget sj\u00e6lden. Dem, der \u00f8nsker at forst\u00e5 det, st\u00f8der ofte p\u00e5 f\u00f8lgende (fra <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%B4_%D0%A0%D0%B8%D0%B4%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%BC%D0%BE%D0%BD%D0%B0\">Wikipedia<\/a><\/noindex>):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/c5e592acd8c1e113c099357d1ba48d5c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mit navn er Vadim, og i Yandex arbejder jeg med udviklingen af det interne objektlagersystem MDS. I denne artikel vil jeg med enkle ord beskrive de teoretiske grundlag for redundanskoder (Reed-Solomon koder og LRC). Jeg vil forklare, hvordan det fungerer, uden kompliceret matematik og sj\u00e6ldne termer. Til sidst vil jeg give eksempler p\u00e5 brugen af redundanskoder i Yandex.<\/p>\n<p><\/p>\n<p>Jeg vil ikke g\u00e5 i dybden med en r\u00e6kke matematiske detaljer, men jeg vil give links til dem, der \u00f8nsker at dykke dybere ned i emnet. Jeg bem\u00e6rker ogs\u00e5, at nogle matematiske definitioner muligvis ikke er strenge, da artiklen ikke er beregnet til matematikere, men til ingeni\u00f8rer, der \u00f8nsker at forst\u00e5 essensen af sp\u00f8rgsm\u00e5let.<\/p>\n<p><\/p>\n<p>* I den engelsksprogede litteratur kaldes redundanskoder ofte erasure codes.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"1-sut-kodov-izbytochnosti\">1. Essence af redundanskoder<\/h1>\n<p><\/p>\n<p>Essensen af alle redundanskoder er ekstremt simpel: at lagre (eller overf\u00f8re) data p\u00e5 en m\u00e5de, s\u00e5 de ikke g\u00e5r tabt ved fejl (diskfejl, dataoverf\u00f8rselsfejl osv.). <\/p>\n<p><\/p>\n<p>I de fleste* redundanskoder opdeles data i n datablokke, hvortil der genereres m redundansblokke, hvilket i alt giver n + m blokke. Redundanskoderne konstrueres, s\u00e5 det er muligt at genskabe n datablokke ved kun at bruge en del af n + m blokke. Her vil vi kun se p\u00e5 blok redundanskoder, det vil sige dem, hvor data opdeles i blokke.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/1273b4643f915dd615026ec38ca56473.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For recovering all n data blocks, you need at least n out of n + m blocks, as you cannot obtain n blocks with only n-1 block (in this case, you would have to take 1 block \"out of thin air\"). Are n arbitrary blocks from n + m blocks sufficient for recovering all data? This depends on the type of redundancy codes; for instance, Reed-Solomon codes allow recovering all data with arbitrary n blocks, while LRC redundancy codes do not always do so.<\/p>\n<p><\/p>\n<h3 id=\"hranenie-dannyh\">Dataopbevaring<\/h3>\n<p><\/p>\n<p>In data storage systems, typically each of the data blocks and the redundancy code blocks is written to a separate disk. Thus, if any disk fails, the original data can still be recovered and read. Data can be recovered even in the case of simultaneous failures of multiple disks.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh\">Overf\u00f8rsel af data<\/h3>\n<p><\/p>\n<p>Redundancy codes can be used for reliable data transmission over unreliable networks. The transmitted data is divided into blocks, for which redundancy codes are calculated. Both data blocks and redundancy code blocks are transmitted over the network. In case of errors in arbitrary blocks (up to a certain number of blocks), the data can still be transmitted reliably over the network. Reed-Solomon codes, for example, are used for data transmission over optical communication lines and in satellite communication.<\/p>\n<p><\/p>\n<p>* There are also redundancy codes in which data is not divided into blocks, such as Hamming codes and CRC codes, widely used for data transmission in Ethernet networks. These are codes for error-resistant encoding, intended for error detection rather than correction (Hamming code also allows partial error correction).<\/p>\n<p><\/p>\n<h1 id=\"2-kody-rida--solomona\">2. Reed-Solomon Codes<\/h1>\n<p><\/p>\n<p>Reed-Solomon codes are among the most widely used redundancy codes, invented back in the 1960s and first widely applied in the 1980s for mass production of compact discs.<\/p>\n<p><\/p>\n<p>There are two key questions for understanding Reed-Solomon codes: 1) how to create redundancy code blocks; 2) how to recover data using redundancy code blocks. Let's find the answers to them.<br \/>\nFor simplicity, we will assume that n=6 and m=4. Other schemes are considered by analogy.<\/p>\n<p><\/p>\n<h3 id=\"kak-sozdavat-bloki-kodov-izbytochnosti\">How to create redundancy code blocks<\/h3>\n<p><\/p>\n<p>Hver blok af redundant kode betragtes uafh\u00e6ngigt af de andre. For at t\u00e6lle hver blok anvendes alle n datablokke. P\u00e5 diagrammet herunder er X1-X6 datablokke, P1\u2013P4 er blokke af redundant kode.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/b4841e48a5f2f059376bb458a26c6235.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alle datablokke skal have samme st\u00f8rrelse, skal nul-fyldte bits bruges til at justere. De resulterende blokke af redundant kode vil have samme st\u00f8rrelse som datablokkene. Alle datablokke opdeles i ord (f.eks. 16 bit). Antag, at vi opdeler datablokke i k ord. S\u00e5 vil alle blokke af redundant kode ogs\u00e5 blive opdelt i k ord.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/fff9c998a760e3f05ef45497557888a9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For at beregne det i'te ord i hver blok af redundant kode vil de i'te ord fra alle datablokke blive anvendt. De vil blive beregnet ved hj\u00e6lp af f\u00f8lgende formel:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/8f52209ef7f628c8a748325b1a30c2d4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Her er v\u00e6rdierne x \u2013 ord fra datablokkene, p \u2013 ord fra blokke af redundant kode, alle alfa, beta, gamma og delta er specifikt udvalgte tal, der er ens for alle i. Det skal straks siges, at alle disse v\u00e6rdier ikke er almindelige tal, men elementer i Galois-feltet, operationerne +, -, *, \/ er ikke de velkendte operationer, men specielle operationer defineret over elementerne i Galois-feltet.<\/p>\n<p><\/p>\n<h3 id=\"zachem-nuzhny-polya-galua\">Hvorfor er Galois-felter n\u00f8dvendige<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/94ed4514ae15b01e7869efdeb9a605c6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det synes at v\u00e6re enkelt: opdelt data i blokke, blokke i ord, ved hj\u00e6lp af ord fra datablokkene beregner vi ord fra blokke af redundant kode \u2013 vi f\u00e5r blokke af redundant kode. Generelt fungerer det s\u00e5dan, men detaljerne kan v\u00e6re komplicerede:<\/p>\n<p><\/p>\n<ol>\n<li>Som n\u00e6vnt er st\u00f8rrelsen af et ord fast, i vores eksempel 16 bit. Formlerne ovenfor for Reed-Solomon-koder er s\u00e5dan, at ved brug af almindelige heltal kan resultatet af beregningen p muligvis ikke repr\u00e6senteres med et ord af en tilladt st\u00f8rrelse.<\/li>\n<li>Ved genopretning af data vil formlerne ovenfor blive betragtet som et system af ligninger, der skal l\u00f8ses for at genoprette data. Under l\u00f8sningen kan det v\u00e6re n\u00f8dvendigt at udf\u00f8re division af heltal, hvilket resulterer i et reelt tal, som ikke kan repr\u00e6senteres pr\u00e6cist i computerens hukommelse.<\/li>\n<\/ol>\n<p><\/p>\n<p>Disse problemer forhindrer brugen af heltal til Reed-Solomon-koder. L\u00f8sningen p\u00e5 problemet er original og kan beskrives s\u00e5ledes: lad os finde specielle tal, der kan repr\u00e6senteres ved hj\u00e6lp af ord af den n\u00f8dvendige l\u00e6ngde (f.eks. 16 bit), og resultatet af alle operationer (addition, subtraktion, multiplikation, division) udf\u00f8rt p\u00e5 dem ogs\u00e5 vil blive repr\u00e6senteret i computeren med ord af den n\u00f8dvendige l\u00e6ngde.<\/p>\n<p><\/p>\n<p>S\u00e5danne \"specielle\" tal er blevet studeret af matematik i lang tid, og de kaldes felter. Et felt er en samling af elementer med bestemte operationer for dem, s\u00e5som addition, subtraktion, multiplikation og division.<\/p>\n<p><\/p>\n<p>Galois-felter* er de felter, for hvilke der eksisterer en entydig udfald for hver operation (+, -, *, \/) for enhver to elementer i feltet. Galois-felter kan konstrueres for tal, der er en potens af 2: 2, 4, 8, 16 osv. (faktisk en potens af ethvert primtal p, men i praksis er vi kun interesseret i potenser af 2). For eksempel, for ord med en st\u00f8rrelse p\u00e5 16 bit, er dette feltet, der indeholder 65.536 elementer, for hvilket der for hvert par kan findes resultatet af enhver operation (+, -, *, \/). V\u00e6rdierne x, p, alfa, beta, gamma, delta fra de ovenst\u00e5ende ligninger vil blive betragtet som elementer i Galois-feltet til beregninger.<\/p>\n<p><\/p>\n<p>Dermed har vi et system af ligninger, som kan bruges til at konstruere redundanskoder, ved hj\u00e6lp af et passende computerprogram. Med det samme system af ligninger kan data ogs\u00e5 genskabes.<\/p>\n<p><\/p>\n<p>* Dette er ikke en striks definition, snarere en beskrivelse.<\/p>\n<p><\/p>\n<h3 id=\"kak-vosstanavlivat-dannye\">Hvordan man genskaber data<\/h3>\n<p><\/p>\n<p>Genskabelse er n\u00f8dvendig, n\u00e5r en del af blokke fra n + m blokke mangler. Dette kan v\u00e6re b\u00e5de datablokke og redundansblokke. Manglende datablokke og\/eller redundansblokke vil betyde, at de tilsvarende variable x og\/eller p i de ovenst\u00e5ende ligninger er ukendte.<\/p>\n<p><\/p>\n<p>Ligningerne for Reed-Solomon-koder kan betragtes som et system af ligninger, hvor alle v\u00e6rdier alfa, beta, gamma, delta er konstanter, alle x og p, der svarer til tilg\u00e6ngelige blokke, er kendte variable, mens de \u00f8vrige x og p er ukendte.<\/p>\n<p><\/p>\n<p>For eksempel, lad os sige, at datablokkene 1, 2, 3, og redundansblokken 2 er utilg\u00e6ngelige, s\u00e5 for den i'te gruppe ord vil f\u00f8lgende system af ligninger v\u00e6re (ukendte markeret med r\u00f8dt):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/6f24804c3d34423f31796e43e9ae1203.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har et system best\u00e5ende af 4 ligninger med 4 ubekendte, hvilket betyder, at vi kan l\u00f8se det og genoprette dataene!<\/p>\n<p><\/p>\n<p>Fra dette system af ligninger f\u00f8lger en r\u00e6kke konklusioner om genopretning af data for Reed-Solomon-koder (n datablokke, m redundansblokke):<\/p>\n<p><\/p>\n<ul>\n<li>Data kan genoprettes ved tab af enhver m blokke eller f\u00e6rre. Ved tab af m+1 eller flere blokke kan data ikke genoprettes: det er ikke muligt at l\u00f8se et system med m ligninger og m + 1 ubekendte. <\/li>\n<li>For at genoprette selv \u00e9n datablok kr\u00e6ves det at benytte enhver n af de resterende blokke, og enhver af redundanskoderne kan anvendes.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-eschyo-nuzhno-znat\">Hvad mere skal man vide<\/h3>\n<p><\/p>\n<p>I beskrivelsen ovenfor overser jeg en r\u00e6kke vigtige emner, som kr\u00e6ver en dybere forst\u00e5else af matematik. Specifikt n\u00e6vner jeg ikke f\u00f8lgende:<\/p>\n<p><\/p>\n<ul>\n<li>Systemet af ligninger for Reed-Solomon-koder skal have en (unik) l\u00f8sning for alle kombinationer af ubekendte (h\u00f8jst m ubekendte). Baseret p\u00e5 dette krav v\u00e6lges v\u00e6rdierne for alpha, beta, gamma og delta.<\/li>\n<li>Systemet af ligninger skal automatisk kunne konstrueres (afh\u00e6ngigt af hvilke blokke der ikke er tilg\u00e6ngelige) og l\u00f8ses.<\/li>\n<li>Det er n\u00f8dvendigt at opbygge et Galois-felt: for en given ordsize skal det v\u00e6re muligt at finde resultatet af enhver operation (+, -, *, \/) for ethvert to elementer.<\/li>\n<\/ul>\n<p><\/p>\n<p>I slutningen af artiklen er der links til litteratur om disse vigtige emner.<\/p>\n<p><\/p>\n<h3 id=\"vybor-n-i-m\">Valg af n og m<\/h3>\n<p><\/p>\n<p>Hvordan v\u00e6lger man n og m i praksis? I praksis anvendes redundanskoder i datalagringssystemer for at spare plads, derfor v\u00e6lges m altid mindre end n. Deres specifikke v\u00e6rdier afh\u00e6nger af en r\u00e6kke faktorer, herunder:<\/p>\n<p><\/p>\n<ul>\n<li>Dataopbevaringsp\u00e5lidelighed. Jo h\u00f8jere m, desto st\u00f8rre antal diskfejl kan overleve, og dermed h\u00f8jere p\u00e5lidelighed.<\/li>\n<li>Opbevaringsredundans. Jo h\u00f8jere forholdet m \/ n, desto h\u00f8jere vil opbevaringsredundansen v\u00e6re, og desto dyrere vil systemet blive.<\/li>\n<li>Behandlingstid for foresp\u00f8rgsler. Jo h\u00f8jere summen af n + m, desto l\u00e6ngere vil svartiden v\u00e6re p\u00e5 foresp\u00f8rgsler. Da det for at l\u00e6se data (under genopretning) er n\u00f8dvendigt at l\u00e6se n blokke, der er gemt p\u00e5 n forskellige diske, vil l\u00e6setiden blive bestemt af den langsomste disk.<\/li>\n<\/ul>\n<p><\/p>\n<p>Desuden l\u00e6gger opbevaring af data i flere datacentre yderligere begr\u00e6nsninger p\u00e5 valget af n og m: n\u00e5r \u00e9t datacenter er offline, skal data stadig v\u00e6re tilg\u00e6ngelige for l\u00e6sning. For eksempel, n\u00e5r data opbevares i 3 datacentre, skal betingelsen m &gt;= n\/2 opfyldes; ellers kan der opst\u00e5 en situation, hvor data ikke er tilg\u00e6ngelige for l\u00e6sning, n\u00e5r \u00e9t datacenter er offline.<\/p>\n<p><\/p>\n<h1 id=\"3-lrc--local-reconstruction-codes\">3. LRC \u2014 Lokale Rekonstruktionskoder<\/h1>\n<p><\/p>\n<p>For at rekonstruere data ved hj\u00e6lp af Reed-Solomon-koder er det n\u00f8dvendigt at bruge n vilk\u00e5rlige datablokke. Dette er en s\u00e6rlig ulempe for distribuerede datalagringssystemer, da det kr\u00e6ver, at der l\u00e6ses data fra de fleste resterende skiver for at rekonstruere data p\u00e5 \u00e9n defekt skive, hvilket skaber en betydelig ekstra belastning p\u00e5 skiverne og netv\u00e6rket.<\/p>\n<p><\/p>\n<p>De mest almindelige fejl er utilg\u00e6ngeligheden af \u00e9n datablok p\u00e5 grund af en skives fejl eller overbelastning. Kan man p\u00e5 nogen m\u00e5de reducere den overdrevne belastning ved datagenoprettelse i s\u00e5dan en (den mest almindelige) situation? Det viser sig, at det kan lade sig g\u00f8re: der findes specifikt koder til redundans, LRC, til dette form\u00e5l.<\/p>\n<p><\/p>\n<p>LRC (Lokale Rekonstruktionskoder) er redundanskoder, opfundet i Microsoft til brug i Windows Azure Storage. Ideen bag LRC er ganske simpel: at opdele alle datablokke i to (eller flere) grupper og beregne en del af redundanskoderne for hver gruppe separat. S\u00e5ledes vil en del af redundanskoderne blive beregnet ved hj\u00e6lp af alle datablokke (i LRC kaldes de globale redundanskoder), mens en del vil blive beregnet ved hj\u00e6lp af en af de to grupper af datablokke (de kaldes lokale redundanskoder).<\/p>\n<p><\/p>\n<p>LRC betegnes med tre tal: n-r-l, hvor n er antallet af datablokke, r er antallet af globale redundanskoder, l er antallet af lokale redundanskoder. For at l\u00e6se data, n\u00e5r en datablok ikke er tilg\u00e6ngelig, skal man kun l\u00e6se n\/l blokke, hvilket er l gange mindre end med Reed-Solomon-koder.<\/p>\n<p><\/p>\n<p>Som eksempel kan vi se p\u00e5 LRC-schemas 6-2-2. X1\u2013X6 er 6 datablokke, P1, P2 er 2 globale redundanskoder, P3, P4 er 2 lokale redundanskoder.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/783f6d4b57b992c56385cdd07603cda8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Redundanskoderne P1, P2 beregnes ved hj\u00e6lp af alle datablokke. Redundanskoden P3 beregnes ved hj\u00e6lp af datablokke X1\u2013X3, og redundanskoden P4 beregnes ved hj\u00e6lp af datablokke X4\u2013X6.<\/p>\n<p><\/p>\n<p>Det \u00f8vrige udf\u00f8res i LRC p\u00e5 samme m\u00e5de som Reed-Solomon-koderne. Ligningerne til beregning af ord for redundansblokke vil v\u00e6re s\u00e5ledes:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundanskoder: en simpel forklaring p\u00e5, hvordan man p\u00e5lideligt og billigt opbevarer data\" src=\"\/wp-content\/uploads\/2020\/07\/b32c8864fac0678014fc9a5abf490537.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>For at v\u00e6lge tal som alpha, beta, gamma, delta, skal en r\u00e6kke betingelser opfyldes for at sikre muligheden for datagendannelse (dvs. l\u00f8sningen af ligningssystemet). Du kan l\u00e6se mere om dem i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/LRC12-cheng20webpage.pdf\">artikel<\/a><\/noindex>.<br \/>\nDesuden anvendes operationen XOR i praksis til at beregne lokale redundanskoder P3, P4. <\/p>\n<p><\/p>\n<p>Fra ligningssystemet for LRC f\u00f8lger en r\u00e6kke konklusioner:<\/p>\n<p><\/p>\n<ul>\n<li>For at gendanne en hvilken som helst 1 datablok er det tilstr\u00e6kkeligt at l\u00e6se n\/l blokke (n\/2 i vores eksempel).<\/li>\n<li>Hvis der mangler r + l blokke, og alle blokke tilh\u00f8rer samme gruppe, kan dataene ikke gendannes. Dette kan let forklares med et eksempel. Antag, at blokke X1\u2013X3 og P3 er utilg\u00e6ngelige: det er r + l blokke fra \u00e9n gruppe, 4 i vores tilf\u00e6lde. S\u00e5 har vi et system af 3 ligninger med 4 ukendte, som ikke kan l\u00f8ses.<\/li>\n<li>I alle andre tilf\u00e6lde, hvor r + l blokke er utilg\u00e6ngelige (n\u00e5r der er mindst \u00e9n blok tilg\u00e6ngelig fra hver gruppe), kan dataene i LRC gendannes.<\/li>\n<\/ul>\n<p><\/p>\n<p>S\u00e5ledes overg\u00e5r LRC Reed-Solomon-koderne i datagendannelse efter enkeltfejl. I Reed-Solomon-koderne kr\u00e6ves n blokke for at gendanne selv \u00e9n datablok, mens LRC kun kr\u00e6ver n\/l blokke (n\/2 i vores eksempel) til gendannelse af \u00e9n datablok. P\u00e5 den anden side taber LRC mod Reed-Solomon-koderne med hensyn til det maksimale antal tilladte fejl. I de tidligere eksempler kan Reed-Solomon-koderne gendanne data med op til 4 fejl, mens der for LRC findes 2 kombinationer af 4 fejl, hvor dataene ikke kan gendannes.<\/p>\n<p><\/p>\n<p>Hvad der er vigtigere, afh\u00e6nger af den specifikke situation, men ofte opvejer den besparelse i redundansbelastning, som LRC giver, den lidt lavere datalagringsp\u00e5lidelighed.<\/p>\n<p><\/p>\n<h1 id=\"4-drugie-kody-izbytochnosti\">4. Andre redundanskoder<\/h1>\n<p><\/p>\n<p>Udover Reed-Solomon- og LRC-koderne er der mange andre redundanskoder. Forskellige redundanskoder anvender forskellige matematikker. Her er nogle andre redundanskoder:<\/p>\n<p><\/p>\n<ul>\n<li>Redundanskode ved hj\u00e6lp af XOR-operatoren. XOR-operationen udf\u00f8res over n datablokke, og der opn\u00e5s 1 blok af redundanskode, dvs. schema n+1 (n datablokke, 1 redundanskode). Dette anvendes i <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/RAID#RAID_5\">RAID 5<\/a><\/noindex>, hvor datablokke og redundanskoder cyklisk skrives til alle diske i arrayet.<\/li>\n<li>Even-odd-algoritmen, baseret p\u00e5 XOR-operationen. G\u00f8r det muligt at opbygge 2 redundanskodeblokke, det vil sige en n+2 skema.<\/li>\n<li>STAR-algoritmen, baseret p\u00e5 XOR-operationen. G\u00f8r det muligt at opbygge 3 redundanskodeblokke, det vil sige en n+3 skema.<\/li>\n<li>Pyramidekoder \u2014 endnu en type redundanskoder fra Microsoft.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"5-ispolzovanie-v-yandekse\">5. Brug i Yandex<\/h1>\n<p><\/p>\n<p>En r\u00e6kke infrastrukturprojekter fra Yandex anvender redundanskoder til sikret datalagring. Her er nogle eksempler:<\/p>\n<p><\/p>\n<ul>\n<li>MDS, det interne objektlager, som jeg n\u00e6vnte i begyndelsen af artiklen.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311104\/\">YT<\/a><\/noindex> \u2014 Yandexs MapReduce-system.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=FwLvAuOSIOU\">YDB<\/a><\/noindex> (Yandex DataBase) \u2014 en distribueret NewSQL-database.<\/li>\n<\/ul>\n<p><\/p>\n<p>I MDS anvendes LRC-redundanskoder, skema 8-2-2. Data med redundanskoder skrives til 12 forskellige diske p\u00e5 forskellige servere i 3 forskellige datacentre: 4 servere i hver datacenter. L\u00e6s mere om dette i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311806\/\">artikel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>I YT anvendes b\u00e5de Reed-Solomon-koder (skema 6-3), som blev implementeret f\u00f8rst, og LRC-redundanskoder (skema 12-2-2), hvor LRC er den foretrukne lagringsmetode.<\/p>\n<p><\/p>\n<p>I YDB anvendes redundanskoder baseret p\u00e5 even-odd (skema 4-2). Der er allerede blevet talt om redundanskoder i YDB <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=dCpfGJ35kK8\">p\u00e5 Highload<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Brugen af forskellige skemaer for redundanskoder skyldes forskellige krav, der stilles til systemerne. For eksempel, i MDS placeres data gemt med LRC straks i 3 datacentre. Det er vigtigt for os, at data forbliver tilg\u00e6ngelige for l\u00e6sning, n\u00e5r et af datacentrene g\u00e5r ned, s\u00e5 blokkene skal fordeles mellem datacentrene p\u00e5 en m\u00e5de, s\u00e5 m\u00e6ngden af utilg\u00e6ngelige blokke ikke overstiger det acceptable. I skema 8-2-2 kan der placeres 4 blokke i hvert datacenter, hvilket betyder, at der ved nedlukning af et hvilken som helst datacenter vil v\u00e6re 4 blokke utilg\u00e6ngelige, og dataene kan stadig l\u00e6ses. Uanset hvilket skema vi v\u00e6lger til placering i 3 datacentre, skal der i hvert fald g\u00e6lde, at (r + l) \/ n &gt;= 0,5, det vil sige at redundansen vil v\u00e6re minimum 50%.<\/p>\n<p><\/p>\n<p>I YT er situationen en anden: hver YT-kluster ligger helt i 1 datacenter (forskellige kluster i forskellige datacentre), s\u00e5 der er ikke en s\u00e5dan begr\u00e6nsning. Skema 12-2-2 giver en redundans p\u00e5 33%, hvilket betyder, at lagring af data bliver billigere, samtidig med at de kan modst\u00e5 op til 4 samtidige diskfejl, ligesom skemaet i MDS.<\/p>\n<p><\/p>\n<p>Der er mange flere aspekter ved brugen af redundanskoder i datalagrings- og behandlingssystemer: nuancer ved datagendannelse, indflydelse af gendanserne p\u00e5 foresp\u00f8rgslernes udf\u00f8relsestid, s\u00e6rlige forhold ved dataskrivning osv. Jeg planl\u00e6gger at fort\u00e6lle om disse og andre praktiske anvendelser af redundanskoder, hvis emnet har interesse.<\/p>\n<p><\/p>\n<h1 id=\"6-ssylki\">6. Links<\/h1>\n<p><\/p>\n<ol>\n<li>En serie artikler om Reed-Solomon koder og Galois felter: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yadro\/blog\/336286\/\">https:\/\/habr.com\/ru\/company\/yadro\/blog\/336286\/<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yadro\/blog\/341506\/\">https:\/\/habr.com\/ru\/company\/yadro\/blog\/341506\/<\/a><\/noindex><br \/>\nI dem forklares matematikken dybere p\u00e5 en tilg\u00e6ngelig m\u00e5de.<\/li>\n<li>Artikel fra Microsoft om LRC: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/LRC12-cheng20webpage.pdf\">https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/LRC12-cheng20webpage.pdf<\/a><\/noindex><br \/>\nI afsnit 2 forklares teorien kort, hvorefter erfaringer med praktisk anvendelse af LRC gennemg\u00e5s.<\/li>\n<li>Even-odd schema: <noindex><a rel=\"nofollow\" href=\"https:\/\/people.eecs.berkeley.edu\/~kubitron\/courses\/cs262a-F12\/handouts\/papers\/p245-blaum.pdf\">https:\/\/people.eecs.berkeley.edu\/~kubitron\/courses\/cs262a-F12\/handouts\/papers\/p245-blaum.pdf<\/a><\/noindex><\/li>\n<li>STAR schema: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/legacy\/event\/fast05\/tech\/full_papers\/huang\/huang.pdf\">https:\/\/www.usenix.org\/legacy\/event\/fast05\/tech\/full_papers\/huang\/huang.pdf<\/a><\/noindex><\/li>\n<li>Pyramid koder: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/research\/publication\/pyramid-codes-flexible-schemes-to-trade-space-for-access-efficiency-in-reliable-data-storage-systems\/\">https:\/\/www.microsoft.com\/en-us\/research\/publication\/pyramid-codes-flexible-schemes-to-trade-space-for-access-efficiency-in-reliable-data-storage-systems\/<\/a><\/noindex><\/li>\n<li>Redundanskoder i MDS: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311806\">https:\/\/habr.com\/ru\/company\/yandex\/blog\/311806<\/a><\/noindex> <\/li>\n<li>Redundanskoder i YT: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311104\/\">https:\/\/habr.com\/ru\/company\/yandex\/blog\/311104\/<\/a><\/noindex><\/li>\n<li>Redundanskoder i YDB: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=dCpfGJ35kK8\">https:\/\/www.youtube.com\/watch?v=dCpfGJ35kK8<\/a><\/noindex><\/li>\n<\/ol>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/510050\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u041a\u043e\u0434\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438* \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u043e\u0432 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0431\u0435\u0437 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u043e\u0434\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u043e. \u0416\u0435\u043b\u0430\u044e\u0449\u0438\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87759,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87758","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u043e\u0434\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438: \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0438 \u0434\u0451\u0448\u0435\u0432\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-09T23:41:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-09T23:41:58+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Redundanskoder: med enkle ord om, hvordan man p\u00e5lideligt og billigt opbevarer data | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u043e\u0434\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438: \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0438 \u0434\u0451\u0448\u0435\u0432\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-09T23:41:58+00:00","article:modified_time":"2020-07-09T23:41:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87758","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:44:06","updated":"2022-09-29 13:02:43","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/87758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=87758"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/87758\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/87759"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=87758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=87758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=87758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}