Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

SÄ hÀr ser överskottsdata ut

Överskottskoder* anvĂ€nds i stor utstrĂ€ckning i datorsystem för att öka tillförlitligheten vid datalagring. PĂ„ Yandex anvĂ€nds de i mĂ„nga projekt. Till exempel sparar anvĂ€ndningen av överskottskoder istĂ€llet för replikering i vĂ„rt interna objektlagringssystem miljontals utan att minska tillförlitligheten. Men trots den utbredda anvĂ€ndningen Ă€r en begriplig beskrivning av hur överskottskoder fungerar mycket sĂ€llsynt. De som vill förstĂ„ stöter ofta pĂ„ följande (frĂ„n Wikipedia):

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

Jag heter Vadim, och pÄ Yandex arbetar jag med utvecklingen av det interna objektlagringssystemet MDS. I denna artikel ska jag pÄ ett enkelt sÀtt beskriva de teoretiska grunderna för överskottskoder (Reed-Solomon-koder och LRC). Jag kommer att förklara hur det fungerar utan komplicerad matematik och sÀllsynta termer. I slutet kommer jag att ge exempel pÄ anvÀndning av överskottskoder i Yandex.

Jag kommer inte att gÄ in pÄ en rad matematiska detaljer, men jag ger lÀnkar för dem som vill fördjupa sig mer. Jag noterar ocksÄ att vissa matematiska definitioner kanske inte Àr strikta, eftersom artikeln Àr avsedd för ingenjörer som vill förstÄ kÀrnan i frÄgan.

* I engelsksprÄkig litteratur kallas överskottskoder ofta för erasure codes.

1. KÀrnan i överskottskoder

KÀrnan i alla överskottskoder Àr mycket enkel: att lagra (eller överföra) data pÄ ett sÀtt som förhindrar dataförlust vid uppkomst av fel (diskfel, dataöverföringsfel osv.).

I de flesta* överskottskoder delas data upp i n datablokker, och för dessa berĂ€knas m överskottskoder, vilket ger totalt n + m block. Överskottskoderna konstrueras sĂ„ att man kan Ă„terstĂ€lla n datablokker genom att anvĂ€nda endast en del av de n + m blocken. Nedan kommer vi endast att titta pĂ„ blocköverskottskoder, det vill sĂ€ga sĂ„dana dĂ€r data delas upp i block.

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

För att Ă„terstĂ€lla alla n datablok mĂ„ste man ha minst n av n + m block, eftersom man inte kan fĂ„ n block med endast n-1 block (i sĂ„ fall skulle man behöva ta 1 block "frĂ„n ingenstans"). Är n godtyckliga block av n + m block tillrĂ€ckligt för att Ă„terstĂ€lla all data? Det beror pĂ„ typen av överflödskoder, till exempel tillĂ„ter Reid-Solomon-koder att Ă„terstĂ€lla all data med hjĂ€lp av godtyckliga n block, medan LRC-överflödskoder inte alltid gör det.

Databevarande

I datalagringssystem lagras vanligtvis varje databasblock och överflödsblock pÄ enskilda diskar. Om en godtycklig disk gÄr sönder kan de ursprungliga uppgifterna fortfarande ÄterstÀllas och lÀsas. Data kan ÄterstÀllas Àven vid samtidig fel pÄ flera diskar.

Datatransmission

Överflödskoder kan anvĂ€ndas för pĂ„litlig datatransmission i opĂ„litliga nĂ€tverk. De överförda uppgifterna delas upp i block, och överflödskoder berĂ€knas för dessa. BĂ„de datablok och överflödsblock överförs över nĂ€tverket. NĂ€r fel uppstĂ„r i godtyckliga block (upp till ett visst antal block) kan data fortfarande överföras felfritt över nĂ€tverket. Reid-Solomon-koder, till exempel, anvĂ€nds för datatransmission över optiska kommunikationslinjer och i satellitkommunikation.

