{"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\/it\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye","title":{"rendered":"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/4d853e314dfea596b45a6aff00238bea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Questa \u00e8 l'apparenza della ridondanza<\/em><\/p>\n<p><\/p>\n<p>I codici di ridondanza* sono ampiamente utilizzati nei sistemi informatici per migliorare l'affidabilit\u00e0 della memorizzazione dei dati. In Yandex vengono utilizzati in molti progetti. Ad esempio, l'uso dei codici di ridondanza invece della replica nel nostro deposito oggetti interno fa risparmiare milioni senza ridurre l'affidabilit\u00e0. Ma nonostante la loro ampia diffusione, una descrizione comprensibile su come funzionano i codici di ridondanza \u00e8 molto rara. Coloro che desiderano capirlo si imbattono all'incirca in quanto segue (da <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\">Wikipedie<\/a><\/noindex>):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/c5e592acd8c1e113c099357d1ba48d5c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi chiamo Vadim, in Yandex mi occupo dello sviluppo del deposito oggetti interno MDS. In questo articolo descriver\u00f2 in modo semplice le basi teoriche dei codici di ridondanza (codici di Reed-Solomon e LRC). Spiegher\u00f2 come funziona, senza matematica complessa e termini rari. Alla fine fornir\u00f2 esempi di utilizzo dei codici di ridondanza in Yandex.<\/p>\n<p><\/p>\n<p>Non approfondir\u00f2 una serie di dettagli matematici, ma fornir\u00f2 link per chi desidera approfondire. Inoltre, annoter\u00f2 che alcune definizioni matematiche potrebbero non essere rigorose, poich\u00e9 l'articolo \u00e8 indirizzato non ai matematici, ma agli ingegneri che desiderano capire il nocciolo della questione.<\/p>\n<p><\/p>\n<p>* Nella letteratura anglofona, i codici di ridondanza vengono spesso chiamati erasure codes.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"1-sut-kodov-izbytochnosti\">1. L'essenza dei codici di ridondanza<\/h1>\n<p><\/p>\n<p>L'essenza di tutti i codici di ridondanza \u00e8 estremamente semplice: memorizzare (o trasferire) i dati in modo che non vengano persi in caso di errori (guasti dei dischi, errori di trasmissione dei dati, ecc.). <\/p>\n<p><\/p>\n<p>Nella maggior parte* dei codici di ridondanza, i dati vengono suddivisi in n blocchi di dati, per i quali vengono calcolati m blocchi di codici di ridondanza, per un totale di n + m blocchi. I codici di ridondanza sono costruiti in modo che sia possibile ripristinare n blocchi di dati utilizzando solo una parte dei n + m blocchi. Successivamente, ci concentreremo solo sui codici di ridondanza a blocchi, ovvero quelli in cui i dati vengono suddivisi in blocchi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/1273b4643f915dd615026ec38ca56473.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per ripristinare tutti i n blocchi di dati, \u00e8 necessario avere almeno n da n + m blocchi, poich\u00e9 non \u00e8 possibile ottenere n blocchi avendo solo n-1 blocco (in questo caso sarebbe necessario prendere 1 blocco \"dal nulla\"). \u00c8 sufficiente avere n blocchi arbitrari da n + m blocchi per ripristinare tutti i dati? Questo dipende dal tipo di codici di ridondanza; ad esempio, i codici di Reed-Solomon consentono di ripristinare tutti i dati utilizzando n blocchi arbitrari, mentre i codici di ridondanza LRC non sempre.<\/p>\n<p><\/p>\n<h3 id=\"hranenie-dannyh\">Archiviazione dati<\/h3>\n<p><\/p>\n<p>Nelle sistemi di archiviazione dati, di solito, ciascun blocco di dati e ciascun blocco di codice di ridondanza viene registrato su un disco separato. Pertanto, in caso di rottura di un disco qualsiasi, i dati originali possono comunque essere ripristinati e letti. I dati possono essere ripristinati anche in caso di rottura simultanea di pi\u00f9 dischi.<\/p>\n<p><\/p>\n<h3 id=\"peredacha-dannyh\">Trasmissione dei dati<\/h3>\n<p><\/p>\n<p>I codici di ridondanza possono essere utilizzati per la trasmissione affidabile dei dati in una rete inaffidabile. I dati trasmessi vengono suddivisi in blocchi, per i quali vengono calcolati codici di ridondanza. Sulla rete vengono inviati sia i blocchi di dati che i blocchi di codici di ridondanza. In caso di errori in blocchi arbitrari (fino a un certo numero di blocchi), i dati possono comunque essere trasmessi senza errori sulla rete. I codici di Reed-Solomon, ad esempio, vengono utilizzati per la trasmissione dei dati su linee di comunicazione ottiche e nelle comunicazioni satellitari.<\/p>\n<p><\/p>\n<p>* Ci sono anche codici di ridondanza in cui i dati non vengono suddivisi in blocchi, ad esempio i codici di Hamming e i codici CRC, ampiamente usati per la trasmissione dei dati nelle reti Ethernet. Questi sono codici per la codifica resistente agli errori, progettati per rilevare errori, ma non per correggerli (il codice di Hamming consente anche di correggere parzialmente errori).<\/p>\n<p><\/p>\n<h1 id=\"2-kody-rida--solomona\">2. Codici di Reed-Solomon<\/h1>\n<p><\/p>\n<p>I codici di Reed-Solomon sono tra i codici di ridondanza pi\u00f9 ampiamente utilizzati, inventati negli anni '60 e impiegati per la prima volta in modo diffuso negli anni '80 per la produzione di massa di Compact Disc.<\/p>\n<p><\/p>\n<p>Le due questioni chiave per comprendere i codici di Reed-Solomon sono: 1) come creare blocchi di codici di ridondanza; 2) come ripristinare i dati utilizzando blocchi di codici di ridondanza. Troviamo le risposte a queste domande.<br \/>\nPer semplificare, considereremo d'ora in poi che n=6 e m=4. Altri schemi saranno considerati per analogia.<\/p>\n<p><\/p>\n<h3 id=\"kak-sozdavat-bloki-kodov-izbytochnosti\">Come creare blocchi di codici di ridondanza<\/h3>\n<p><\/p>\n<p>Ogni blocco di codici ridondanti viene considerato indipendentemente dagli altri. Per il calcolo di ogni blocco vengono utilizzati tutti i n blocchi di dati. Nello schema sottostante X1-X6 sono i blocchi di dati, P1\u2013P4 sono i blocchi di codici ridondanti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/b4841e48a5f2f059376bb458a26c6235.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tutti i blocchi di dati devono avere la stessa dimensione; per allinearle \u00e8 possibile utilizzare bit zero. I blocchi di codici ridondanti ottenuti avranno la stessa dimensione dei blocchi di dati. Tutti i blocchi di dati vengono suddivisi in parole (ad esempio, per 16 bit). Supponiamo di suddividere i blocchi di dati in k parole. Allora anche tutti i blocchi di codici ridondanti saranno suddivisi in k parole.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/fff9c998a760e3f05ef45497557888a9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per il calcolo della i-esima parola di ogni blocco di ridondanza verranno utilizzate le i-esime parole di tutti i blocchi di dati. Saranno calcolate secondo la seguente formula:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/8f52209ef7f628c8a748325b1a30c2d4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui i valori x sono le parole dei blocchi di dati, p sono le parole dei blocchi di codici ridondanti, tutti alfa, beta, gamma e delta sono numeri scelti in modo speciale, uguali per tutti i i. \u00c8 importante sottolineare che tutti questi valori non sono numeri comuni, ma elementi del campo di Galois; le operazioni +, -, *, \/ non sono le operazioni che conosciamo, ma operazioni speciali introdotte sugli elementi del campo di Galois.<\/p>\n<p><\/p>\n<h3 id=\"zachem-nuzhny-polya-galua\">A cosa servono i campi di Galois<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/94ed4514ae15b01e7869efdeb9a605c6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sembra tutto semplice: suddividiamo i dati in blocchi, i blocchi in parole, e usando le parole dei blocchi di dati calcoliamo le parole dei blocchi di codici ridondanti, otteniamo i blocchi di codici ridondanti. In generale, funziona cos\u00ec, ma il diavolo \u00e8 nei dettagli:<\/p>\n<p><\/p>\n<ol>\n<li>Come detto sopra, la dimensione della parola \u00e8 fissa, nel nostro esempio 16 bit. Le formule sopra per i codici di Reed-Solomon sono tali che, utilizzando numeri interi comuni, il risultato del calcolo di p potrebbe non essere rappresentabile con una parola di dimensione consentita.<\/li>\n<li>Nella fase di recupero dei dati, le formule sopra saranno considerate come un sistema di equazioni da risolvere per recuperare i dati. Nel processo di risoluzione potrebbe sorgere la necessit\u00e0 di eseguire divisioni tra numeri interi, il cui risultato sar\u00e0 un numero reale, che non pu\u00f2 essere rappresentato con precisione nella memoria del computer.<\/li>\n<\/ol>\n<p><\/p>\n<p>Questi problemi impediscono l'uso di numeri interi per i codici Reed-Solomon. La soluzione al problema \u00e8 originale e pu\u00f2 essere descritta come segue: inventiamo numeri speciali che possono essere rappresentati tramite parole di lunghezza desiderata (ad esempio, 16 bit), e il risultato di tutte le operazioni (somma, sottrazione, moltiplicazione, divisione) sar\u00e0 anch'esso rappresentato in memoria del computer tramite parole della lunghezza desiderata.<\/p>\n<p><\/p>\n<p>Questi \"numeri speciali\" sono studiati da tempo dalla matematica e vengono chiamati campi. Un campo \u00e8 un insieme di elementi con operazioni di somma, sottrazione, moltiplicazione e divisione definite per loro.<\/p>\n<p><\/p>\n<p>I campi di Galois* sono campi per i quali esiste un risultato unico per ogni operazione (+, -, *, \\\/) per qualsiasi coppia di elementi del campo. I campi di Galois possono essere costruiti per numeri che sono potenze di 2: 2, 4, 8, 16, ecc. (in realt\u00e0, per potenze di ogni numero primo p, ma nella pratica ci interessano solo le potenze di 2). Ad esempio, per le parole di dimensione 16 bit, questo campo contiene 65.536 elementi, per ciascuna delle coppie dei quali \u00e8 possibile trovare il risultato di qualsiasi operazione (+, -, *, \\\/). I valori x, p, alfa, beta, gamma, delta delle equazioni precedenti per i calcoli saranno considerati elementi del campo di Galois.<\/p>\n<p><\/p>\n<p>Pertanto, abbiamo un sistema di equazioni, che ci permette di costruire blocchi di codici di ridondanza scrivendo un'apposita programma informatica. Con lo stesso sistema di equazioni \u00e8 possibile eseguire il recupero dei dati.<\/p>\n<p><\/p>\n<p>* Questa non \u00e8 una definizione rigorosa, pi\u00f9 un descrizione.<\/p>\n<p><\/p>\n<h3 id=\"kak-vosstanavlivat-dannye\">Come recuperare i dati<\/h3>\n<p><\/p>\n<p>Il recupero \u00e8 necessario quando, da n + m blocchi, parte dei blocchi \u00e8 mancante. Questi possono essere sia blocchi di dati che blocchi di codici di ridondanza. L'assenza di blocchi di dati e\/o di blocchi di codici di ridondanza significa che nelle equazioni precedenti le corrispondenti variabili x e\/o p sono sconosciute.<\/p>\n<p><\/p>\n<p>Le equazioni per i codici Reed-Solomon possono essere considerate come un sistema di equazioni in cui tutti i valori alfa, beta, gamma, delta sono costanti, tutte le x e p corrispondenti ai blocchi disponibili sono variabili conosciute, mentre le altre x e p sono sconosciute.<\/p>\n<p><\/p>\n<p>Ad esempio, supponiamo che i blocchi di dati 1, 2, 3 e il blocco di codici di ridondanza 2 non siano disponibili, allora per il gruppo i di parole avremo il seguente sistema di equazioni (le variabili sconosciute sono segnate in rosso):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/6f24804c3d34423f31796e43e9ae1203.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo un sistema di 4 equazioni con 4 incognite, quindi possiamo risolverlo e recuperare i dati!<\/p>\n<p><\/p>\n<p>Da questo sistema di equazioni derivano alcune conclusioni sul recupero dei dati per i codici Di Reed-Solomon (n blocchi di dati, m blocchi di codici di ridondanza):<\/p>\n<p><\/p>\n<ul>\n<li>I dati possono essere recuperati in caso di perdita di qualsiasi m blocchi o meno. In caso di perdita di m + 1 blocchi o pi\u00f9, i dati non possono essere recuperati: non \u00e8 possibile risolvere un sistema di m equazioni con m + 1 incognite. <\/li>\n<li>Per recuperare anche un solo blocco di dati, \u00e8 necessario utilizzare qualsiasi n dei blocchi rimanenti, e si pu\u00f2 usare qualsiasi dei codici di ridondanza.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-eschyo-nuzhno-znat\">Cosa altro bisogna sapere<\/h3>\n<p><\/p>\n<p>Nella descrizione sopra, evito di trattare alcune questioni importanti, che richiederebbero un'approfondita comprensione della matematica. In particolare, non parlo di quanto segue:<\/p>\n<p><\/p>\n<ul>\n<li>Il sistema di equazioni per i codici Di Reed-Solomon deve avere una (e unica) soluzione per qualsiasi combinazione di incognite (non pi\u00f9 di m incognite). In base a questo requisito vengono scelti i valori di alfa, beta, gamma e delta.<\/li>\n<li>Il sistema di equazioni deve essere in grado di essere costruito automaticamente (a seconda dei blocchi non disponibili) e risolto.<\/li>\n<li>\u00c8 necessario costruire un campo di Galois: per una data dimensione della parola, essere in grado di trovare il risultato di qualsiasi operazione (+, -, *, \/) per qualsiasi due elementi.<\/li>\n<\/ul>\n<p><\/p>\n<p>Alla fine dell'articolo ci sono riferimenti alla letteratura su queste questioni importanti.<\/p>\n<p><\/p>\n<h3 id=\"vybor-n-i-m\">Scelta di n e m<\/h3>\n<p><\/p>\n<p>Come scegliere n e m nella pratica? In pratica, nei sistemi di archiviazione dati, i codici di ridondanza vengono utilizzati per risparmiare spazio, quindi m viene sempre scelto inferiore a n. I loro valori specifici dipendono da vari fattori, tra cui:<\/p>\n<p><\/p>\n<ul>\n<li>Affidabilit\u00e0 dell'archiviazione dei dati. Maggiore \u00e8 m, maggiore \u00e8 il numero di guasti ai dischi che possono essere sopportati, ossia maggiore \u00e8 l'affidabilit\u00e0.<\/li>\n<li>Ridondanza dell'archiviazione. Maggiore \u00e8 il rapporto m \/ n, maggiore sar\u00e0 la ridondanza dell'archiviazione, e maggiore sar\u00e0 il costo del sistema.<\/li>\n<li>Tempo di elaborazione delle richieste. Maggiore \u00e8 la somma n + m, pi\u00f9 lungo sar\u00e0 il tempo di risposta alle richieste. Poich\u00e9 per leggere i dati (durante il recupero) \u00e8 necessario leggere n blocchi, memorizzati su n dischi diversi, il tempo di lettura sar\u00e0 determinato dal disco pi\u00f9 lento.<\/li>\n<\/ul>\n<p><\/p>\n<p>Inoltre, la conservazione dei dati in pi\u00f9 DC impone ulteriori vincoli sulla scelta di n e m: in caso di disconnessione di 1 DC, i dati devono comunque essere accessibili in lettura. Ad esempio, conservando i dati in 3 DC, deve valere la condizione: m &gt;= n\/2; altrimenti, \u00e8 possibile che i dati non siano accessibili in lettura in caso di disconnessione di 1 DC.<\/p>\n<p><\/p>\n<h1 id=\"3-lrc--local-reconstruction-codes\">3. LRC \u2014 Codici di Ricostruzione Locale<\/h1>\n<p><\/p>\n<p>Per ripristinare i dati utilizzando i codici di Reed-Solomon, \u00e8 necessario usare n blocchi di dati arbitrari. Questo \u00e8 uno svantaggio molto significativo per i sistemi distribuiti di archiviazione dei dati, poich\u00e9 per ripristinare i dati su un disco danneggiato \u00e8 necessario leggere i dati dalla maggior parte degli altri, generando un gran carico aggiuntivo su dischi e rete.<\/p>\n<p><\/p>\n<p>Gli errori pi\u00f9 comuni sono l'inaccessibilit\u00e0 di un blocco di dati a causa di un guasto o sovraccarico di un disco. Esiste un modo per ridurre il carico eccessivo per il ripristino dei dati in tale (casi pi\u00f9 comuni) situazione? A quanto pare, s\u00ec: esistono appositamente codici di ridondanza LRC.<\/p>\n<p><\/p>\n<p>LRC (Codici di Ricostruzione Locale) sono codici di ridondanza ideati da Microsoft per l'uso in Windows Azure Storage. L'idea dell'LRC \u00e8 estremamente semplice: suddividere tutti i blocchi di dati in due (o pi\u00f9) gruppi e calcolare una parte dei blocchi di codici di ridondanza per ciascun gruppo separatamente. Cos\u00ec, una parte dei blocchi di codici di ridondanza viene calcolata utilizzando tutti i blocchi di dati (in LRC sono chiamati codici di ridondanza globali), mentre una parte viene calcolata utilizzando uno dei due gruppi di blocchi di dati (chiamati codici di ridondanza locali).<\/p>\n<p><\/p>\n<p>LRC \u00e8 indicato da tre numeri: n-r-l, dove n \u00e8 il numero di blocchi di dati, r \u00e8 il numero di blocchi di codici di ridondanza globali, l \u00e8 il numero di blocchi di codici di ridondanza locali. Per leggere i dati in caso di mancanza di un blocco di dati, \u00e8 necessario leggere solo n\/l blocchi \u2014 questo \u00e8 l di meno rispetto ai codici di Reed-Solomon.<\/p>\n<p><\/p>\n<p>Ad esempio, consideriamo lo schema LRC 6-2-2. X1\u2013X6 sono 6 blocchi di dati, P1, P2 sono 2 blocchi di ridondanza globali, P3, P4 sono 2 blocchi di ridondanza locali.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/783f6d4b57b992c56385cdd07603cda8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I blocchi di codici di ridondanza P1, P2 sono calcolati utilizzando tutti i blocchi di dati. Il blocco di codici di ridondanza P3 \u00e8 calcolato utilizzando i blocchi di dati X1\u2013X3, il blocco di codici di ridondanza P4 \u00e8 calcolato utilizzando i blocchi di dati X4\u2013X6.<\/p>\n<p><\/p>\n<p>Il resto viene fatto in LRC analogamente ai codici di Reed-Solomon. Le equazioni per il conteggio delle parole dei blocchi di codici di ridondanza saranno le seguenti:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Codici di ridondanza: spiegazioni semplici su come memorizzare dati in modo sicuro ed economico\" src=\"\/wp-content\/uploads\/2020\/07\/b32c8864fac0678014fc9a5abf490537.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per scegliere i numeri alfa, beta, gamma, delta \u00e8 necessario soddisfare una serie di condizioni che garantiscano la possibilit\u00e0 di recupero dei dati (cio\u00e8 la soluzione del sistema di equazioni). Maggiori dettagli possono essere letti in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/LRC12-cheng20webpage.pdf\">abbiamo chiarito il corretto completamento dei programmi che utilizzano il mediastreamer.<\/a><\/noindex>.<br \/>\nInoltre, nella pratica per il conteggio dei codici di ridondanza locali P3, P4 si utilizza l'operazione XOR. <\/p>\n<p><\/p>\n<p>Dalla sistema di equazioni per LRC seguono diverse conclusioni:<\/p>\n<p><\/p>\n<ul>\n<li>Per recuperare un singolo blocco di dati \u00e8 sufficiente leggere n\/l blocchi (n\/2 nel nostro esempio).<\/li>\n<li>Se non sono disponibili r + l blocchi e tutti i blocchi appartengono a un unico gruppo, i dati non possono essere recuperati. Questo \u00e8 facile spiegare con un esempio. Supponiamo che non siano disponibili i blocchi X1\u2013X3 e P3: questi sono r + l blocchi di un unico gruppo, 4 nel nostro caso. Allora abbiamo un sistema di 3 equazioni con 4 incognite, che non pu\u00f2 essere risolto.<\/li>\n<li>In tutti gli altri casi di indisponibilit\u00e0 di r + l blocchi (quando da ciascun gruppo \u00e8 disponibile almeno un blocco) i dati in LRC possono essere recuperati.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pertanto, LRC ha vantaggi rispetto ai codici Reed-Solomon nel recupero dei dati dopo errori singoli. Nei codici Reed-Solomon, per recuperare anche un solo blocco di dati, \u00e8 necessario utilizzare n blocchi, mentre in LRC per recuperare un singolo blocco di dati \u00e8 sufficiente utilizzare n\/l blocchi (n\/2 nel nostro esempio). D'altra parte, LRC \u00e8 svantaggiato rispetto ai codici Reed-Solomon per il numero massimo di errori consentiti. Negli esempi sopra, i codici Reed-Solomon possono recuperare i dati in presenza di qualsiasi 4 errori, mentre per LRC ci sono 2 combinazioni di 4 errori in cui i dati non possono essere recuperati.<\/p>\n<p><\/p>\n<p>Ci\u00f2 che \u00e8 pi\u00f9 importante dipende dalla situazione specifica, ma spesso il risparmio di carico ridondante fornito da LRC supera una leggermente minore affidabilit\u00e0 di archiviazione.<\/p>\n<p><\/p>\n<h1 id=\"4-drugie-kody-izbytochnosti\">4. Altri codici di ridondanza<\/h1>\n<p><\/p>\n<p>Oltre ai codici Reed-Solomon e LRC, ci sono molti altri codici di ridondanza. Diversi codici di ridondanza utilizzano matematica diversa. Ecco alcuni altri codici di ridondanza:<\/p>\n<p><\/p>\n<ul>\n<li>Codice di ridondanza tramite operatore XOR. L'operazione XOR viene eseguita su n blocchi di dati, ottenendo 1 blocco di codici di ridondanza, cio\u00e8 schema n+1 (n blocchi di dati, 1 codice di ridondanza). Utilizzato in <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/RAID#RAID_5\">RAID 5<\/a><\/noindex>, dove i blocchi di dati e i codici di ridondanza sono scritti ciclicamente su tutti i dischi dell'array.<\/li>\n<li>L'algoritmo even-odd, basato sull'operazione XOR. Permette di costruire 2 blocchi di codici di ridondanza, ovvero uno schema n+2.<\/li>\n<li>L'algoritmo STAR, basato sull'operazione XOR. Permette di costruire 3 blocchi di codici di ridondanza, ovvero uno schema n+3.<\/li>\n<li>I codici Pyramide \u2014 ulteriori codici di ridondanza di Microsoft.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"5-ispolzovanie-v-yandekse\">5. Utilizzo in Yandex<\/h1>\n<p><\/p>\n<p>Una serie di progetti infrastrutturali di Yandex utilizza codici di ridondanza per un'archiviazione dati affidabile. Ecco alcuni esempi:<\/p>\n<p><\/p>\n<ul>\n<li>Lo storage oggetti interno MDS, di cui ho parlato all'inizio dell'articolo.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311104\/\">YT<\/a><\/noindex> \u2014 Il sistema MapReduce di Yandex.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=FwLvAuOSIOU\">YDB<\/a><\/noindex> (Yandex DataBase) \u2014 un database distribuito newSQL.<\/li>\n<\/ul>\n<p><\/p>\n<p>In MDS si utilizzano codici di ridondanza LRC, schema 8-2-2. I dati con i codici di ridondanza vengono scritti su 12 dischi diversi in server differenti in 3 diversi DC: 4 server in ciascun DC. Maggiori dettagli su questo si possono trovare in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/311806\/\">abbiamo chiarito il corretto completamento dei programmi che utilizzano il mediastreamer.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>In YT vengono utilizzati sia codici di Reed-Solomon (schema 6-3), che sono stati implementati per primi, sia codici di ridondanza LRC (schema 12-2-2), con LRC come modalit\u00e0 di archiviazione preferita.<\/p>\n<p><\/p>\n<p>In YDB si utilizzano codici di ridondanza basati su even-odd (schema 4-2). Gi\u00e0 si \u00e8 parlato dei codici di ridondanza in YDB <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=dCpfGJ35kK8\">nella conferenza Highload<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>L'applicazione di diversi schemi di codici di ridondanza \u00e8 determinata da varie esigenze poste ai sistemi. Ad esempio, in MDS i dati archiviati con LRC sono distribuiti in 3 DC. \u00c8 importante che i dati rimangano accessibili in lettura in caso di guasto di uno qualsiasi dei DC, quindi i blocchi devono essere distribuiti tra i DC in modo tale che, in caso di inaccessibilit\u00e0 di un DC, il numero di blocchi non disponibili non superi il limite consentito. Nello schema 8-2-2, possono essere collocati 4 blocchi in ciascun DC, quindi in caso di disconnessione di un qualsiasi DC, 4 blocchi non saranno disponibili, e i dati potranno essere letti. Qualunque schema scegliamo per la distribuzione nei 3 DC, in ogni caso deve esserci (r + l) \/ n &gt;= 0,5, ovvero la ridondanza di archiviazione sar\u00e0 almeno del 50%.<\/p>\n<p><\/p>\n<p>In YT la situazione \u00e8 diversa: ogni cluster YT \u00e8 completamente situato in 1 DC (diversi cluster in DC diversi), quindi non ci sono tali vincoli. Lo schema 12-2-2 offre una ridondanza del 33%, quindi archiviare i dati risulta pi\u00f9 economico, mentre possono anche resistere fino a 4 disconnessioni di dischi simultanee, proprio come nel caso dello schema in MDS.<\/p>\n<p><\/p>\n<p>Ci sono ancora molte peculiarit\u00e0 nell'applicazione dei codici di ridondanza nei sistemi di archiviazione e elaborazione dei dati: sfumature nel recupero dei dati, impatto del recupero sui tempi di esecuzione delle query, peculiarit\u00e0 nella registrazione dei dati, ecc. Intendo parlare separatamente di queste e di altre peculiarit\u00e0 dell'applicazione dei codici di ridondanza nella pratica, se il tema risulter\u00e0 interessante.<\/p>\n<p><\/p>\n<h1 id=\"6-ssylki\">6. Collegamenti<\/h1>\n<p><\/p>\n<ol>\n<li>Serie di articoli sui codici di Reed-Solomon e sui campi di Galois: <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 \/>\nIn essi si analizza pi\u00f9 in profondit\u00e0 la matematica con un linguaggio accessibile.<\/li>\n<li>Articolo di Microsoft sui 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 \/>\nNella sezione 2 viene brevemente spiegata la teoria, seguita da un'analisi dell'esperienza pratica dell'applicazione degli LRC.<\/li>\n<li>Schema even-odd: <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>Schema STAR: <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>Codici Pyramid: <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>Codici di ridondanza 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>Codici di ridondanza 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>Codici di ridondanza 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>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/kody-izbytochnosti-prostymi-slovami-o-tom-kak-nadyozhno-i-dyoshevo-hranit-dannye\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Codici di ridondanza: parole semplici su come archiviare dati in modo sicuro e a basso costo | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/87758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=87758"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/87758\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/87759"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=87758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=87758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=87758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}