
Ovako izgleda viŔak
Redundantni kodovi* se Å”iroko koriste u raÄunarskim sistemima za poveÄanje pouzdanosti skladiÅ”tenja podataka. U Yandexu se koriste u mnogim projektima. Na primjer, koriÅ”tenje redundantnih kodova umjesto replikacije u naÅ”oj internoj pohrani objekata Å”tedi milione bez žrtvovanja pouzdanosti. Ali uprkos njihovoj Å”irokoj upotrebi, jasni opisi kako funkcioniÅ”u redundantni kodovi su veoma retki. Oni koji žele razumjeti suoÄavaju se sa otprilike sljedeÄim (iz ):

Moje ime je Vadim, u Yandexu razvijam MDS internu pohranu objekata. U ovom Älanku Äu jednostavnim rijeÄima opisati teorijske osnove redundantnih kodova (Reed-Solomon i LRC kodovi). ReÄi Äu vam kako to funkcionira, bez složene matematike i rijetkih termina. Na kraju Äu dati primjere koriÅ”tenja redundantnih kodova u Yandexu.
NeÄu detaljno razmatrati brojne matematiÄke detalje, ali Äu dati linkove za one koji žele dublje zaroniti. TakoÄer Äu napomenuti da neke matematiÄke definicije možda nisu stroge, jer Älanak nije namijenjen matematiÄarima, veÄ inženjerima koji žele razumjeti suÅ”tinu problema.
* U literaturi na engleskom jeziku, redundantni kodovi se Äesto nazivaju kodovima za brisanje.
1. SuŔtina redundantnih kodova
SuŔtina svih redundantnih kodova je krajnje jednostavna: pohraniti (ili prenijeti) podatke tako da se ne izgube kada se pojave greŔke (kvarovi diska, greŔke u prijenosu podataka, itd.).
U veÄini* redundantnih kodova, podaci su podijeljeni u n blokova podataka, za koje se broji m blokova redundantnih kodova, Å”to rezultira ukupno n + m blokova. Redundantni kodovi su konstruisani na takav naÄin da se n blokova podataka može povratiti koristeÄi samo dio od n + m blokova. Zatim Äemo razmotriti samo blokove redundantne kodove, odnosno one u kojima su podaci podijeljeni u blokove.

Da biste oporavili svih n blokova podataka, morate imati najmanje n od n + m blokova, jer ne možete dobiti n blokova ako imate samo n-1 blok (u ovom sluÄaju, morali biste uzeti 1 blok iz tankog zrak"). Da li je n nasumiÄnih blokova od n + m blokova dovoljno za oporavak svih podataka? Ovo ovisi o vrsti redundantnih kodova, na primjer, Reed-Solomon kodovi vam omoguÄavaju da oporavite sve podatke koristeÄi proizvoljnih n blokova, ali LRC redundantni kodovi to ne Äine uvijek.
Pohrana podataka
U sistemima za pohranu podataka, po pravilu, svaki od blokova podataka i blokova redundantnog koda zapisuje se na poseban disk. Zatim, ako proizvoljni disk pokvari, originalni podaci se i dalje mogu vratiti i proÄitati. Podaci se mogu oporaviti Äak i ako nekoliko diskova otkaže u isto vrijeme.
Prijenos podataka
Kodovi redundantnosti se mogu koristiti za pouzdan prijenos podataka preko nepouzdane mreže. Preneseni podaci se dijele na blokove i za njih se izraÄunavaju redundantni kodovi. I blokovi podataka i blokovi redundantnog koda se prenose preko mreže. Ako doÄe do greÅ”ke u proizvoljnim blokovima (do odreÄenog broja blokova), podaci se i dalje mogu prenositi preko mreže bez greÅ”ke. Reed-Solomon kodovi se, na primjer, koriste za prijenos podataka preko optiÄkih komunikacijskih linija iu satelitskim komunikacijama.
* Postoje i redundantni kodovi u kojima se podaci ne dijele na blokove, kao Å”to su Hamming kodovi i CRC kodovi, koji se Å”iroko koriste za prijenos podataka u Ethernet mrežama. Ovo su kodovi za kodiranje za ispravljanje greÅ”aka, dizajnirani su da otkriju greÅ”ke, a ne da ih ispravljaju (Hemmingov kod takoÄe omoguÄava delimiÄnu ispravku greÅ”aka).
2. Reed-Solomon kodovi
Reed-Solomon kodovi su jedan od najÄeÅ”Äe koriÅ”tenih redundantnih kodova, izmiÅ”ljeni joÅ” 1960-ih i prvi put Å”iroko koriÅ”teni 1980-ih za masovnu proizvodnju kompaktnih diskova.
Postoje dva kljuÄna pitanja za razumevanje Reed-Solomon kodova: 1) kako kreirati blokove redundantnih kodova; 2) kako oporaviti podatke koristeÄi redundantne kodne blokove. Hajde da naÄemo odgovore na njih.
Radi jednostavnosti, dalje Äemo pretpostaviti da je n=6 i m=4. Druge sheme se razmatraju analogno.
Kako kreirati redundantne blokove koda
Svaki blok redundantnih kodova se broji nezavisno od ostalih. Svih n blokova podataka se koriste za brojanje svakog bloka. U dijagramu ispod, X1-X6 su blokovi podataka, P1-P4 su blokovi redundantnog koda.