* Det finns Àven överflödskoder dÀr data inte delas upp i block, till exempel Hamming-koder och CRC-koder, som Àr vanligt förekommande för datatransmission i Ethernet-nÀtverk. Dessa Àr koder för felkorrigerande kodning och Àr avsedda för att upptÀcka fel snarare Àn att korrigera dem (Hamming-koden tillÄter ocksÄ delvis korrigering av fel).

2. Reid-Solomon-koder

Reid-Solomon-koder Àr en av de mest spridda överflödskoderna, uppfunna redan pÄ 1960-talet och som först fick stor anvÀndning pÄ 1980-talet för massproduktion av CD-skivor.

Det finns tvÄ nyckelfrÄgor för att förstÄ Reid-Solomon-koder: 1) hur man skapar överflödsblock; 2) hur man ÄterstÀller data med hjÀlp av överflödsblock. LÄt oss hitta svar pÄ dem.
För enkelhetens skull kommer vi att anta att n=6 och m=4. Andra scheman behandlas pÄ liknande sÀtt.

Hur man skapar överflödsblock

Varje block av felkorrigeringskoder betraktas oberoende av de andra. För att rĂ€kna varje block anvĂ€nds samtliga n datablokkar. I diagrammet nedan Ă€r X1-X6 datablokkar och P1–P4 Ă€r felkorrigeringsblocks.

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

Alla datablokkar mÄste vara samma storlek; för att justera kan nollbitar anvÀndas. De resulterande felkorrigeringsblocken kommer att ha samma storlek som datablokkarna. Alla datablokkar delas upp i ord (till exempel 16 bitar). Anta att vi delar upp datablokkarna i k ord. DÄ kommer alla felkorrigeringsblocker ocksÄ att delas in i k ord.

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

För att rÀkna i:e ordet i varje felkorrigeringsblock kommer i:e orden frÄn alla datablokkar att anvÀndas. De kommer att berÀknas enligt följande formel:

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

HÀr Àr vÀrdena x = ord frÄn datablokkar, p = ord frÄn felkorrigeringsblock, alla alfa, beta, gamma och delta Àr speciellt valda tal, lika för alla i. Det mÄste genast sÀgas att alla dessa vÀrden inte Àr vanliga tal, utan element i GaloisfÀltet, operationerna +, -, *, / - Àr inte de vi kÀnner till, utan speciella operationer som införts över elementen i GaloisfÀltet.

Vad Àr GaloisfÀlt till för

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

Det verkar enkelt: vi delar upp data i block, blocken i ord, med hjĂ€lp av orden frĂ„n datablokkarna berĂ€knar vi orden frĂ„n felkorrigeringsblocken – vi fĂ„r felkorrigeringsblock. I stort sett fungerar det sĂ„, men djĂ€vulen ligger i detaljerna:

  1. Som nÀmnts tidigare Àr ordstorleken fast, i vÄrt exempel 16 bitar. Formlerna ovan för Reed-Solomon-koder Àr sÄdana att nÀr vanliga heltal anvÀnds kan resultatet av berÀkningen av p vara orepresenterbart med hjÀlp av ett ord av giltig storlek.
  2. Vid ÄterstÀllande av data kommer ovanstÄende formler att betraktas som ett system av ekvationer som mÄste lösas för att ÄterstÀlla data. Under lösningen kan det bli nödvÀndigt att utföra division av heltal med varandra, vilket ger ett reellt tal som inte kan representeras exakt i datorns minne.

Dessa problem gör att hela tal inte kan anvÀndas för Reed-Solomon-koder. Lösningen pÄ problemet Àr originell och kan beskrivas pÄ följande sÀtt: lÄt oss tÀnka ut speciella tal som kan representeras med ord av önskad lÀngd (till exempel 16 bitar) och resultatet av alla operationer pÄ dem (addition, subtraktion, multiplikation, division) ocksÄ kommer att representeras i datorns minne med ord av önskad lÀngd.

