SDSで冗長コヌドを䜿甚するず、Yandexはデヌタを安䟡で信頌性の高い方法で保存できたす。

Yandexは、他の倧芏暡なむンタヌネット䌁業ず同様に、倧量のデヌタを保存したす。 さたざたなサヌビス、マむニングサむトからのこのナヌザヌデヌタ、倩気を蚈算するための䞭間デヌタ、およびデヌタベヌスのバックアップコピヌ。 ストレヌゞコスト$ / GBは、システムの重芁な指暙の1぀です。 この蚘事では、ストレヌゞのコストを倧幅に削枛できる方法の1぀に぀いお説明したす。















ご存知のずおり、2015幎にはドルが倧幅に増加したした。 より正確には、2014幎の終わりに成長し始めたしたが、2015幎には既に新しい鉄を泚文したした。 Yandexはルヌブルでお金を皌いでいるので、料金ずずもに鉄のコストも増加しおいたす。 これにより、珟圚のクラスタヌにより倚くのデヌタを配眮できるようにする方法に぀いお再床考えたした。 もちろん、これは定期的に行いたすが、今回は特にモチベヌションが高くなりたした。







クラスタヌ内の各サヌバヌは、プロセッサ、RAM、ハヌドドラむブ、およびネットワヌクのリ゜ヌスを提䟛したす。 ここでのネットワヌクは、単なるネットワヌクカヌドよりも耇雑な抂念です。 これは、デヌタセンタヌ内のむンフラストラクチャ党䜓であり、異なるデヌタセンタヌずトラフィック亀換ポむント間の接続です。 クラスタヌでは、信頌性を確保するためにレプリケヌションが䜿甚され、クラスタヌの合蚈サむズは、ハヌドドラむブの合蚈容量によっおのみ決定されたした。 残りのリ゜ヌスをスペヌスの増加ず亀換する方法を芋぀ける必芁がありたした。 ずころで、投皿埌も個人的に議論したい質問がある堎合は、 䌚議に参加しおください。







RAMは亀換が困難です。 ディスクシェルフを䜿甚しおおり、ディスク容量に察するRAMの量の差は3桁を超えおいたす。 単䞀のマシン内でのアクセスを高速化するために䜿甚できたすが、これは別の蚘事の話です。







プロセッサは、明らかにアヌカむブを介しお亀換したす。 ただし、いく぀かの萜ずし穎に泚意する必芁がありたす。 たず、圧瞮率はアヌカむバず保存されたデヌタの組み合わせに倧きく䟝存したす。぀たり、デヌタの代衚的なサンプルを取埗しお、どれだけ保存するかを芋積もる必芁がありたす。 第二に、アヌカむバはほずんどどこからでもデヌタを読み取る機胜を提䟛する必芁がありたす。そうしないず、HTTPのRangeヘッダヌを忘れる必芁がありたすこれにより、倧きなファむルをダりンロヌドできなくなったあたり良くないむンタヌネットでクラむアントを怒らせたす。 第䞉に、圧瞮ず解凍の速床、および関連するCPU消費が重芁です。 デヌタを非垞に効率的に圧瞮するアヌカむバを䜿甚できたすが、クラスタヌ内のプロセッサの数では、珟圚の曞き蟌み速床を確保するには䞍十分です。 展開するず、リク゚ストの遅延が発生したす。 少し前、FacebookはZstdアヌカむバを公匏にリリヌスしたした。詊しおみるこずをお勧めしたす。 非垞に高速で、デヌタを適切に圧瞮したす。







すべおのリ゜ヌスの䞭で、ネットワヌクはそのたたであり、それによっお私たちは創造性の倧きな範囲を持っおいたす。 ネットワヌクをストレヌゞ容量に亀換する方法に぀いおは、さらに説明したす。







Yandexには、ストレヌゞシステムに関するかなり厳しい芁件がありたす。 1぀のデヌタセンタヌ党䜓が倱われた堎合でも、運甚を継続する必芁がありたす。 この条件により、適甚できるテクノロゞヌにかなり匷い制限が課せられたすが、その代わりに、デヌタセンタヌ自䜓の信頌性よりも高い信頌性が埗られたす。 ストレヌゞシステムの開発者である私たちにずっお、これは、DCが抜け萜ちたずきの冗長係数が1より倧きくなければならないこずを意味したす。







䞀般に、アクセシビリティゟヌンに぀いお話す方が正しいです。 私たちの堎合、これはデヌタセンタヌ党䜓ですが、別のマシン、ラック、ホヌル、たたは倧陞である堎合もありたす。 ぀たり、4぀のアクセシビリティゟヌンがあり、それらの間でデヌタを均等に分散しおいる堎合、冗長性の皋床は各ゟヌンで13、0。3より小さくするこずはできたせん。 したがっお、アベむラビリティゟヌンはN個あり、それらのデヌタを䜕らかの方法で分解する必芁がありたす。







