Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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 Wikipedia):

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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.

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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.

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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.

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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:

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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?

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

Č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:

  1. 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.
  2. 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):

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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 kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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:

Redundantni kodovi: jednostavnim riječima o tome kako pohraniti podatke pouzdano i jeftino

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 članak.
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 RAID 5, 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.
  • YT — MapReduce sistem Yandex.
  • YDB (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 članak.

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ć rečeno na Highload-u.

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

  1. Serija članaka o Reed-Solomon kodovima i Galois poljima: https://habr.com/ru/company/yadro/blog/336286/
    https://habr.com/ru/company/yadro/blog/341506/
    Oni dublje sagledavaju matematiku na pristupačnom jeziku.
  2. Microsoftov članak o LRC-u: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/LRC12-cheng20webpage.pdf
    Odjeljak 2 ukratko objaŔnjava teoriju, a zatim raspravlja o iskustvima s LRC-om u praksi.
  3. Å ema par-nepar: https://people.eecs.berkeley.edu/~kubitron/courses/cs262a-F12/handouts/papers/p245-blaum.pdf
  4. STAR Ŕema: https://www.usenix.org/legacy/event/fast05/tech/full_papers/huang/huang.pdf
  5. Piramidalni kodovi: https://www.microsoft.com/en-us/research/publication/pyramid-codes-flexible-schemes-to-trade-space-for-access-efficiency-in-reliable-data-storage-systems/
  6. Kodovi redundantnosti u MDS-u: https://habr.com/ru/company/yandex/blog/311806
  7. Kodovi redundantnosti u YT: https://habr.com/ru/company/yandex/blog/311104/
  8. Kodovi redundantnosti u YDB: https://www.youtube.com/watch?v=dCpfGJ35kK8

izvor: www.habr.com

Kupite pouzdan hosting za sajtove sa DDoS zaÅ”titom, VPS VDS servere šŸ”„ Kupite pouzdan web hosting sa DDoS zaÅ”titom, VPS VDS servere | ProHoster