Svi blokovi podataka moraju biti iste veliÄine, a nulti bitovi se mogu koristiti za poravnanje. RezultirajuÄi blokovi redundantnog koda bit Äe iste veliÄine kao blokovi podataka. Svi blokovi podataka podijeljeni su u rijeÄi (na primjer, 16 bita). Recimo da smo blokove podataka podijelili na k rijeÄi. Tada Äe svi blokovi redundantnih kodova takoÄer biti podijeljeni na k rijeÄi.

Za brojanje i-te rijeÄi svakog redundantnog bloka, koristit Äe se i-ta rijeÄ svih blokova podataka. Oni Äe se izraÄunati prema sljedeÄoj formuli:

Ovdje su vrijednosti x rijeÄi blokova podataka, p su rijeÄi blokova redundantnog koda, svi alfa, beta, gama i delta su posebno odabrani brojevi koji su isti za sve i. Odmah se mora reÄi da sve ove vrijednosti nisu obiÄni brojevi, veÄ elementi polja Galois, operacije +, -, *, / nisu operacije poznate svima nama, veÄ posebne operacije uvedene na elemente Galoisovog polja; polje.
ZaŔto su Galois polja potrebna?

Äini se da je sve jednostavno: podatke dijelimo na blokove, blokove na rijeÄi, koristeÄi rijeÄi blokova podataka brojimo rijeÄi blokova redundantnog koda - dobivamo blokove redundantnog koda. OpÄenito ovako funkcionira, ali Äavo je u detaljima:
- Kao Å”to je gore navedeno, veliÄina rijeÄi je fiksna, u naÅ”em primjeru 16 bita. Formule iznad za Reed-Solomon kodove su takve da kada se koriste obiÄni cijeli brojevi, rezultat izraÄunavanja p možda neÄe biti predstavljen koriÅ”tenjem rijeÄi važeÄe veliÄine.
- Prilikom oporavka podataka, gornje formule Äe se smatrati sistemom jednaÄina koje se moraju rijeÅ”iti da bi se podaci oporavili. Tokom procesa rjeÅ”avanja, možda Äe biti potrebno podijeliti cijele brojeve jedni s drugima, Å”to rezultira realnim brojem koji se ne može precizno predstaviti u memoriji raÄunala.
Ovi problemi spreÄavaju upotrebu celih brojeva za Reed-Solomon kodove. RjeÅ”enje problema je originalno, može se opisati na sljedeÄi naÄin: smislimo posebne brojeve koji se mogu predstaviti rijeÄima potrebne dužine (na primjer, 16 bita), i rezultat izvoÄenja svih operacija nad kojima (zbrajanje , oduzimanje, množenje, dijeljenje) Äe se takoÄer prikazati u memoriji raÄunala pomoÄu rijeÄi potrebne dužine.
Takve āposebneā brojeve matematika prouÄava veÄ dugo vremena; Polje je skup elemenata za koje su definirane operacije sabiranja, oduzimanja, množenja i dijeljenja.
Galois* polja su polja za koja postoji jedinstveni rezultat svake operacije (+, -, *, /) za bilo koja dva elementa polja. Galois polja se mogu konstruisati za brojeve koji su stepena 2: 2, 4, 8, 16, itd. (zapravo stepena bilo kojeg prostog broja p, ali u praksi nas zanimaju samo stepeni 2). Na primjer, za 16-bitne rijeÄi, ovo je polje koje sadrži 65 elemenata, za svaki par od kojih možete pronaÄi rezultat bilo koje operacije (+, -, *, /). Vrijednosti x, p, alfa, beta, gama, delta iz gornjih jednaÄina Äe se smatrati elementima Galois polja za proraÄune.
Dakle, imamo sistem jednaÄina sa kojima možemo konstruisati blokove redundantnih kodova pisanjem odgovarajuÄeg kompjuterskog programa. KoristeÄi isti sistem jednaÄina, možete izvrÅ”iti oporavak podataka.
* Ovo nije stroga definicija, veÄ opis.
Kako oporaviti podatke
Restauracija je potrebna kada neki od n + m blokova nedostaju. To mogu biti i blokovi podataka i blokovi redundantnog koda. Odsustvo blokova podataka i/ili blokova redundantnog koda Äe znaÄiti da su odgovarajuÄe x i/ili p varijable nepoznate u gornjim jednaÄinama.
JednaÄine za Reed-Solomon kodove se mogu posmatrati kao sistem jednaÄina u kojem su sve alfa, beta, gama, delta vrijednosti konstante, svi x i p koji odgovaraju dostupnim blokovima su poznate varijable, a preostali x i p su nepoznati.
Na primjer, neka blokovi podataka 1, 2, 3 i blok kodova redundancije 2 budu nedostupni, tada Äe za i-tu grupu rijeÄi postojati sljedeÄi sistem jednadžbi (nepoznate su oznaÄene crvenom bojom):