レプリカ



明らかに、最も簡単な方法は完党なレプリカを䜜成するこずです。 ほずんどの堎合、2぀たたは3぀のレプリカが䜜成され、長幎にわたっおこのパタヌンに埓っお生きおきたした。 欠点は明らかです。1ギガバむトのデヌタを保存するには、2ギガバむトたたは3ギガバむトのハヌドディスク領域を䜿甚する必芁がありたす。 しかし、利点がありたす。各レプリカには本栌的なファむルが含たれおおり、読みやすく、同時に完党に1台のマシン䞊、1台のハヌドディスク䞊にありたす。 ディスクが倱われた堎合のデヌタの回埩も非垞に簡単です-ネットワヌク経由で通垞のコピヌを䜿甚したす。







ナヌザヌコンテンツ、Yandex.Musicデヌタ、さたざたなアバタヌ、およびその他の類䌌デヌタのストレヌゞに぀いおは、MDSサヌビスメディアストレヌゞを担圓しおいたす。 Elliptics、Eblob、およびHTTPプロキシに基づいおいたす。 Ellipticsはネットワヌクルヌティングを提䟛し、Eblobはデヌタをディスクに保存するために必芁です。プロキシはナヌザヌトラフィックを終了するために必芁です。 このクラスタヌはすべお、Mastermindず呌ばれるシステムによっお制埡されたす。 ストレヌゞでは、以前にEllipticsで詊した倧きなDHTリングの抂念から離れ、スペヌス党䜓を916ギガバむトの小さな砎片に分割したした。 私たちはそれらを「ドロップ」ず呌びたす英語から。カップル。 番号916は、耇数のドロップレプリカを1台のハヌドドラむブに配眮する必芁があるために遞択されたしたディスクメヌカヌは、マヌケティングを奜み、ボリュヌムを10進テラバむト単䜍で怜蚎したす。 Mastermindは、1぀のドロップのレプリカが垞に異なるDCに配眮されるこずを保蚌し、デヌタ回埩手順、最適化を開始し、䞀般にシステム管理者の䜜業を自動化したす。











䞀貫性を回埩するために、すべおのキヌを実行し、存圚しないレプリカに䞍足しおいるキヌを远加する特別な手順がありたす。 この手順はそれほど高速ではありたせんが、レプリカ間のラむブキヌの数に䞍䞀臎がある堎合にのみ開始したす。 サむドプラス-ハヌドドラむブに負荷がかかりたす。たずえデヌタが冷たくお、ナヌザヌが来なくおもです。 その結果、デヌタを回埩しようずしおいる時点ではなく、別のレプリカがすでに停止しおいるこずを発芋したため、ディスクは事前に停止し始めたす。 穏やかに倉曎したす。その埌、回埩が自動的に開始され、ナヌザヌデヌタは安党で健党なたたです。







冗長コヌド



類掚するず、同様のデヌタ耇補方法はRAID 1であり、シンプルで信頌性が高く、スペヌス消費の面であたり効率的ではありたせん。 しかし、RAID 5たたはRAID 6に䌌たものを䜜成する必芁がありたす。繰り返したすが、単玔なものから耇雑なものぞず進みたす。3぀のアクセスゟヌンを取埗したす。 3番目は、ブロック間のバむトXORの結果です。 ゚ラヌを怜出するために、各ブロックに぀いお、ブロックサむズず比范しお無芖できるチェックサムを考慮したす。 デヌタ回埩は基本です。a^ b = cの堎合、b = a ^ cです。 このアプロヌチでの冗長率は1.5です。 ブロックが倱われた堎合は、さらに別のアクセシビリティゟヌンから他の2぀を読み取る必芁がありたす。 1぀のディスクを倱うこずなく回埩できたす。これは、3぀のレプリカの堎合よりもはるかに悪く、2぀のレプリカず同等です。 これは、文字列「Hello、habrahabr」のXOR結果の蚈算方法です以䞋の数字は、バむトの10進衚珟です。











ここでストラむプの抂念を玹介する䟡倀がありたす。 ストリップはN個の連続したブロックであり、最初のストリップの先頭はデヌタストリヌムの先頭ず䞀臎したす。Nは遞択したコヌディングスキヌムに䟝存し、RAID 1の堎合はN = 2です。 冗長コヌドを効果的に䜿甚するには、すべおのファむルを1぀の連続したバむトストリヌムに結合し、すでにストリップに分割する必芁がありたす。 次に、各ファむルが開始するスタむルずサむズ、およびそのサむズでマヌクアップを保存する必芁がありたす。 デヌタストリヌムの長さがストラむプのサむズの倍数でない堎合、残りの郚分はれロで埋める必芁がありたす。 抂略的には、これは次のように衚すこずができたす。











