
Slik ser redundans ut
Redundanskoder* brukes mye i datasystemer for Ä Þke pÄliteligheten til datalagring. Hos Yandex brukes de i mange prosjekter. For eksempel sparer bruk av redundanskoder i stedet for replikering i vÄr interne objektlagring millioner uten at det gÄr pÄ bekostning av pÄliteligheten. Men til tross for deres utbredte bruk, er en klar beskrivelse av hvordan redundanskoder fungerer svÊrt sjelden. De som Þnsker Ä forstÄ dem, stÄr overfor noe som ligner pÄ fÞlgende (fra ):

Mitt navn er Vadim, og jeg utvikler Yandex sin interne MDS-objektlagring. I denne artikkelen vil jeg beskrive de teoretiske grunnlagene for redundansekoder (Reed-Solomon- og LRC-koder) pÄ en enkel mÄte. Jeg vil forklare hvordan de fungerer, uten kompleks matematikk eller uvanlig sjargong. Til slutt vil jeg gi eksempler pÄ hvordan redundansekoder brukes hos Yandex.
Jeg vil ikke gÄ i detalj om noen av de matematiske detaljene, men jeg vil gi lenker for de som Þnsker Ä gÄ dypere inn i saken. Jeg vil ogsÄ bemerke at noen av de matematiske definisjonene kan vÊre vage, ettersom denne artikkelen er ment for ingeniÞrer, ikke matematikere, som Þnsker Ä forstÄ de underliggende konseptene.
* I engelsksprÄklig litteratur kalles redundanskoder ofte slettekoder.
1. Essensen av redundansekoder
Essensen i all redundanskode er ekstremt enkel: Ä lagre (eller overfÞre) data slik at de ikke gÄr tapt nÄr det oppstÄr feil (diskfeil, dataoverfÞringsfeil osv.).
I de fleste* redundanskoder er data delt inn i n datablokker, hvor m redundanskodeblokker vurderes, for totalt n + m blokker. Redundanskoder er konstruert pÄ en slik mÄte at n datablokker kan rekonstrueres ved Ä bruke bare en del av de n + m blokkene. I det fÞlgende vil vi bare vurdere blokkredundanskoder, det vil si de der data er delt inn i blokker.

For Ä gjenopprette alle n datablokker trenger du minst n av n + m blokker, siden du ikke kan fÄ n blokker fra bare n - 1 blokk (i sÄ fall mÄ du plukke én blokk "ut av lÞse luften"). Er n vilkÄrlige blokker fra n + m blokker tilstrekkelige til Ä gjenopprette alle dataene? Dette avhenger av typen redundanskoder. For eksempel lar Reed-Solomon-koder deg gjenopprette alle dataene ved hjelp av vilkÄrlige n blokker, mens LRC-redundanskoder ikke alltid gjÞr dette.
Datalagring
I datalagringssystemer skrives vanligvis hver datablokk og redundanskodeblokk til en separat disk. Dette sikrer at hvis en disk svikter, kan de opprinnelige dataene fortsatt gjenopprettes og leses. Data kan gjenopprettes selv om flere disker svikter samtidig.
DataoverfĂžring
Redundanskoder kan brukes til Ä overfÞre data pÄlitelig over et upÄlitelig nettverk. De overfÞrte dataene deles inn i blokker, og redundanskoder beregnes for disse blokkene. BÄde datablokkene og redundanskodeblokkene overfÞres over nettverket. Selv om det oppstÄr feil i vilkÄrlige blokker (opptil et visst antall blokker), kan dataene fortsatt overfÞres feilfritt over nettverket. Reed-Solomon-koder brukes for eksempel til Ä overfÞre data over optiske kommunikasjonslinjer og i satellittkommunikasjon.
* Det finnes ogsÄ redundansekoder som ikke deler data inn i blokker, for eksempel Hamming-koder og CRC-koder, som er mye brukt for dataoverfÞring i Ethernet-nettverk. Disse kodene er feilrettingskoder som er utformet for Ä oppdage feil i stedet for Ä korrigere dem (Hamming-koder tillater ogsÄ delvis feilretting).
2. Reed-Solomon-koder
Reed-Solomon-koder er en av de mest brukte redundanskodene, oppfunnet pÄ 1960-tallet og fÞrst mye brukt pÄ 1980-tallet for masseproduksjon av kompakte plater.
Det er to viktige spÞrsmÄl for Ä forstÄ Reed-Solomon-koder: 1) hvordan lage redundanskodeblokker; 2) hvordan gjenopprette data ved hjelp av redundanskodeblokker. La oss finne svarene.
For enkelhets skyld antar vi at n=6 og m=4. Andre skjemaer vurderes analogt.
Slik lager du redundanskodeblokker
Hver redundanskodeblokk beregnes uavhengig av de andre. Alle n datablokker brukes til Ă„ beregne hver blokk. I diagrammet nedenfor er X1âX6 datablokker, og P1âP4 er redundanskodeblokker.