Dessa "speciella" tal har lÀnge studerats inom matematik och kallas kroppar. En kropp Àr en mÀngd element med specifika operationer för addition, subtraktion, multiplikation och division.

Galois-kroppar* Àr kroppar dÀr det finns ett entydigt resultat för varje operation (+, -, *, \/) för vilka som helst tvÄ element i kroppen. Galois-kroppar kan byggas för tal som Àr en potens av 2: 2, 4, 8, 16 och sÄ vidare (i praktiken Àr vi dock bara intresserade av potenser av 2). Till exempel, för ord av storlek 16 bitar Àr detta en kropp som innehÄller 65 536 element, för vilka man kan hitta resultatet av vilken operation (+, -, *, \/) som helst för varje par. VÀrdena x, p, alfa, beta, gamma, delta i ovanstÄende ekvationer kommer att betraktas som element av Galois-kroppen för berÀkningarna.

SÄledes har vi ett system av ekvationer, med hjÀlp av vilket vi kan bygga redundanta kodblock genom att skriva ett motsvarande datorprogram. Med hjÀlp av detta system av ekvationer kan vi ocksÄ utföra datag ÄterstÀllning.

* Detta Àr ingen strikt definition, snarare en beskrivning.

Hur man ÄterstÀller data

ÅterstĂ€llning Ă€r nödvĂ€ndig nĂ€r en del av blocken Ă€r saknade frĂ„n n + m block. Det kan vara antingen datablock eller redundanta kodblock. FrĂ„nvaro av datablock och/eller redundanta kodblock innebĂ€r att de motsvarande variablerna x och/eller p i ovanstĂ„ende ekvationer Ă€r okĂ€nda.

Ekvationerna för Reed-Solomon-koder kan betraktas som ett system av ekvationer, dÀr alla vÀrden alfa, beta, gamma, delta Àr konstanter, alla x och p som motsvarar tillgÀngliga block Àr kÀnda variabler, medan de övriga x och p Àr okÀnda.

Till exempel, lÄt oss anta att datablock 1, 2, 3 och redundanta kodblock 2 Àr otillgÀngliga, dÄ kommer följande system av ekvationer att gÀlla för den i:te ordgruppen (okÀnda markerade i rött):

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

Vi har ett system med 4 ekvationer och 4 obekanta, vilket innebÀr att vi kan lösa det och ÄterstÀlla data!

FrÄn detta ekvationssystem följer en rad slutsatser om datarader för Reed-Solomon-koder (n datablokkar, m redundanta kodblock):

  • Data kan Ă„terstĂ€llas vid förlust av vilket som helst av m block eller fĂ€rre. Vid förlust av m+1 block eller fler kan data inte Ă„terstĂ€llas: det gĂ„r inte att lösa ett system med m ekvationer och m + 1 obekanta.
  • För att Ă„terstĂ€lla Ă€ven ett enda datablock mĂ„ste du anvĂ€nda vilka som helst n av de Ă„terstĂ„ende blocken, samtidigt som du kan anvĂ€nda valfritt av redundanskoderna.

Vad mer behöver man veta

I beskrivningen ovan hoppar jag över en rad viktiga frÄgor, vars övervÀgande krÀver en djupare fördjupning i matematiken. SÀrskilt pratar jag inte om följande:

  • Ekvationssystemet för Reed-Solomon-koder mĂ„ste ha (enligt) lösning för alla kombinationer av obekanta (inte mer Ă€n m obekanta). Baserat pĂ„ detta krav vĂ€ljs vĂ€rdena alpha, beta, gamma och delta.
  • Ekvationssystemet mĂ„ste kunna byggas automatiskt (beroende pĂ„ vilka block som Ă€r otillgĂ€ngliga) och lösas.
  • Det Ă€r nödvĂ€ndigt att konstruera ett GaloisfĂ€lt: för en given ordstorlek ska man kunna hitta resultatet av vilken operation som helst (+, -, *, /) för vilka tvĂ„ element som helst.