Imamo sistem od 4 jednaÄine sa 4 nepoznate, Å”to znaÄi da ga možemo rijeÅ”iti i vratiti podatke!
Iz ovog sistema jednadžbi slijedi niz zakljuÄaka o obnavljanju podataka za Reed-Solomon kodove (n blokova podataka, m blokova redundantnih kodova):
- Podaci se mogu oporaviti ako se izgubi bilo koji m blokova ili manje. Ako se izgubi m+1 ili viÅ”e blokova, podaci se ne mogu vratiti: nemoguÄe je rijeÅ”iti sistem m jednaÄina sa m + 1 nepoznatim.
- Da biste obnovili Äak i jedan blok podataka, trebate koristiti bilo koji n preostalih blokova, a možete koristiti bilo koji od redundantnih kodova.
Å ta joÅ” treba da znate
U gornjem opisu izbjegavam niz važnih pitanja koja zahtijevaju dublje uronjenje u matematiku. Konkretno, ne govorim niÅ”ta o sljedeÄem:
- Sistem jednaÄina za Reed-Solomon kodove mora imati (jedinstveno) rjeÅ”enje za bilo koju kombinaciju nepoznatih (ne viÅ”e od m nepoznatih). Na osnovu ovog zahtjeva biraju se vrijednosti alfa, beta, gama i delta.
- Sistem jednaÄina mora biti u stanju da se automatski konstruiÅ”e (u zavisnosti od toga koji blokovi su nedostupni) i reÅ”i.
- Moramo izgraditi Galois polje: za datu veliÄinu rijeÄi, moÄi pronaÄi rezultat bilo koje operacije (+, -, *, /) za bilo koja dva elementa.
Na kraju Älanka nalaze se reference na literaturu o ovim važnim pitanjima.
Izbor n i m
Kako odabrati n i m u praksi? U praksi, u sistemima za skladiÅ”tenje podataka, redundantni kodovi se koriste za uÅ”tedu prostora, pa se m uvijek bira manje od n. Njihove specifiÄne vrijednosti zavise od brojnih faktora, ukljuÄujuÄi:
- Pouzdanost skladiÅ”tenja podataka. Å to je veÄi m, to je veÄi broj kvarova diska koji se mogu preživjeti, odnosno veÄa je pouzdanost.
- Redundantna pohrana. Å to je veÄi m/n odnos, to Äe biti veÄa redundantnost skladiÅ”tenja, a sistem Äe biti skuplji.
- Vrijeme obrade zahtjeva. Å to je veÄi zbir n + m, duže Äe biti vrijeme odgovora na zahtjeve. BuduÄi da Äitanje podataka (tokom oporavka) zahtijeva Äitanje n blokova pohranjenih na n razliÄitih diskova, vrijeme Äitanja Äe biti odreÄeno najsporijim diskom.
Osim toga, pohranjivanje podataka u nekoliko DC-ova nameÄe dodatna ograniÄenja na izbor n i m: ako je 1 DC iskljuÄen, podaci i dalje moraju biti dostupni za Äitanje. Na primjer, kada se podaci pohranjuju u 3 DC-a, mora biti ispunjen sljedeÄi uvjet: m >= n/2, inaÄe može doÄi do situacije da podaci nisu dostupni za Äitanje kada je 1 DC iskljuÄen.
3. LRC - Lokalni kodovi za rekonstrukciju
Da biste oporavili podatke pomoÄu Reed-Solomon kodova, morate koristiti n proizvoljnih blokova podataka. Ovo je veoma znaÄajan nedostatak za distribuirane sisteme za skladiÅ”tenje podataka, jer da biste vratili podatke na jednom pokvarenom disku, moraÄete da Äitate podatke sa veÄine drugih, stvarajuÄi veliko dodatno optereÄenje na diskovima i mreži.
NajÄeÅ”Äe greÅ”ke su nedostupnost jednog bloka podataka zbog kvara ili preoptereÄenja jednog diska. Da li je moguÄe nekako smanjiti viÅ”ak optereÄenja za oporavak podataka u ovom (najÄeÅ”Äem) sluÄaju? Ispostavilo se da možete: postoje LRC redundantni kodovi posebno za ovu svrhu.
LRC (Lokalne rekonstrukcijske Å”ifre) su redundantni kodovi koje je razvio Microsoft za upotrebu u Windows Azure Storage. Ideja iza LRC-a je vrlo jednostavna: podijeliti sve blokove podataka u dvije (ili viÅ”e) grupa i izraÄunati dio blokova redundanÄnog koda za svaku grupu zasebno. Zatim Äe se neki od blokova redundanÄnog koda izraÄunati koriÅ”tenjem svih blokova podataka (u LRC-u se to naziva globalni redundanÄni kodovi), a neki Äe se izraÄunati koriÅ”tenjem jedne od dvije grupe blokova podataka (oni se nazivaju lokalni redundanÄni kodovi).
LRC je oznaÄen sa tri broja: nrl, gdje je n broj blokova podataka, r je broj blokova globalnog redundantnog koda, l je broj blokova lokalnog redundantnog koda. Da biste proÄitali podatke kada je jedan blok podataka nedostupan, morate proÄitati samo n/l blokova - to je l puta manje nego u Reed-Solomon kodovima.
Na primjer, razmotrite LRC 6-2-2 shemu. X1āX6 ā 6 blokova podataka, P1, P2 ā 2 globalna redundantna bloka, P3, P4 ā 2 lokalna redundantna bloka.