Alle datablokker mÄ ha samme stÞrrelse; null bits kan brukes til justering. De resulterende redundanskodeblokkene vil ha samme stÞrrelse som datablokkene. Alle datablokker er delt inn i ord (f.eks. 16 bits hver). Anta at vi deler datablokkene inn i k ord. Da vil alle redundanskodeblokker ogsÄ bli delt inn i k ord.

For Ă„ beregne det i-te ordet i hver redundansblokk, vil det i-te ordet i alle datablokkene bli brukt. De vil bli beregnet ved hjelp av fĂžlgende formel:

Her er x-verdiene ordene i datablokkene, p er ordene i redundanskodeblokkene, og alle alfa-, beta-, gamma- og delta-verdiene er spesielt utvalgte tall som er like for alle i-er. Det bÞr bemerkes med en gang at alle disse verdiene ikke er vanlige tall, men elementer i et Galois-felt. Operasjonene +, -, *, / er ikke operasjonene vi alle er kjent med, men spesielle operasjoner introdusert pÄ elementer i et Galois-felt.
Hvorfor trengs Galois-felt?

Det virker enkelt: vi deler dataene inn i blokker, blokkene inn i ord, og bruker deretter ordene i datablokkene til Ă„ beregne ordene i redundanskodeblokkene, noe som resulterer i redundanskodeblokker. Det er slik det fungerer, men djevelen ligger i detaljene:
- Som nevnt ovenfor er ordstÞrrelsen fast, 16 bit i vÄrt eksempel. Formlene ovenfor for Reed-Solomon-koder er slik at nÄr man bruker vanlige heltall, kan resultatet av beregning av p kanskje ikke representeres med et ord av akseptabel stÞrrelse.
- Ved gjenoppretting av data vil formlene ovenfor bli behandlet som et system av ligninger som mÄ lÞses for Ä gjenopprette dataene. Under lÞsningsprosessen kan det vÊre nÞdvendig Ä dele heltall med hverandre, noe som resulterer i et reelt tall som ikke kan representeres nÞyaktig i datamaskinens minne.
Disse problemene hindrer bruk av heltall for Reed-Solomon-koder. LÞsningen pÄ dette problemet er genial og kan beskrives som fÞlger: la oss finne opp spesielle tall som kan representeres ved hjelp av ord med Þnsket lengde (for eksempel 16 bit), og resultatene av alle operasjoner pÄ disse tallene (addisjon, subtraksjon, multiplikasjon, divisjon) vil ogsÄ bli representert i datamaskinens minne ved hjelp av ord med Þnsket lengde.
Slike «spesielle» tall har lenge blitt studert av matematikere; de ââkalles felt. Et felt er et sett med elementer med spesifikke operasjoner for addisjon, subtraksjon, multiplikasjon og divisjon.
Galois-felt* er felt der resultatet av hver operasjon (+, -, *, /) for to elementer i feltet eksisterer og er unikt. Galois-felt kan konstrueres for tall som er potenser av 2: 2, 4, 8, 16 og sÄ videre (faktisk potenser av et hvilket som helst primtall p, men i praksis er vi bare interessert i potenser av 2). For eksempel, for 16-bits ord er dette et felt som inneholder 65 536 elementer, der resultatet av en hvilken som helst operasjon (+, -, *, /) kan finnes for hvert par. Verdiene x, p, alfa, beta, gamma og delta fra ligningene ovenfor vil bli betraktet som elementer i Galois-feltet for beregninger.
Dermed har vi et ligningssystem som kan brukes til Ä konstruere redundanskodeblokker ved Ä skrive et tilsvarende dataprogram. Det samme ligningsystemet kan ogsÄ brukes til Ä utfÞre datagjenoppretting.
*Dette er ikke en streng definisjon, men snarere en beskrivelse.
Slik gjenoppretter du data
Gjenoppretting er nÞdvendig nÄr noen av n + m-blokkene mangler. Disse kan enten vÊre datablokker eller redundanskodeblokker. Manglende datablokker og/eller redundanskodeblokker vil bety at de tilsvarende variablene x og/eller p i ligningene ovenfor er ukjente.
Ligningene for Reed-Solomon-koder kan sees pÄ som et system av ligninger der alle alfa-, beta-, gamma- og delta-verdier er konstanter, alle x og p som tilsvarer de tilgjengelige blokkene er kjente variabler, og de resterende x og p er ukjente.
Hvis for eksempel datablokkene 1, 2, 3 og redundanskodeblokk 2 ikke er tilgjengelige, vil det for den i-te gruppen av ord vĂŠre fĂžlgende ligningssystem (ukjente er markert med rĂždt):