I slutet av artikeln finns hÀnvisningar till litteratur om dessa viktiga frÄgor.

Val av n och m

Hur vÀljer man n och m i praktiken? I praktiken anvÀnds redundanskoder i datalagringssystem för att spara utrymme, sÄ dÀrför vÀljs m alltid mindre Àn n. Deras specifika vÀrden beror pÄ flera faktorer, inklusive:

  • Tillförlitlighet i datalagring. Ju fler m, desto fler diskfel kan hanteras, vilket innebĂ€r högre pĂ„litlighet.
  • Överflödighet i lagring. Ju högre förhĂ„llande m / n, desto högre blir överflödigheten i lagringen och desto dyrare blir systemet.
  • Bearbetningstid för förfrĂ„gningar. Ju större summa n + m, desto lĂ€ngre blir svarstiden pĂ„ förfrĂ„gningar. Eftersom det för att lĂ€sa data (under Ă„terstĂ€llning) krĂ€vs att lĂ€sa n block som lagras pĂ„ n olika diskar, kommer lĂ€sningstiden att bestĂ€mmas av den lĂ„ngsammaste disken.

Dessutom innebÀr lagring av data i flera datacenter ytterligare begrÀnsningar för valet av n och m: nÀr ett datacenter Àr urkopplat mÄste data fortfarande vara lÀsbara. Till exempel, vid lagring av data i 3 datacenter mÄste villkoret hÄllas: m >= n/2, annars kan situationer uppstÄ dÀr data inte Àr lÀsbara nÀr ett datacenter Àr urkopplat.

3. LRC — Lokala Rekonstruktionskoder

För att ÄterstÀlla data med hjÀlp av Reed-Solomon-koder mÄste n godtyckliga datablokkar anvÀndas. Detta Àr en mycket betydande nackdel för distribuerade datalagringssystem, eftersom för att ÄterstÀlla data pÄ en trasig disk mÄste data lÀsas frÄn majoriteten av de övriga, vilket skapar betydande extra belastning pÄ diskar och nÀtverk.

De vanligaste felen Àr otillgÀnglighet av en datablokk pÄ grund av en trasig eller överbelastad disk. Kan man pÄ nÄgot sÀtt minska den överflödiga belastningen för datarÀddning i ett sÄdant (vanligast förekommande) fall? Det visar sig att det gÄr: just för detta finns det redundanskodning i form av LRC.

LRC (Lokala Rekonstruktionskoder) Àr redundanskoder som uppfanns av Microsoft för anvÀndning i Windows Azure Storage. Idén med LRC Àr mycket enkel: dela alla datablokkar i tvÄ (eller fler) grupper och berÀkna en del av redundanskoderna för varje grupp separat. DÄ kommer en del av kodblocken för redundans att berÀknas med hjÀlp av alla datablokkar (i LRC kallas de globala redundanskoder), medan en del berÀknas med hjÀlp av en av de tvÄ grupperna av datablokkar (de kallas lokala redundanskoder).

LRC betecknas med tre siffror: n-r-l, dĂ€r n Ă€r antalet datablokkar, r Ă€r antalet globala redundanskoder, l Ă€r antalet lokala redundanskoder. För att lĂ€sa data nĂ€r en datablokk Ă€r otillgĂ€nglig behöver man bara lĂ€sa n/l blokkar — detta Ă€r l gĂ„nger mindre Ă€n med Reed-Solomon-koder.

För att ge ett exempel, betrakta LRC-schemat 6-2-2. X1–X6 Ă€r 6 datablokkar, P1, P2 Ă€r 2 globala redundanskoder, P3, P4 Ă€r 2 lokala redundanskoder.

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

Redundansblocken P1, P2 berĂ€knas med hjĂ€lp av alla datablokkar. Redundansblocket P3 berĂ€knas med hjĂ€lp av datablokkarna X1–X3, redundansblocket P4 berĂ€knas med hjĂ€lp av datablokkarna X4–X6.

