{"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\/nl\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye","title":{"rendered":"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/4d853e314dfea596b45a6aff00238bea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Zo ziet redundantie eruit<\/em><\/p>\n<p><\/p>\n<p>Redundantiecodes* worden op grote schaal toegepast in computersystemen om de betrouwbaarheid van gegevensopslag te vergroten. Bij Yandex worden ze in veel projecten gebruikt. Bijvoorbeeld, het gebruik van redundantiecodes in plaats van replicatie in onze interne objectopslag bespaart miljoenen zonder de betrouwbaarheid te verlagen. Ondanks de brede toepassing komt een begrijpelijke uitleg van hoe redundantiecodes werken zelden voor. Wie het wil begrijpen, wordt ongeveer geconfronteerd met het volgende (uit <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=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/c5e592acd8c1e113c099357d1ba48d5c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mijn naam is Vadim en bij Yandex houd ik me bezig met de ontwikkeling van de interne objectopslag MDS. In dit artikel zal ik de theoretische basis van redundantiecodes (Reed-Solomon codes en LRC) in eenvoudige bewoordingen beschrijven. Ik zal uitleggen hoe het werkt, zonder complexe wiskunde en zeldzame termen. Aan het einde geef ik voorbeelden van het gebruik van redundantiecodes bij Yandex.<\/p>\n<p><\/p>\n<p>Ik zal niet gedetailleerd ingaan op een aantal wiskundige details, maar ik zal verwijzingen geven voor degenen die dieper willen duiken. Ook wil ik opmerken dat sommige wiskundige definities mogelijk niet strikt zijn, aangezien het artikel niet voor wiskundigen, maar voor ingenieurs is bedoeld die de essentie van de kwestie willen begrijpen.<\/p>\n<p><\/p>\n<p>* In Engelstalige literatuur worden redundantiecodes vaak erasure codes genoemd.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"1-sut-kodov-izbytochnosti\">1. De essentie van redundantiecodes<\/h1>\n<p><\/p>\n<p>De essentie van alle redundantiecodes is uiterst eenvoudig: gegevens opslaan (of verzenden) op een manier dat ze niet verloren gaan bij fouten (schijfstoringen, fouten in gegevensoverdracht, enz.). <\/p>\n<p><\/p>\n<p>In de meeste* redundantiecodes worden gegevens opgesplitst in n datablocks, voor hen worden m blokken redundantiecodes berekend, wat in totaal n + m blokken oplevert. Redundantiecodes worden zo opgebouwd dat n datablocks kunnen worden hersteld met slechts een deel van de n + m blokken. Verder zullen we alleen block codes van redundantie beschouwen, dat wil zeggen die waarbij de gegevens in blokken worden verdeeld.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/1273b4643f915dd615026ec38ca56473.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om alle n datablokken te herstellen, heeft u minstens n van de n + m blokken nodig, omdat u n blokken niet kunt verkrijgen met slechts n-1 blok (in dat geval zou u 1 blok uit 'de lucht' moeten halen). Zijn n willekeurige blokken van n + m blokken voldoende om alle gegevens te herstellen? Dit hangt af van het type foutencodes; bijvoorbeeld, Reed-Solomon codes stellen u in staat om alle gegevens te herstellen met willekeurige n blokken, terwijl LRC-foutencodes dat niet altijd doen.<\/p>\n<p><\/p>\n<h3 id=\"hranenie-dannyh\">Gegevensopslag<\/h3>\n<p><\/p>\n<p>In opslagsystemen wordt doorgaans elk van de datablokken en de foutencodes op een aparte schijf geschreven. Bij een storing van een willekeurige schijf kunnen de oorspronkelijke gegevens toch worden hersteld en gelezen. Gegevens kunnen zelfs worden hersteld bij een gelijktijdige storing van meerdere schijven.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh\">Gegevensoverdracht<\/h3>\n<p><\/p>\n<p>Foutencodes kunnen worden gebruikt voor betrouwbare gegevensoverdracht in onbetrouwbare netwerken. De over te dragen gegevens worden opgedeeld in blokken, waarvoor foutencodes worden berekend. Zowel de datablokken als de foutencodes worden via het netwerk verzonden. Bij fouten in willekeurige blokken (tot een bepaald aantal blokken), kunnen de gegevens toch foutloos via het netwerk worden overgedragen. Reed-Solomon codes worden bijvoorbeeld gebruikt voor gegevensoverdracht via optische communicatielijnen en in satellietcommunicatie.<\/p>\n<p><\/p>\n<p>* Er zijn ook foutencodes waarbij de gegevens niet in blokken worden verdeeld, zoals Hamming codes en CRC-codes, die veel worden toegepast voor gegevensoverdracht in Ethernet-netwerken. Dit zijn codes voor foutbestendige codering; ze zijn bedoeld voor foutdetectie, niet voor foutcorrectie (de Hamming-code maakt ook gedeeltelijke foutcorrectie mogelijk).<\/p>\n<p><\/p>\n<h1 id=\"2-kody-rida--solomona\">2. Reed-Solomon codes<\/h1>\n<p><\/p>\n<p>Reed-Solomon codes zijn een van de meest wijdverbreide foutencodes, uitgevonden in de jaren '60 en voor het eerst veel gebruikt in de jaren '80 voor de massaproductie van cd's.<\/p>\n<p><\/p>\n<p>Er zijn twee belangrijke vragen voor het begrijpen van Reed-Solomon codes: 1) hoe fouten te genereren; 2) hoe gegevens te herstellen met behulp van foutencodes. Laten we antwoorden op deze vragen vinden.<br \/>\nOm te vereenvoudigen, nemen we aan dat n=6 en m=4. Andere schema's worden op dezelfde manier behandeld.<\/p>\n<p><\/p>\n<h3 id=\"kak-sozdavat-bloki-kodov-izbytochnosti\">Hoe foutencodes te genereren<\/h3>\n<p><\/p>\n<p>Elke foutencodering wordt onafhankelijk van andere foutencoderingen berekend. Voor het berekenen van elke foutencodering worden alle n datablocks gebruikt. In de onderstaande afbeelding zijn X1-X6 datablocks, P1\u2013P4 foutencoderingblocks.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/b4841e48a5f2f059376bb458a26c6235.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alle datablocks moeten dezelfde grootte hebben; voor uitlijning kunnen nulbits worden gebruikt. De verkregen foutencoderingblocks zullen dezelfde grootte hebben als de datablocks. Alle datablocks worden in woorden (bijvoorbeeld 16 bits per woord) verdeeld. Laten we aannemen dat we de datablocks in k woorden hebben verdeeld. Dan zullen alle foutencoderingblocks ook in k woorden worden verdeeld.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/fff9c998a760e3f05ef45497557888a9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voor het berekenen van het i-de woord van elke foutencodering zal het i-de woord van alle datablocks worden gebruikt. Ze worden berekend volgens de volgende formule:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/8f52209ef7f628c8a748325b1a30c2d4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier zijn de waarden x de woorden van de datablocks, p de woorden van de foutencoderingblocks, en alfa, beta, gamma en delta zijn speciaal gekozen getallen die gelijk zijn voor alle i. Het moet meteen worden gezegd dat al deze waarden geen gewone getallen zijn, maar elementen van een Galois-veld. De operaties +, -, *, \/ zijn geen gebruikelijke operaties, maar speciale operaties die zijn gedefinieerd voor elementen van een Galois-veld.<\/p>\n<p><\/p>\n<h3 id=\"zachem-nuzhny-polya-galua\">Waarom zijn Galois-velden nodig?<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/94ed4514ae15b01e7869efdeb9a605c6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Het lijkt eenvoudig: we verdelen gegevens in blokken, de blokken in woorden en met behulp van de woorden van de datablocks berekenen we de woorden van de foutencoderingblocks \u2014 zo krijgen we de foutencoderingblocks. Over het algemeen werkt het zo, maar het kwaad zit in de details:<\/p>\n<p><\/p>\n<ol>\n<li>Zoals eerder vermeld is de grootte van een woord vast, in ons voorbeeld 16 bits. De bovenstaande formules voor Reed-Solomon-coderingen zijn zodanig dat bij het gebruik van gewone gehele getallen het resultaat van de berekening p mogelijk niet kan worden weergegeven met een woord van toegestaan formaat.<\/li>\n<li>Bij het herstellen van gegevens zullen de bovenstaande formules worden gezien als een systeem van vergelijkingen dat moet worden opgelost om de gegevens te herstellen. Tijdens het oplossen kan het nodig zijn om gehele getallen door elkaar te delen, wat resulteert in een re\u00ebel getal dat niet nauwkeurig in het geheugen van de computer kan worden weergegeven.<\/li>\n<\/ol>\n<p><\/p>\n<p>Deze problemen maken het onmogelijk om gehele getallen te gebruiken voor Reed-Solomon codes. De oplossing voor het probleem is origineel en kan als volgt worden beschreven: laten we speciale getallen bedenken die kunnen worden weergegeven met woorden van de juiste lengte (bijvoorbeeld 16 bits), en het resultaat van alle bewerkingen op deze getallen (optellen, aftrekken, vermenigvuldigen, delen) zal ook in het geheugen van de computer worden weergegeven met woorden van de juiste lengte.<\/p>\n<p><\/p>\n<p>Dergelijke 'speciale' getallen worden al lange tijd bestudeerd door de wiskunde en worden velden genoemd. Een veld is een verzameling elementen met bepaalde operaties zoals optelling, aftrekking, vermenigvuldigen en delen.<\/p>\n<p><\/p>\n<p>Galoisvelden* zijn velden waarvoor er een unieke uitkomst bestaat voor elke bewerking (+, -, *, \/) voor elke twee elementen van het veld. Galoisvelden kunnen worden opgebouwd voor getallen die een macht van 2 zijn: 2, 4, 8, 16, enzovoorts (in feite voor elke macht van een priemgetal p, maar in de praktijk zijn alleen de machten van 2 voor ons interessant). Bijvoorbeeld, voor woorden van 16 bits is dit veld dat 65.536 elementen bevat, waarvoor voor elk paar een resultaat kan worden gevonden voor elke operatie (+, -, *, \/). De waarden x, p, alfa, beta, gamma, delta in de bovenstaande vergelijkingen worden als elementen van het Galoisveld beschouwd voor de berekeningen.<\/p>\n<p><\/p>\n<p>Zo hebben we een systeem van vergelijkingen waarmee we blokken van redundantiecodes kunnen opbouwen door een bijbehorende computerprogramma te schrijven. Met behulp van ditzelfde systeem van vergelijkingen kunnen we gegevensherstel uitvoeren.<\/p>\n<p><\/p>\n<p>* Dit is geen strikte definitie, eerder een beschrijving.<\/p>\n<p><\/p>\n<h3 id=\"kak-vosstanavlivat-dannye\">Hoe gegevens te herstellen<\/h3>\n<p><\/p>\n<p>Herstel is nodig wanneer een deel van de n + m blokken ontbreekt. Dit kunnen zowel datablocks zijn als blokken van redundantiecodes. Het ontbreken van datablocks en\/of blokken van redundantiecodes betekent dat in de bovenstaande vergelijkingen de bijbehorende variabelen x en\/of p onbekend zijn.<\/p>\n<p><\/p>\n<p>De vergelijkingen voor Reed-Solomon codes kunnen worden gezien als een systeem van vergelijkingen waarin alle waarden alfa, beta, gamma, delta constanten zijn, alle x en p die overeenkomen met de beschikbare blokken zijn bekende variabelen, en de andere x en p zijn onbekend.<\/p>\n<p><\/p>\n<p>Bijvoorbeeld, stel dat de datablocks 1, 2, 3 en de blokken van redundantiecodes 2 onbeschikbaar zijn, dan zal de volgende set van vergelijkingen voor de i-de groep woorden gelden (onbekenden gemarkeerd in het rood):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/6f24804c3d34423f31796e43e9ae1203.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>We have a system of 4 equations with 4 unknowns, so we can solve it and recover the data!<\/p>\n<p><\/p>\n<p>This system of equations leads to several conclusions about data recovery for Reed-Solomon codes (n blocks of data, m redundancy blocks):<\/p>\n<p><\/p>\n<ul>\n<li>Data can be recovered if any m blocks or fewer are lost. If m+1 or more blocks are lost, the data cannot be recovered: a system of m equations with m + 1 unknowns cannot be solved. <\/li>\n<li>To recover even one data block, any n of the remaining blocks must be used, while any of the redundancy codes can be employed.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-eschyo-nuzhno-znat\">What else do you need to know<\/h3>\n<p><\/p>\n<p>In the description above, I skipped over several important questions that require a deeper dive into mathematics. In particular, I say nothing about the following:<\/p>\n<p><\/p>\n<ul>\n<li>The equation system for Reed-Solomon codes must have a (unique) solution for any combination of unknowns (no more than m unknowns). Based on this requirement, the values of alpha, beta, gamma, and delta are selected.<\/li>\n<li>The equation system must be able to be constructed automatically (depending on which blocks are unavailable) and solved.<\/li>\n<li>A Galois field needs to be constructed: for a given word size, the result of any operation (+, -, *, \/) for any two elements must be determinable.<\/li>\n<\/ul>\n<p><\/p>\n<p>At the end of the article, there are references to literature on these important issues.<\/p>\n<p><\/p>\n<h3 id=\"vybor-n-i-m\">Choosing n and m<\/h3>\n<p><\/p>\n<p>How to practically choose n and m? In practice, redundancy codes in data storage systems are used to save space, so m is always chosen to be less than n. Their specific values depend on several factors, including:<\/p>\n<p><\/p>\n<ul>\n<li>Data storage reliability. The larger m is, the more disk failures can be tolerated, meaning higher reliability.<\/li>\n<li>Storage redundancy. The higher the ratio m \/ n, the greater the storage redundancy, which will also make the system more expensive.<\/li>\n<li>Request processing time. The larger the sum of n + m, the longer the response time will be. Since reading data (during recovery) requires reading n blocks stored on n different disks, the reading time will be determined by the slowest disk.<\/li>\n<\/ul>\n<p><\/p>\n<p>Bovendien stelt de opslag van gegevens in meerdere datacenters aanvullende beperkingen aan de keuze van n en m: bij uitschakeling van 1 datacenter moeten de gegevens nog steeds leesbaar zijn. Bijvoorbeeld, bij het opslaan van gegevens in 3 datacenters moet aan de voorwaarde m &gt;= n\/2 worden voldaan, anders kan het voorkomen dat de gegevens niet leesbaar zijn bij het uitschakelen van 1 datacenter.<\/p>\n<p><\/p>\n<h1 id=\"3-lrc--local-reconstruction-codes\">3. LRC \u2014 Lokale Herstelcodes<\/h1>\n<p><\/p>\n<p>Voor het herstel van gegevens met behulp van de Reed-Solomon-codes moeten n willekeurige gegevensblokken worden gebruikt. Dit is een groot nadeel voor gedistribueerde datasystemen, omdat het voor het herstellen van gegevens op \u00e9\u00e9n defecte schijf noodzakelijk is om gegevens van de meeste andere schijven te lezen, wat een aanzienlijke extra belasting voor de schijven en het netwerk met zich meebrengt.<\/p>\n<p><\/p>\n<p>De meest voorkomende fouten zijn de ontoegankelijkheid van \u00e9\u00e9n gegevensblok door een defect of overbelasting van \u00e9\u00e9n schijf. Is het mogelijk om de overmatige belasting voor het herstellen van gegevens in zo'n (meest voorkomende) geval te verminderen? Blijkbaar wel: hiervoor bestaan speciale LRC redundantiecodes.<\/p>\n<p><\/p>\n<p>LRC (Lokale Herstelcodes) zijn redundantiecodes die zijn bedacht bij Microsoft voor gebruik in Windows Azure Storage. Het idee achter LRC is heel eenvoudig: herverdeelt alle gegevensblokken in twee (of meer) groepen en berekent de redundantiecodes voor elk van deze groepen afzonderlijk. Dan worden sommige redundantiecodes berekend met behulp van alle gegevensblokken (in LRC worden deze 'globale redundantiecodes' genoemd), terwijl andere worden berekend met behulp van een van de twee groepen gegevensblokken (deze worden 'lokale redundantiecodes' genoemd).<\/p>\n<p><\/p>\n<p>LRC wordt aangeduid met drie getallen: n-r-l, waarbij n het aantal gegevensblokken is, r het aantal globale redundantiecodes, en l het aantal lokale redundantiecodes. Om gegevens te lezen als \u00e9\u00e9n gegevensblok niet beschikbaar is, hoeft men slechts n\/l blokken te lezen \u2014 dat is l keer minder dan bij Reed-Solomon-codes.<\/p>\n<p><\/p>\n<p>Neem als voorbeeld het LRC-schema 6-2-2. X1\u2013X6 zijn 6 gegevensblokken, P1, P2 zijn 2 globale redundantiecodes, en P3, P4 zijn 2 lokale redundantiecodes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/783f6d4b57b992c56385cdd07603cda8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De redundantiecodes P1, P2 worden berekend met behulp van alle gegevensblokken. De redundantiecode P3 wordt berekend met behulp van de gegevensblokken X1\u2013X3, en de redundantiecode P4 met behulp van de gegevensblokken X4\u2013X6.<\/p>\n<p><\/p>\n<p>Het overige wordt in LRC gedaan volgens de codes van Reed-Solomon. De vergelijkingen voor het berekenen van de woorden van de codes voor redundantie zijn als volgt:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Redundantiecodes: eenvoudig gezegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan\" src=\"\/wp-content\/uploads\/2020\/07\/b32c8864fac0678014fc9a5abf490537.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voor het selecteren van de getallen alfa, beta, gamma, delta moeten een aantal voorwaarden worden uitgevoerd die de mogelijkheid van gegevensherstel garanderen (dat wil zeggen het oplossen van het systeem van vergelijkingen). Meer hierover is te lezen in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/LRC12-cheng20webpage.pdf\">artikel<\/a><\/noindex>.<br \/>\nIn de praktijk wordt ook de XOR-operatie gebruikt om de lokale codes voor redundantie P3, P4 te berekenen. <\/p>\n<p><\/p>\n<p>Uit het systeem van vergelijkingen voor LRC volgen verschillende conclusies:<\/p>\n<p><\/p>\n<ul>\n<li>Voor het herstellen van \u00e9\u00e9n gegevensblok is het voldoende om n\/l blokken te lezen (n\/2 in ons voorbeeld).<\/li>\n<li>Als r + l blokken niet beschikbaar zijn en alle blokken in \u00e9\u00e9n groep zitten, kunnen de gegevens niet worden hersteld. Dit kan eenvoudig worden uitgelegd met een voorbeeld. Stel dat de blokken X1\u2013X3 en P3 niet beschikbaar zijn: dit zijn r + l blokken uit \u00e9\u00e9n groep, 4 in ons geval. Dan hebben we een systeem van 3 vergelijkingen met 4 onbekenden, dat niet kan worden opgelost.<\/li>\n<li>In alle andere gevallen van onbeschikbaarheid van r + l blokken (wanneer van elke groep minstens \u00e9\u00e9n blok beschikbaar is) kunnen de gegevens in LRC worden hersteld.<\/li>\n<\/ul>\n<p><\/p>\n<p>Dus LRC is beter dan de codes van Reed-Solomon bij het herstellen van gegevens na enkele fouten. In de codes van Reed-Solomon is het nodig om n blokken te gebruiken om zelfs \u00e9\u00e9n gegevensblok te herstellen, terwijl voor LRC het voldoende is om n\/l blokken (n\/2 in ons voorbeeld) te gebruiken. Aan de andere kant is LRC minder goed dan de codes van Reed-Solomon wat betreft het maximale aantal toegestane fouten. In de bovenstaande voorbeelden kunnen de codes van Reed-Solomon gegevens herstellen bij maximaal 4 fouten, terwijl er voor LRC 2 combinaties van 4 fouten zijn waarbij gegevens niet kunnen worden hersteld.<\/p>\n<p><\/p>\n<p>Wat belangrijker is, hangt af van de specifieke situatie, maar vaak weegt de besparing op redundante belasting die LRC biedt zwaarder dan de iets lagere opslagbetrouwbaarheid.<\/p>\n<p><\/p>\n<h1 id=\"4-drugie-kody-izbytochnosti\">4. Andere redundante codes<\/h1>\n<p><\/p>\n<p>Naast de codes van Reed-Solomon en LRC zijn er veel andere redundante codes. Verschillende redundante codes gebruiken verschillende wiskunde. Hier zijn enkele andere redundante codes:<\/p>\n<p><\/p>\n<ul>\n<li>Redundante code met behulp van de XOR-operator. De XOR-operatie wordt uitgevoerd over n gegevensblokken, en er ontstaat 1 blok redundantiecodes, dat wil zeggen het schema n+1 (n gegevensblokken, 1 redundantiecode). Wordt gebruikt in <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/RAID#RAID_5\">RAID 5<\/a><\/noindex>, waar gegevensblokken en redundantiecodes cyclisch op alle schijven van de array worden opgeslagen.<\/li>\n<li>Even-odd-algoritme, gebaseerd op de XOR-bewerking. Hiermee kunnen 2 blokken redundante codes worden opgebouwd, dat wil zeggen een schema van n+2.<\/li>\n<li>STAR-algoritme, gebaseerd op de XOR-bewerking. Hiermee kunnen 3 blokken redundante codes worden opgebouwd, dat wil zeggen een schema van n+3.<\/li>\n<li>Pyramidecodes \u2014 weer een soort redundante codes van Microsoft.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"5-ispolzovanie-v-yandekse\">5. Gebruik bij Yandex<\/h1>\n<p><\/p>\n<p>Een aantal infrastructuurprojecten van Yandex maakt gebruik van redundante codes voor betrouwbare gegevensopslag. Hier zijn enkele voorbeelden:<\/p>\n<p><\/p>\n<ul>\n<li>De interne objectopslag MDS, waarover ik aan het begin van het artikel schreef.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311104\/\">YT<\/a><\/noindex> \u2014 Het MapReduce-systeem van Yandex.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=FwLvAuOSIOU\">YDB<\/a><\/noindex> (Yandex DataBase) \u2014 een gedistribueerde newSQL-database.<\/li>\n<\/ul>\n<p><\/p>\n<p>In MDS worden LRC-redundante codes gebruikt, schema 8-2-2. Gegevens met redundante codes worden op 12 verschillende schijven in verschillende servers opgeslagen in 3 verschillende datacenters: 4 servers in elk datacenter. Meer hierover kunt u lezen in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311806\/\">artikel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>In YT worden zowel Reed-Solomon-codes (schema 6-3), die als eerste zijn ge\u00efmplementeerd, als LRC-redundante codes (schema 12-2-2) gebruikt, waarbij LRC de voorkeur heeft voor opslag.<\/p>\n<p><\/p>\n<p>In YDB worden redundante codes op basis van even-odd (schema 4-2) gebruikt. Over redundante codes in YDB is al eerder gesproken op Highload <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=dCpfGJ35kK8\">het gebruik van verschillende schema's voor redundante codes wordt bepaald door verschillende eisen die aan systemen worden gesteld. Bijvoorbeeld, in MDS worden gegevens die met LRC zijn opgeslagen, verspreid over 3 datacenters. Het is belangrijk dat gegevens leesbaar blijven bij uitval van 1 van de datacenters, daarom moeten de blokken zo over de datacenters worden verdeeld dat het aantal niet-beschikbare blokken bij uitval van elk datacenter niet groter is dan toegestaan. In schema 8-2-2 kunnen 4 blokken in elk datacenter worden geplaatst, zodat bij het uitschakelen van een datacenter 4 blokken onbeschikbaar zijn en de gegevens nog steeds kunnen worden gelezen. Welke schema we ook kiezen voor opslag in 3 datacenters, het moet in ieder geval gelden dat (r + l) \/ n &gt;= 0,5, wat betekent dat de opslagredundantie minstens 50% zal zijn.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>In YT is de situatie anders: elke YT-cluster bevindt zich volledig in 1 datacenter (verschillende clusters in verschillende datacenters), dus daar is die beperking niet van toepassing. Schema 12-2-2 biedt 33% redundantie, dat wil zeggen dat het opslaan van gegevens goedkoper is, terwijl ze ook tot 4 gelijktijdige schijfuitval kunnen doorstaan, net als het schema in MDS.<\/p>\n<p><\/p>\n<p>In YT is de situatie anders: elk YT-cluster ligt volledig in 1 datacentrum (verschillende clusters in verschillende datacentra), daarom is er daar geen beperking. Het 12-2-2-schema biedt een redundantie van 33%, wat betekent dat het opslaan van gegevens goedkoper wordt, terwijl ze ook tot 4 gelijktijdige schijfuitvallen kunnen overleven, net als het schema in MDS.<\/p>\n<p><\/p>\n<p>Er zijn nog veel meer aspecten van het gebruik van redundantiekodes in dataopslag- en verwerkingssystemen: nuances van datherstel, de invloed van herstel op de responstijd, bijzonderheden van gegevensschrijven, enzovoort. Ik ben van plan om apart te vertellen over deze en andere aspecten van het gebruik van redundantiekodes in de praktijk, als het onderwerp interessant is.<\/p>\n<p><\/p>\n<h1 id=\"6-ssylki\">6. Links<\/h1>\n<p><\/p>\n<ol>\n<li>Serie artikelen over Reed-Solomon codes en Galois velden: <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 \/>\nDe wiskunde wordt daar op een begrijpelijke manier dieper behandeld.<\/li>\n<li>Artikel van Microsoft over 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 \/>\nIn sectie 2 wordt de theorie kort verklaard, daarna wordt de ervaring met de toepassing van LRC in de praktijk besproken.<\/li>\n<li>Even-odd code: <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-code: <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 codes: <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>Redundantiekodes in 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>Redundantiekodes in 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>Redundantiekodes in 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>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47 Redundantiekodes: eenvoudig uitgelegd hoe je gegevens betrouwbaar en goedkoop kunt opslaan | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/87758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=87758"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/87758\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/87759"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=87758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=87758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=87758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}