Vi har et system med 4 ligninger med 4 ukjente, som betyr at vi kan lĂžse det og gjenopprette dataene!
Fra dette ligningssystemet fĂžlger en rekke konklusjoner om datagjenoppretting for Reed-Solomon-koder (n datablokker, m redundanskodeblokker):
- Data kan gjenopprettes hvis m eller fÊrre blokker gÄr tapt. Hvis m+1 eller flere blokker gÄr tapt, kan ikke data gjenopprettes: et system av m ligninger med m+1 ukjente kan ikke lÞses.
- For Ä gjenopprette bare én datablokk, mÄ hvilken som helst n av de gjenvÊrende blokkene brukes, og hvilken som helst av redundanskodene kan brukes.
Hva annet trenger jeg Ă„ vite?
I beskrivelsen ovenfor har jeg ignorert en rekke viktige problemstillinger som krever et dypere dykk i matematikk. Spesielt har jeg ikke diskutert fĂžlgende:
- Ligningssystemet for Reed-Solomon-koder mÄ ha en unik lÞsning for enhver kombinasjon av ukjente (ikke mer enn m ukjente). Verdiene for alfa, beta, gamma og delta velges basert pÄ dette kravet.
- Det er nĂždvendig Ă„ kunne konstruere et ligningssystem automatisk (avhengig av hvilke blokker som er utilgjengelige) og lĂžse det.
- Vi mÄ konstruere et Galois-felt: for en gitt ordstÞrrelse mÄ vi kunne finne resultatet av en hvilken som helst operasjon (+, -, *, /) for to elementer.
PĂ„ slutten av artikkelen finner du lenker til litteratur om disse viktige problemstillingene.
Valg av n og m
Hvordan velger man n og m i praksis? I datalagringssystemer brukes redundanskoder for Ä spare plass, sÄ m velges alltid til Ä vÊre mindre enn n. De spesifikke verdiene deres avhenger av en rekke faktorer, inkludert:
- PÄlitelighet av datalagring. Jo stÞrre m, desto flere diskfeil kan tolereres, noe som betyr hÞyere pÄlitelighet.
- Lagringsredundans. Jo hĂžyere m/n-forhold, desto stĂžrre lagringsredundans og desto dyrere er systemet.
- Behandlingstid for spÞrringen. Jo stÞrre summen av n + m er, desto lengre er responstiden for spÞrringen. Siden lesing av data (under gjenoppretting) krever lesing av n blokker lagret pÄ n forskjellige disker, vil lesetiden bli bestemt av den tregeste disken.
Videre medfÞrer lagring av data pÄ tvers av flere datasentre ytterligere begrensninger for valget av n og m: hvis ett datasenter er frakoblet, mÄ dataene fortsatt vÊre lesbare. For eksempel, nÄr data lagres pÄ tvers av tre datasentre, mÄ betingelsen m >= n/2 vÊre oppfylt; ellers kan dataene bli uleselige hvis ett datasenter er frakoblet.
3. LRC - Lokale rekonstruksjonsforskrifter
Gjenoppretting av data ved hjelp av Reed-Solomon-koder krever bruk av n tilfeldige datablokker. Dette er en betydelig ulempe for distribuerte lagringssystemer, ettersom gjenoppretting av data fra én defekt disk krever lesing av data fra de fleste av de andre, noe som skaper en betydelig ekstra belastning pÄ diskene og nettverket.
Den vanligste feilen er utilgjengeligheten til en enkelt datablokk pÄ grunn av en defekt eller overbelastet disk. Er det mulig Ä redusere den overskytende belastningen pÄ datagjenoppretting i dette (vanligste) tilfellet? Det viser seg at det er det: LRC-redundanskoder finnes spesifikt for dette formÄlet.
LRC (Local Reconstruction Codes) er redundansekoder utviklet av Microsoft for bruk i Windows Azure Storage. Ideen bak LRC er veldig enkel: del alle datablokkene inn i to (eller flere) grupper og beregn en del av redundanskodeblokkene for hver gruppe separat. Deretter vil noen av redundanskodeblokkene bli beregnet ved hjelp av alle datablokkene (i LRC kalles disse globale redundanskoder), og noen vil bli beregnet ved hjelp av en av de to gruppene med datablokker (disse kalles lokale redundanskoder).
LRC er betegnet med tre tall: nrl, hvor n er antall datablokker, r er antall globale redundanskodeblokker og l er antall lokale redundanskodeblokker. For Ă„ lese data nĂ„r Ă©n datablokk ikke er tilgjengelig, trenger bare n/l blokker Ă„ leses â dette er l ganger fĂŠrre enn i Reed-Solomon-koder.
Som et eksempel, la oss se pĂ„ LRC 6-2-2-skjemaet. X1âX6 er 6 datablokker, P1, P2 er 2 globale redundansblokker, P3, P4 er 2 lokale redundansblokker.

