Кіріспе
Жоғалған деректерді қалпына келтіруге мүмкіндік беретін код қосылды. Кодтау теориясында өшіру коды – бұл біттік өшірулер (биттік қателер емес) болжамымен жұмыс істейтін алдынғы қателерді түзету (FEC) коды. Ол k символы бар хабарламаны n символы бар ұзын хабарламаға (кодты сөзге) түрлендіреді, соның арқасында бастапқы хабарлама n символының бір бөлігінен қалпына келтіріледі. r = k/n бөлшегі кодтық жылдамдық деп аталады. Ал k’/k бөлшегі, мұндағы k’ – қалпына келтіру үшін қажетті символдар санын көрсетеді, қабылдау тиімділігі деп аталады. Қалпына келтіру алгоритмі n символдың қайсысы жоғалғанын білуді күтеді, бұл алдынғы қателерді түзету кодтарынан өзгеше.
In coding theory, an erasure code is a forward error correction (FEC) code under the assumption of bit erasures (rather than bit errors), which transforms a message of k symbols into a longer message (code word) with n symbols such that the original message can be recovered from a subset of the n symbols. The fraction r = k/n is called the code rate. The fraction k’/k, where k’ denotes the number of symbols required for recovery, is called reception efficiency. The recovery algorithm expects that it is known which of the n symbols are lost — unlike forward error correction codes.
Жоюдың оңтайлы кодтары
Оптималды өшіру кодтарындағы кез келген n код сөзінің k символы бастапқы хабарламаны қалпына келтіру үшін жеткілікті (яғни, олардың қабылдау тиімділігі жоғары). Оптималды өшіру кодтары – максималды арақашықтықпен бөлінетін кодтар (MDS кодтары).
Жалпы жағдай
Жоғарыдағы сызықтық құрылым полиномиалдық интерполяцияға жалпылана алады. Сонымен қатар, нүктелер енді шекті өріс бойынша есептеледі. Бірінші кезекте, біз кем дегенде n реті бар, бірақ әдетте 2-нің дәрежесіндегі шекті өріс F-ті таңдаймыз. Жіберуші деректерді 0-ден k-1-ге дейін нөмірлеп, оларды жібереді. Одан кейін ол (Лагранж) p(x) полиномын k дәрежелі етіп құрастырады, мұнда p(i) i-ші деректер символына тең болады. Содан кейін ол p(k), ..., p(n-1) жібереді. Алушы енді жоғалған пакеттерді қалпына келтіру үшін полиномиалдық интерполяцияны қолдана алады, егер ол k символдарды сәтті қабылдаса. Егер F өрісінің реті 2b-ден кем болса, мұнда b – символдың биттерінің саны, онда бірнеше полиномиалдар қолданылуы мүмкін. Жіберуші k-дан n-1-ге дейінгі символдарды "ұшқында" құра алады, яғни символдарды беру арасында жұмыс жүктемесін тең бөледі. Егер алушы өзінің есептеулерін "ұшқында" жасағысы келсе, ол жаңа q полиномын құра алады, яғни егер i < k символы сәтті қабылданса, q(i) = p(i) және егер i < k символы қабылданбаса, q(i) = 0. Енді r(i) = p(i) – q(i) деп белгілейік. Біріншіден, егер i < k символы сәтті қабылданса, r(i) = 0 екенін білеміз. Екіншіден, егер i ≥ k символы сәтті қабылданса, онда r(i) = p(i) – q(i) есептелуі мүмкін. Осылайша, r құрастыру үшін жеткілікті деректерге ие болып, жоғалған пакеттерді табу үшін оны бағалауға болады. Демек, жіберуші де, алушы да "ұшқында" жұмыс істеу үшін O(n(n-k)) операциялар және O(n-k) көлеміндегі жад қажет етеді.
Нақты әлемдегі іске асыру
Бұл процесс Рид-Соломон кодтары арқылы іске асырылады, кодтық сөздер Вандермонд матрицасын қолдана отырып, шекті өріс бойынша құрылады. Көптеген практикалық өшіру кодтары жүйелі кодтар болып табылады, мұнда бастапқы k символдардың әрқайсысы n хабарлама символдарының бірі ретінде өңделмеген күйде көшірілген түрде табылады. Атап айтқанда, Reed Solomon өшіру кодтамасының әртүрлі нұсқалары Apache Hadoop, Linux құрамындағы RAID 6, Microsoft Azure, Facebook салқын сақтағышы және Backblaze Vaults жүйелерінде қолданылады. Сақтау жүйелеріндегі қателерден қалпына келтірудің дәстүрлі тәсілі репликацияны пайдалану болды. Дегенмен, репликация пайдасыз байттар тұрғысынан маңызды шығындарға әкеледі. Сондықтан, деректер орталықтарында қолданылатын үлкен сақтау жүйелері өшіру кодталған сақтауды көбірек пайдаланады. Сақтау жүйелерінде қолданылатын өшіру кодтамасының ең көп таралған түрі – Рид Соломон (RS) коды, бұл белгілі деректердің бөліктерінен жоғалған деректерді қалпына келтіруге мүмкіндік беретін, паритеттік блоктар деп аталатын математикалық формула. (k, m) RS кодында «блоктар» деп аталатын k дерек блогының берілген жиынтығы (k + m) блокқа кодталады. Блоктардың толық жиынтығы – жолақ. Кодтау сондай етіп жасалады, (k + m) блоктың кем дегенде k-сы қол жетімді болса, барлық деректерді қалпына келтіруге болады. Бұл (k, m) RS кодталған сақтау m-ға дейін қателерге төзімді дегенді білдіреді. Мысал: Facebook-тың HDFS үшін қолданатын RS (10, 4) кодында 10 МБ пайдаланушы дерегі он 1 МБ блокқа бөлінеді. Содан кейін, артық жүктеме үшін төрт қосымша 1 МБ паритеттік блок құрылады. Бұл 4 бір мезгілдегі қателерге төзімді. Мұндағы сақтау шығыны 14/10 = 1.4X құрайды. Толық репликацияланған жүйеде 10 МБ пайдаланушы дерегі 4 бір мезгілдегі қателерге төзу үшін 4 рет репликациялануы керек. Бұл жағдайда сақтау шығыны 50/10 = 5 есе болады. Бұл өшіру кодталған сақтаудың толық репликацияға қарағанда төмен сақтау шығыны туралы түсінік береді, сондықтан қазіргі сақтау жүйелерінде бұл тартымды. Бастапқыда өшіру кодтары «салқын» (сирек қолданылатын) деректерді тиімді сақтау құнын төмендету үшін қолданылды; бірақ өшіру кодтарын «қызыл» (жиі қолданылатын) деректерді қызмет көрсету өнімділігін жақсарту үшін де пайдалануға болады.