Det övriga görs i LRC pÄ liknande sÀtt som med Reed-Solomon-koder. Ekvationerna för att rÀkna orden i överskottskodblocken kommer att vara sÄdana:

Felkoder: en enkel förklaring om hur man pÄ ett sÀkert och billigt sÀtt lagrar data

För att vÀlja siffrorna alfa, beta, gamma, delta mÄste en rad villkor uppfyllas som sÀkerstÀller möjlighet att ÄterstÀlla data (dvs. att lösa ekvationssystemet). Mer om dem kan lÀsas i artikeln.
I praktiken anvÀnds ocksÄ XOR-operationen för att rÀkna lokala överskottkoder P3, P4.

FrÄn ekvationssystemet för LRC följer flera slutsatser:

  • För att Ă„terstĂ€lla vilket 1 datablok som helst rĂ€cker det att lĂ€sa n/l block (n/2 i vĂ„rt exempel).
  • Om r + l block Ă€r otillgĂ€ngliga, och alla block ingĂ„r i en grupp, kan data inte Ă„terstĂ€llas. Detta kan enkelt förklaras med ett exempel. LĂ„t oss sĂ€ga att blocken X1–X3 och P3 Ă€r otillgĂ€ngliga: detta Ă€r r + l block frĂ„n en grupp, 4 i vĂ„rt fall. DĂ„ har vi ett system med 3 ekvationer och 4 okĂ€nda, vilket inte gĂ„r att lösa.
  • I alla andra fall av otillgĂ€nglighet av r + l block (nĂ€r minst 1 block frĂ„n varje grupp Ă€r tillgĂ€ngligt) kan data Ă„terstĂ€llas i LRC.

SĂ„ledes övertrĂ€ffar LRC Reed-Solomon-koderna nĂ€r det gĂ€ller datarĂ€ddning efter enkla fel. I Reed-Solomon-koder krĂ€vs att Ă€ven ett block av data Ă„terstĂ€lls genom att anvĂ€nda n block, medan för att Ă„terstĂ€lla ett block av data i LRC rĂ€cker det att anvĂ€nda n/l block (n/2 i vĂ„rt exempel). Å andra sidan, LRC förlorar mot Reed-Solomon-koderna nĂ€r det gĂ€ller maximalt antal tillĂ„tna fel. I de tidigare exemplen kan Reed-Solomon-koder Ă„terstĂ€lla data vid upp till 4 fel, medan det för LRC finns 2 kombinationer av 4 fel dĂ€r data inte kan Ă„terstĂ€llas.

Vad som Àr viktigast beror pÄ den specifika situationen, men ofta vÀger den besparing av överskottsbelastning som LRC erbjuder tyngre Àn den nÄgot lÀgre lagringssÀkerheten.

4. Andra överskottkoder

Förutom Reed-Solomon-koder och LRC finns det mÄnga andra överskottkoder. Olika överskottkoder anvÀnder olika matematik. HÀr Àr nÄgra andra överskottkoder:

  • Överskottkod med hjĂ€lp av XOR-operatorn. XOR-operationen utförs över n datablock, och en överskottskodblock genereras, det vill sĂ€ga schema n+1 (n datablock, 1 överskottskod). AnvĂ€nds i RAID 5, dĂ€r datablock och överskottskoder cykliskt skrivs pĂ„ alla diskar i arrayen.
  • Even-odd-algoritmen, baserat pĂ„ XOR-operationen. Möjliggör skapandet av 2 block av redundanta koder, dvs n+2-schema.
  • STAR-algoritmen, baserat pĂ„ XOR-operationen. Gör det möjligt att bygga 3 block av redundanta koder, dvs n+3-schema.
  • Pyramidkoder — ytterligare redundanta koder frĂ„n Microsoft.

5. AnvÀndning inom Yandex

En rad infrastrukturella projekt frÄn Yandex anvÀnder redundanta koder för sÀker datalagring. HÀr Àr nÄgra exempel:

  • Det interna objektlagret MDS, som jag nĂ€mnde i början av artikeln.
  • YT — Yandexs MapReduce-system.
  • YDB (Yandex DataBase) — en distribuerad newSQL-databas.