Redundanskodeblokkene P1 og P2 beregnes ved hjelp av alle datablokkene. Redundanskodeblokk P3 beregnes ved hjelp av datablokkene X1âX3, og redundanskodeblokk P4 beregnes ved hjelp av datablokkene X4âX6.
Resten av arbeidet i LRC gjÞres pÄ samme mÄte som i Reed-Solomon-koder. Ligningene for Ä telle ordene i redundanskodeblokker er som fÞlger:

For Ä velge alfa-, beta-, gamma- og delta-tallene mÄ en rekke betingelser oppfylles for Ä sikre muligheten for datagjenoppretting (dvs. lÞsning av ligningssystemet). Du kan lese mer om dem i .
I praksis brukes ogsÄ XOR-operasjonen til Ä beregne lokale redundanskoder P3, P4.
En rekke konklusjoner fĂžlger av ligningssystemet for LRC:
- For Ä gjenopprette én datablokk er det nok Ä lese n/l blokker (n/2 i vÄrt eksempel).
- Hvis r + l-blokker ikke er tilgjengelige, og alle blokkene er i samme gruppe, kan ikke dataene gjenopprettes. Dette kan enkelt forklares med et eksempel. La oss si at blokkene X1âX3 og P3 ikke er tilgjengelige: dette er r + l-blokker fra samme gruppe, 4 i vĂ„rt tilfelle. Da har vi et system med 3 ligninger med 4 ukjente som ikke kan lĂžses.
- I alle andre tilfeller der r + l-blokker ikke er tilgjengelige (nÄr minst én blokk fra hver gruppe er tilgjengelig), kan dataene i LRC gjenopprettes.
Dermed overgÄr LRC Reed-Solomon-koder i datagjenoppretting etter enkeltfeil. Reed-Solomon-koder krever n blokker for Ä gjenopprette selv én datablokk, mens LRC krever n/l blokker (n/2 i vÄrt eksempel) for Ä gjenopprette én datablokk. PÄ den annen side er LRC dÄrligere enn Reed-Solomon-koder nÄr det gjelder maksimalt antall tillatte feil. I eksemplene ovenfor kan Reed-Solomon-koder gjenopprette data med fire feil, mens det for LRC er to kombinasjoner av fire feil som ikke kan gjenopprettes for.
Om dette er viktigere avhenger av den spesifikke situasjonen, men ofte oppveier besparelsene i driftskostnader som LRC gir den litt lavere lagringspÄliteligheten.
4. Andre redundansekoder
Foruten Reed-Solomon- og LRC-koder finnes det mange andre redundanskoder. Ulike redundanskoder bruker ulik matematikk. Her er noen andre redundanskoder:
- Redundanskode ved bruk av XOR-operatoren. XOR-operasjonen utfÞres pÄ n datablokker, noe som resulterer i 1 blokk med redundanskoder, dvs. skjemaet n+1 (n datablokker, 1 redundanskode). Den brukes i , der datablokker og redundanskoder skrives syklisk til alle disker i arrayet.
- En like-oddetallsalgoritme basert pÄ XOR-operasjonen. Den tillater konstruksjon av to blokker med redundanskoder, dvs. et n+2-skjema.
- STAR-algoritmen, basert pÄ XOR-operasjonen, tillater konstruksjon av tre redundanskodeblokker, dvs. et n+3-skjema.
- Pyramide-koder er en annen redundanskode fra Microsoft.
5. Bruk i Yandex
En rekke Yandex-infrastrukturprosjekter bruker redundansekoder for sikker datalagring. Her er noen eksempler:
- Den interne MDS-objektlagringen som jeg skrev om i begynnelsen av artikkelen.
- â Yandex MapReduce-systemet.
- (Yandex DataBase) er en distribuert newSQL-database.
MDS bruker LRC-redundanskoder, et 8-2-2-skjema. Data med redundanskoder skrives til 12 forskjellige disker pÄ forskjellige servere i tre forskjellige datasentre: fire servere i hvert datasenter. Les mer om dette i .
YT bruker bÄde Reed-Solomon-koder (6-3-skjema), som var de fÞrste som ble implementert, og LRC-redundanskoder (12-2-2-skjema), med LRC som den foretrukne lagringsmetoden.
YDB bruker redundanskoder basert pÄ like-oddetall (figur 4-2). Redundanskoder i YDB har allerede blitt diskutert. .
Bruken av forskjellige redundanskodeordninger dikteres av forskjellige systemkrav. I MDS plasseres for eksempel data lagret ved hjelp av LRC pÄ tvers av tre datasentre. Det er viktig at dataene forblir tilgjengelige selv om et datasenter svikter, sÄ blokker mÄ fordeles pÄ tvers av datasentrene, slik at hvis et datasenter er utilgjengelig, overstiger ikke antallet utilgjengelige blokker den tillatte grensen. I 8-2-2-ordningen kan fire blokker plasseres i hvert datasenter. Hvis et datasenter svikter, vil fire blokker vÊre utilgjengelige, og dataene vil fortsatt vÊre tilgjengelige. Uansett hvilken ordning som velges for plassering pÄ tvers av tre datasentre, kreves (r + l) / n >= 0,5, noe som betyr at lagringsredundansen vil vÊre minst 50 %.
Situasjonen er annerledes i YT: hver YT-klynge er fullstendig plassert i ett enkelt datasenter (forskjellige klynger i forskjellige datasentre), sÄ det finnes ingen slik begrensning. 12-2-2-designet gir 33 % redundans, noe som betyr at datalagring er billigere, og det kan ogsÄ overleve opptil fire samtidige diskavbrudd, akkurat som MDS-designet.
Det er mange andre spesifikke aspekter ved bruk av redundansekoder i datalagrings- og behandlingssystemer: nyansene ved datagjenoppretting, virkningen av gjenoppretting pÄ utfÞrelsestid for spÞrringer, detaljene ved dataregistrering, osv. Jeg planlegger Ä diskutere disse og andre aspekter ved bruk av redundansekoder i praksis separat, hvis emnet er av interesse.
6. Lenker
- En serie artikler om Reed-Solomon-koder og Galois-felt:
De gir et mer dyptgÄende blikk pÄ matematikk pÄ et tilgjengelig sprÄk. - Microsoft-artikkel om LRC:
Del 2 forklarer kort teorien og drĂžfter deretter den praktiske anvendelsen av LRC. - Par-oddetallsordning:
- STAR-ordningen:
- Pyramidekoder:
- Redundansekoder i MDS:
- Redundansekoder i YT:
- Redundansekoder i YDB:
Kilde: www.habr.com