ストラむプサむズを遞択するずきは、次の考慮事項を䜿甚できたす。









したがっお、これらのむベントの確率を考慮する必芁がありたす。 最適なサむズは、ファむルサむズの䞭倮倀2倍であるこずが刀明したした。 さらに、ファむルの配眮を倉曎しお、ブロックの境界が1぀のブロックに収たらない倧きなファむルに収たるようにするこずをお勧めしたす。 これにより、ネットワヌクの負荷も軜枛されたす。 たた、コヌドを簡玠化するために、パリティブロックストレヌゞ機胜がアクセシビリティゟヌンの1぀に割り圓おられおいたす。







リヌド゜ロモンコヌド



しかし、より高い信頌性が必芁な堎合はどうでしょうか そうです-より匷力な冗長コヌドを䜿甚しおください。 珟圚、最も䞀般的なコヌドの1぀はリヌド゜ロモンコヌドです。 DVDの曞き蟌み、デゞタルTVDVB-T、QRコヌド、およびRAID 6で䜿甚されたす。ここでは、ガロア䜓の数孊に぀いおは説明したせん。゚ンゞニアリングアプロヌチを埅っおいるだけです。 すべおの蚈算に、jerasureラむブラリを䜿甚したす。これは困難な運呜を持っおいたすが、非垞に迅速に機胜し、必芁なすべおの機胜を備えおいたす。







泚目に倀する最初のこず効果的な結果を埗るには、フィヌルド2 ^ 8、2 ^ 16、2 ^ 32、぀たり機械語で䜜業する必芁がありたす。 さらに簡単にするために、2 ^ 8フィヌルドを䜿甚しおバむトを操䜜したす。 この䟋をより具䜓的にするために、2぀のパリティブロックを䜿甚しお、1.5の耇補係数を達成しおみたしょう。 これを行うには、デヌタをそれぞれ4ブロックのストリップに分割し、2぀のパリティブロックを生成する必芁がありたす。 各デヌタブロックから最初のバむトを取埗する堎合、次元4のベクトルず同様に、パリティブロックの次元2のベクトルを構成できたす。 次元4のベクトルから次元2のベクトルを取埗するには、2x4コヌディングマトリックスを乗算する必芁があり、゚ンゞニアリングの芳点から芋るず、ガロア䜓での䜜業の芏則に埓っお乗算する必芁がありたす。 必芁なマトリックスは、Vandermondeマトリックスず呌ばれたす。 遞択されたフィヌルドの堎合、このような行列は、通垞の代数に線圢結合がないこずに䌌た特性を保蚌したす。 デヌタを埩元する際にも、重芁な圹割を果たしたす。







「Hello、habrahabr」ずいう1぀のデヌタストラむプを取埗したしょう。 これは、それぞれ4バむトの4぀のブロックに非垞にうたく分割され、1぀のバむトが1぀の゚ンコヌドワヌドに察応したす。











したがっお、次の図が取埗されたす。











パリティブロックは、単語ごずにこの堎合はバむトごずに同様の方法で蚈算したす。







画像をわずかに倉曎し、゚ンコヌド行列の䞊に単䜍行列を远加するず、初期デヌタが出力ベクトルに衚瀺されたす。











ブロック番号2ずブロック番号4を倱ったずしたす。察応する行を行列ず右ベクトルから消したす











次に、結果の正方行列を反転し、等匏の䞡偎に乗算したす。













゜ヌスデヌタを取埗するには、゚ンコヌドの堎合ず同じ乗算操䜜を実行するだけでよいこずがわかりたす。 1぀のブロックのみが倱われた堎合、コヌディングマトリックスから正方圢にするために、パリティブロックに察応する行の1぀を削陀する必芁がありたす。 最初の行は単䜍で構成され、特別な魔法を持っおいるこずに泚意しおください。蚈算はすべおの芁玠間のXORの蚈算ず同等であり、他の行を数えるよりも数倍高速です。 したがっお、この行をスロヌする䟡倀はありたせん。







ロヌカル埩旧コヌド



それは非垞にシンプルで、はっきりしおいるず思いたす。 しかし、他に改善できるこずはありたすか はい、Microsoft Azureの同僚は圌らの出版物で私たちに語っおいたす。 このメ゜ッドは、ロヌカル再構築コヌドLRCず呌ばれたす。 すべおのデヌタブロックを耇数のグルヌプたずえば、2぀のグルヌプに分割する堎合、グルヌプ内で゚ラヌ修正をロヌカラむズするようにパリティブロックを゚ンコヌドできたす。 以前のレプリケヌション係数1.5の堎合、スキヌムは次のようになりたす。ストラむプを4ブロックの2぀のグルヌプに分割したす。各グルヌプには、独自のロヌカルパリティブロックず2぀のグロヌバルパリティブロックがありたす。 このスキヌムにより、3぀の゚ラヌ、および4぀の゚ラヌがある状況の玄96を修正できたす。 残りの4には、4぀のデヌタブロックずロヌカルパリティブロックを含む4぀の゚ラヌすべおが1぀のグルヌプに該圓する堎合が含たれたす。











もう䞀床「単玔から耇雑ぞ」のアプロヌチを適甚しお、゚ンコヌドマトリックス内の単䜍の行を次のように2぀に分割したした。





1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1
1 55 39 73 84 181 225 217
1 172 70 235 143 34 200 101
残念ながら、今回のアプロヌチは倱敗したした。 最初はすべお問題ありたせんでしたが、理論的に回埩可胜な゚ラヌのすべおのバリアントを組み合わせお゜ヌトするテストを䜜成したずき、マトリックスではそれらの䞀郚を回埩できないこずがわかりたした。 出版物の研究に飛び蟌む必芁がありたした。 答えは、セクション2.2.1のMicrosoftの同じ出版物で芋぀かりたした。 マトリックスはもう少し巧劙に構成する必芁がありたす-幞いなこずに、消去によっおこれを簡単に行うこずができたす。







for row in range(4): for column in range(8): k = 8 index = row * k + column is_first_half = column < k / 2 if row == 0: matrix[index] = 1 if is_first_half else 0 elif row == 1: matrix[index] = 0 if is_first_half else 1 elif row == 2: shift = 1 if is_first_half else 2 ** (k / 2) relative_column = column if is_first_half else (column - k / 2) matrix[index] = shift * (1 + relative_column) else: prev = array[index - k] matrix[index] = libjerasure.galois_single_multiply(prev, prev, 8)
      
      





このようなマトリックスを䜿甚するず、テストは正垞に合栌したす。





1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1
1 2 3 4 16 32 48 64
1 4 5 16 29日 116 105 205
そのため、グルヌプを圢成したした。 ただし、アベむラビリティゟヌン党䜓が䜎䞋した堎合でも、システムが動䜜し続ける必芁があるこずを忘れおはなりたせん。 LRCを䜿甚するず、次のようにゟヌンにブロックを配眮するこずでこれを実珟できたす。











ここで、どの行を消しおも、各ロヌカリティグルヌプには3぀以䞋の゚ラヌしか存圚しないこずがわかりたす。これは、デヌタを読み取るこずができるこずを意味したす。 1぀のブロックが存圚する1぀のドラむブのみが故障した堎合、他のアベむラビリティゟヌンから远加ブロックを1぀だけ芁求するこずにより、デヌタを読み取るこずができたす。 ブロックサむズに関する考慮事項は、XORを䜿甚したスキヌムずほが同じです。ただし、1぀の䟋倖がありたす。読み取りがアクセスゟヌン間でのみ高すぎるず仮定した堎合、ブロックサむズは4分の1になりたす。 1぀のゟヌン内。







緎習する



これで、冗長コヌドの蚈算のプログラミングは非垞に簡単なタスクであり、この知識をプロゞェクトに適甚できるこずがわかりたした。 この蚘事で怜蚎したオプション









MDSでは、LRC-8-2-2スキヌム8デヌタブロック、2ロヌカルパリティブロック、2グロヌバルパリティブロックを適甚したした。 その結果、2぀のレプリカがあり、2぀のハヌドディスクに存圚する1぀のドロップが、12台のハヌドディスクに配眮され始めたした。 これにより読み取り手順が非垞に耇雑になり、ハヌドドラむブを倱った埌の回埩も困難になりたした。 しかし、25のディスクスペヌスの節玄が埗られ、すべおの短所を䞊回りたした。 ネットワヌクの負荷を軜枛するために、レプリカを䜿甚しお通垞のドロップでデヌタが蚘録されたす。 それらが完党に䞀杯になり、読み取り倀が小さくなるずき、぀たりデヌタが「クヌルダりン」するずきにのみ倉換したす。







10月15日にモスクワのオフィスで開催されたむベントで、このスキヌムの実斜䞭に発生した問題に぀いお説明したす。 さあ、それは面癜いでしょう








All Articles