Redundantni kodni blokovi P1, P2 se broje koristeÄi sve blokove podataka. Redundantni kodni blok P3 - koriÅ”tenjem blokova podataka X1-X3, redundantni kodni blok P4 - koriÅ”tenjem podatkovnih blokova X4-X6.
Ostalo se radi u LRC-u po analogiji sa Reed-Solomon kodovima. JednaÄine za brojanje rijeÄi redundantnih kodnih blokova Äe biti:

Da biste odabrali brojeve alfa, beta, gama, delta, moraju biti ispunjeni brojni uslovi koji garantuju moguÄnost oporavka podataka (tj. rjeÅ”avanja sistema jednaÄina). ViÅ”e o njima možete proÄitati u .
TakoÄer u praksi, operacija XOR se koristi za izraÄunavanje lokalnih redundantnih kodova P3, P4.
Iz sistema jednadžbi za LRC slijedi niz zakljuÄaka:
- Da biste povratili bilo koji 1 blok podataka, dovoljno je proÄitati n/l blokova (n/2 u naÅ”em primjeru).
- Ako su r + l blokovi nedostupni, a svi blokovi su ukljuÄeni u jednu grupu, podaci se ne mogu vratiti. Ovo je lako objasniti na primjeru. Neka su blokovi X1āX3 i P3 nedostupni: to su r + l blokovi iz iste grupe, u naÅ”em sluÄaju 4. Tada imamo sistem od 3 jednaÄine sa 4 nepoznate koje se ne mogu rijeÅ”iti.
- U svim ostalim sluÄajevima nedostupnosti r + l blokova (kada je barem jedan blok dostupan iz svake grupe), podaci u LRC-u se mogu vratiti.
Dakle, LRC nadmaÅ”uje Reed-Solomon kodove u oporavku podataka nakon pojedinaÄnih greÅ”aka. U Reed-Solomon kodovima, da biste povratili Äak i jedan blok podataka, potrebno je koristiti n blokova, a u LRC-u, za oporavak jednog bloka podataka, dovoljno je koristiti n/l blokova (n/2 u naÅ”em primjeru). S druge strane, LRC je inferiorniji od Reed-Solomon kodova u smislu maksimalnog broja dozvoljenih greÅ”aka. U gornjim primjerima, Reed-Solomon kodovi mogu oporaviti podatke za bilo koje 4 greÅ”ke, a za LRC postoje 2 kombinacije od 4 greÅ”ke kada se podaci ne mogu oporaviti.
Ono Å”to je joÅ” važnije zavisi od konkretne situacije, ali Äesto uÅ”tede u viÅ”ku optereÄenja koje LRC obezbeÄuje nadmaÅ”uju neÅ”to manje pouzdano skladiÅ”tenje.
4. Druge redundantne Ŕifre
Osim kodova Reed-Solomon i LRC, postoje mnogi drugi kodovi redundancije. RazliÄiti kodovi redundancije koriste razliÄitu matematiku. Evo joÅ” nekih kodova redundancije:
- Redundantni kod koji koristi XOR operator. XOR operacija se izvodi na n blokova podataka i dobija se 1 blok redundantnih kodova, odnosno n+1 Å”ema (n blokova podataka, 1 redundantni kod). KoriÅ”Äen u , gdje se blokovi podataka i redundantni kodovi cikliÄki upisuju na sve diskove niza.
- Parno-neparni algoritam baziran na operaciji XOR. OmoguÄava vam da izgradite 2 bloka redundantnih kodova, odnosno n+2 Å”emu.
- STAR algoritam baziran na operaciji XOR. OmoguÄava vam da napravite 3 bloka redundantnih kodova, odnosno n+3 Å”eme.
- Piramidni kodovi su joÅ” jedan Microsoftov redundantni kod.
5. Koristite u Yandexu
Brojni Yandex infrastrukturni projekti koriste redundantne kodove za pouzdano skladiŔtenje podataka. Evo nekoliko primjera:
- MDS interno skladiÅ”tenje objekata, o Äemu sam pisao na poÄetku Älanka.
- ā MapReduce sistem Yandex.
- (Yandex DataBase) - novaSQL distribuirana baza podataka.
MDS koristi LRC redundantne kodove, Å”emu 8-2-2. Podaci sa redundantnim kodovima se zapisuju na 12 razliÄitih diskova u razliÄitim serverima u 3 razliÄita DC-a: 4 servera u svakom DC-u. ViÅ”e o ovome proÄitajte u .
YT koristi i Reed-Solomon kodove (Shema 6-3), koji su prvi implementirani, i LRC redundantne kodove (Shema 12-2-2), pri Äemu je LRC poželjna metoda skladiÅ”tenja.
YDB koristi redundantne kodove bazirane na par-nepar (slika 4-2). O redundantnim kodovima u YDB-u veÄ .
Upotreba razliÄitih shema redundantnog koda je posljedica razliÄitih zahtjeva za sisteme. Na primjer, u MDS-u, podaci pohranjeni pomoÄu LRC-a se stavljaju u 3 DC-a odjednom. Za nas je važno da podaci ostanu dostupni za Äitanje ako 1 od bilo kojeg DC-a otkaže, stoga blokovi moraju biti rasporeÄeni meÄu DC-ovima tako da ako je bilo koji DC nedostupan, broj nedostupnih blokova nije veÄi od dozvoljenog. U shemi 8-2-2, možete postaviti 4 bloka u svaki DC, a onda kada je bilo koji DC iskljuÄen, 4 bloka Äe biti nedostupna i podaci se mogu Äitati. Koju god shemu da odaberemo kada je smjeÅ”tamo u 3 DC, u svakom sluÄaju treba biti (r + l) / n >= 0,5, odnosno redundantnost skladiÅ”tenja Äe biti najmanje 50%.
U YT situacija je drugaÄija: svaki YT klaster je u potpunosti lociran u 1 DC (razliÄiti klasteri u razliÄitim DC-ovima), tako da nema takvog ograniÄenja. Å ema 12-2-2 pruža 33% redundantnosti, odnosno pohranjivanje podataka je jeftinije, a može preživjeti i do 4 istovremena prekida rada diska, baÅ” kao i MDS Å”ema.
Postoji mnogo viÅ”e karakteristika upotrebe redundantnih kodova u sistemima za skladiÅ”tenje i obradu podataka: nijanse oporavka podataka, uticaj oporavka na vreme izvrÅ”enja upita, karakteristike snimanja podataka, itd. O ovim i drugim karakteristikama Äu govoriti odvojeno. upotrebe redundantnih kodova u praksi, ako Äe tema biti interesantna.
6. Linkovi
- Serija Älanaka o Reed-Solomon kodovima i Galois poljima:
Oni dublje sagledavaju matematiku na pristupaÄnom jeziku. - Microsoftov Älanak o LRC-u:
Odjeljak 2 ukratko objaŔnjava teoriju, a zatim raspravlja o iskustvima s LRC-om u praksi. - Šema par-nepar:
- STAR Ŕema:
- Piramidalni kodovi:
- Kodovi redundantnosti u MDS-u:
- Kodovi redundantnosti u YT:
- Kodovi redundantnosti u YDB:
izvor: www.habr.com