I MDS anvÀnds LRC-redundanskoder, 8-2-2-schema. Data med redundanskoder skrivs pÄ 12 olika diskar pÄ olika servrar i 3 olika datacenter: 4 servrar i varje datacenter. LÀs mer om detta i artikeln.

I YT anvÀnds bÄde Reed-Solomon-koder (6-3-schema), som var de första som implementerades, samt LRC-redundanskoder (12-2-2-schema), dÀr LRC Àr den föredragna lagringsmetoden.

I YDB anvÀnds redundanskoder baserade pÄ even-odd (4-2-schema). Redundanskoderna i YDB har redan berÀttats om pÄ Highload.

AnvÀndningen av olika redundanskodescheman beror pÄ de olika kraven som stÀlls pÄ systemen. Till exempel, i MDS placeras data som lagras med LRC omedelbart i 3 datacenter. Det Àr viktigt för oss att data förblir tillgÀngliga för lÀsning Àven om 1 datacenter gÄr ner, dÀrför mÄste blocken distribueras över datacentren sÄ att antalet otillgÀngliga block inte överskrider det tillÄtna vid nedlÀggning av nÄgot datacenter. I 8-2-2-schemat kan 4 block placeras i varje datacenter, sÄ att om nÄgot datacenter stÀngs av, kommer 4 block att vara otillgÀngliga och data kan fortfarande lÀsas. Oavsett vilket schema vi vÀljer nÀr vi placerar i 3 datacenter, mÄste det alltid vara (r + l) / n >= 0,5, vilket betyder att lagringsredundansen kommer att vara minst 50%.

I YT Àr situationen annorlunda: varje YT-kluster ligger helt inom 1 datacenter (olika kluster i olika datacenter), dÀrför finns det inga sÄdana begrÀnsningar dÀr. 12-2-2-schemat ger en redundans pÄ 33%, vilket gör att data kan lagras billigare, samtidigt som de kan klara av upp till 4 samtidiga diskavbrott, precis som schemat i MDS.

Det finns fortfarande mÄnga sÀrdrag kring anvÀndningen av redundanskoder i lagrings- och databehandlingssystem: nyanser av datarÀddning, inverkan av ÄterstÀllning pÄ svarstider, sÀrskilda aspekter av dataskrivning osv. Jag planerar att berÀtta mer om dessa och andra sÀrdrag av tillÀmpning av redundanskoder i praktiken om Àmnet Àr av intresse.

6. LĂ€nkar

  1. Serien artiklar om Reed-Solomon-koder och Galois-fÀlt: https://habr.com/ru/company/yadro/blog/336286/
    https://habr.com/ru/company/yadro/blog/341506/
    I dem behandlas matematiken mer ingÄende pÄ ett lÀttförstÄeligt sÀtt.
  2. Artikel frÄn Microsoft om LRC: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/LRC12-cheng20webpage.pdf
    I avsnitt 2 förklaras teorin kort, och dÀrefter behandlas erfarenheter av LRC i praktiken.
  3. Even-odd-schema: https://people.eecs.berkeley.edu/~kubitron/courses/cs262a-F12/handouts/papers/p245-blaum.pdf
  4. STAR-schema: https://www.usenix.org/legacy/event/fast05/tech/full_papers/huang/huang.pdf
  5. Pyramidkoder: https://www.microsoft.com/en-us/research/publication/pyramid-codes-flexible-schemes-to-trade-space-for-access-efficiency-in-reliable-data-storage-systems/
  6. Redundanskoder i MDS: https://habr.com/ru/company/yandex/blog/311806
  7. Redundanskoder i YT: https://habr.com/ru/company/yandex/blog/311104/
  8. Redundanskoder i YDB: https://www.youtube.com/watch?v=dCpfGJ35kK8

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster