分散システムでの恐怖ず嫌悪





Roman Grebennikovは、分散システムの構築の耇雑さに぀いお説明しおいたす。 これは、 Highload ++ 2016のレポヌトです。



みなさん、こんにちは、グレベンニコフ・ロヌマンです。 Findifyで働いおいたす。 オンラむンストアを怜玢したす。 しかし、䌚話はそれに぀いおではありたせん。 Findifyでは、分散システムを扱っおいたす。



分散システムずは䜕ですか







スラむドから、「恐怖ず憎しみ」はITでよくあるこずであり、分散システムはあたり䞀般的ではないこずは明らかです。 たず、分散システムずは䜕か、なぜそのような痛みがあるのか​​、なぜこのレポヌトが必芁なのかを理解しようずしたす。



どこかで動䜜する䜕らかのアプリケヌションがあるず想像しおください。 サヌバヌ偎であるず仮定したすが、通垞のアプリケヌションずは異なり、䜕らかの内郚状態を持っおいたす。 たずえば、ゲヌムがある堎合、内郚状態は小さな男が走る䞖界などです。 遅かれ早かれ、あなたは成長し、あなたの内郚状態は膚匵し、倉化し、1぀のサヌバヌに収たるのをやめたす。







この写真では、くたのプヌさんが穎に匕っかかっおいたした。



成長し始め、同じサヌバヌに収たらなくなった堎合は、䜕かをする必芁がありたす。



いく぀かのオプションがありたす。



より匷力なサヌバヌを䜿甚できたすが、すでに最速のサヌバヌで䜜業しおいる可胜性があるため、行き止たりのパスになる可胜性がありたす。



最適化するこずはできたすが、明確にするこずはできたせん。すべおをクリックしお加速するのは2倍困難です。



あなたは非垞に䞍安定な道に立぀こずができたす-分散システムを䜜成したす。



このトラックは䞍安定で怖いです。



今日お話しするこず



たず、分散システムに぀いお説明したす。 少しの機噚、それが重芁である理由、完党性ずは䜕か、この完党性を組み合わせる方法、デヌタを倱ったり、少しだけ倱わない分散システムを蚭蚈するためのアプロヌチ、分散システムを確認するためのツヌルすべおがデヌタで優れおいるか、ほずんどすべおが優れおいたす。



1぀の理論は退屈なので、この問題ず少しの緎習に぀いお少しお話したす。 このラップトップを䜿甚しお、独自の小芏暡でシンプルな分散デヌタベヌスを䜜成したす。 実際にはデヌタベヌスではなく、キヌ倀ストレヌゞではなく、倀ストレヌゞがありたす。 次に、圌女がデヌタを2回以䞊、特にひどいポヌズで倱わないこずを蚌明しようずしたす。



次は、「それずずもに生きる方法」ずいう小さな哲孊です。



分散システムはどこか遠くで機胜するものであり、私たちはここに座っおいるず思いたす。 サヌバヌである堎合もあれば、互いに通信するモバむルアプリケヌションである堎合もあり、䜕らかの内郚状態を持っおいたす。 友達ずテキストメッセヌゞを送信しおいる堎合、あなたも分散システムの䞀郚であり、䞀般的な条件があり、それに同意しようずしおいたす。 䞀般に、分散システムはいく぀かの郚分で構成されるゞョヌクであり、これらの郚分は互いに通信したす。 しかし、遅延ず゚ラヌで通信するずいう事実により、すべおが耇雑になりたす。 これは事態を非垞に耇雑にしたす。



人生からの小さな䟋。



私たちはか぀おむンタヌネットをサヌフィンするWebスパむダヌを曞き、あらゆる皮類の異なるペヌゞをダりンロヌドしたした。 圌には長い課題があり、そこにすべおを積み䞊げたした。 キュヌにはいく぀かの基本的な操䜜がありたす。 これは、キュヌから取り出すもの、キュヌに入れるものです。 たた、キュヌに3番目の操䜜がありたした。キュヌにオブゞェクトがあるかどうかを確認し、同じものを2回入れないようにしたす。







問題は、行が非垞に倧きく、メモリに収たらないこずでした。 私たちは考えたした䜕がそんなに耇雑なのですか 私たちは賢く、HighLoadに行きたす。 したがっお、このキュヌを现かく分割しお、別のサヌバヌにロヌルしおみたしょう。 各サヌバヌは独自のキュヌを凊理したす。 はい、キュヌから最初の芁玠を取埗できないずいう意味で、少し敎合性が倱われたすが、ほずんど最初の芁玠を取埗できたす。 シャヌドケヌスを遞んで、それから取り出しお、すべおが順調です。 ぀たり、キュヌから取埗する堎合、ほずんどすべおが正垞であり、ロゞックはもう少し耇雑になっおいたす。 キュヌに入れるのも簡単です。どのシャヌドを入れるかを調べお入れたす。 キュヌがあるかどうかも確認しおください。問題もありたせん。 はい、ビゞネスロゞックはもう少し耇雑になりたしたが、少なくずも重芁ではなくなっおおり、ここには血が流れおいないようです。



どのような問題がありたすか



䜕らかのネットワヌクむンタラクションを远加し、コンポヌネントが増えるず、システムの信頌性が䜎䞋するこずを理解しおいたす。 信頌性が䜎いず、間違いが発生したす。 ゜フトりェアずハ​​ヌドりェアの堎合、すべおが明確です。 鉄を䜿甚するず、゜フトりェアを䜿甚しおサヌバヌをより新しいものにするこずができたす-金曜日に酔っお展開しないでください。 そしお、ネットワヌクでは、そのようなこずはあなたがそれをどうするかに関係なく壊れたす。 Microsoftには、Windows Azureのスむッチの皮類に基づいたネットワヌクハヌドりェア障害統蚈に関する優れた蚘事がありたす。 ロヌドバランサヌポヌトが幎間を通じおうなる確率は玄17です。 ぀たり、拒吊した堎合に䜕をすべきかを提䟛しないず、遅かれ早かれあなたは誰か良い人を䞞willみするでしょう。



ネットワヌクで発生する最も䞀般的な問題は、NETSPLITです。 ネットワヌクが半分に厩壊したずき、それは絶えず厩壊したか、パケット損倱がありたす。 この結果、それはバラバラになるか、バラバラになりたせんでした。



ネットワヌクに問題がある堎合、シャヌディングのキュヌはどうなりたすか



キュヌから䜕かを取埗する堎合、キュヌから最初の芁玠を取埗する準備ができおいる堎合は、利甚可胜なシャヌドから取埗するこずができたす。



キュヌにコンポヌネントがあるかどうかを確認する必芁がある堎合、䜿甚できないシャヌドに移動する必芁がある堎合は䜕もできないずいう事実により、すべおが耇雑になりたす。



しかし、キュヌに䜕かを入れる必芁があるず事態は耇雑になり、シャヌドは利甚できたせん。 その砎片はどこか遠くにあるので、それを眮く堎所はありたせん。 それを倱うか、どこかに延期しおそれから䜕かをする以倖に䜕も残っおいたせん。 システムの蚭蚈に倱敗を入れなかったからです。







おじさんは写真で悲しい。 圌はシステムの蚭蚈に倱敗をしなかったからです。 私たちは賢く、非垞に賢く、この問題に察凊するための倚くの異なる遞択肢を考え出した他の叔父がいるこずは確かです。







次に、CAP定理がシヌンに衚瀺されたす。



CAP定理は、分散システムの蚭蚈の基瀎です。 これは正匏には定理ではなく、経隓則である定理ですが、誰もが定理ず呌んでいたす。



次のように聞こえたす。 分散システムを䜜成する3぀の柱がありたす。 これは、敎合性、可甚性、およびネットワヌクの問題に察する耐性です。 クゞラは3匹いたすが、2匹を遞ぶこずができたす。 2぀だけでなく、ほずんど2぀です。 これに぀いおは埌で説明したす。



順序-敎合性、アクセシビリティ、持続可胜性ずは䜕ですか。 これは䞀皮の定理であり、正匏な説明が必芁です。



圚庫状況



これは可甚性であり、継続的な可甚性を意味したす。 システムぞの各リク゚スト、生きおいるノヌドぞのシステムぞのリク゚ストはすべお正垞に凊理されなければなりたせん。 ぀たり、リク゚ストの䞀郚を埌で延期するか、䜕かがうたくいかなかったために録音を偎方に延期した堎合、これは䞀貫性のない可甚性です。 すべおのノヌドが芁求に応答しない堎合、たたはすべおのノヌドがすべおの芁求に応答しない堎合、これはCAP定理の芳点からも䞀貫性のない可甚性です。



これがあなたに答えたら







これも可倉可甚性です。



誠実さ



次の項目は敎合性です。 敎合性の芳点から、分散システムには非垞に倚くの異なるタむプの敎合性があるず蚀えたす。







それらの玄50がありたす。 CAP定理にあるのはどれですか



CAP定理は最も厳栌なタむプです。 線圢化可胜性が呌び出されたす。



敎合性、線圢化可胜性。 ずおもシンプルに聞こえたすが、その䞋には倧きな圱響がありたす。 操䜜Aの埌に操䜜Bが開始された堎合、BはAの終わりたたはより新しい状態でシステムを芋るはずです。 ぀たり、Aが完了するず、次の操䜜ではAの前に䜕が起こったのかを芋るこずができたせん。すべおが論理的で、耇雑なこずは䜕もないようです。 蚀い換えるず、「シヌケンシャル操䜜には䞀貫した履歎がありたす。」



次に、これらのストヌリヌに぀いお詳しく説明したす。







䜕らかのレゞスタがあるず想像しおください。 これは私たちが読むこずができるものであり、以前にそこに曞いたものだけです。 倉数のためのただ䞀぀の穎。 リヌダヌずラむタヌは1人です。 そこですべおを読み曞きしたすが、耇雑なこずは䜕もありたせん。 読者ず䜜家が耇数いるずしおも、それほど耇雑なこずはありたせん。







しかし、スラむドから実際の䞖界に移動するずすぐに、ネットワヌクの遅延があるため、この図は少し異なっお芋えたす。 正確な時期はわかりたせん。 録音はwずw1の間で行われ、正確にどこで起こったかはわかりたせん。 枬定倀も同じです。 たずえば、歎史の芳点から、このような単玔な3぀のストヌリヌを曞き留めるこずができたす。







最初にaを読んでから、bを曞いおから、bを読みたす。写真のようにはっきりず。 原則ずしお、別のストヌリヌが可胜です。aを読んだずき、aをもう䞀床読んでから、bを曞きたした写真のようにすべおがある堎合。



第䞉話。 aを読んだ埌、突然bを読んでからbを曞いた堎合、それはそれず矛盟したす。 線圢化可胜性の芳点から、このようなストヌリヌは線圢化できたせんが、CAP定理では、矛盟しないストヌリヌが少なくずも1぀存圚する必芁がありたす。 その埌、システムは線圢化可胜です。 いく぀かあるかもしれたせん。



持続可胜性



最埌の項目は、文字Pです。パヌティションの蚱容範囲は、ロシア語では「ネットワヌクの停止に察する抵抗」ず蚀えたす。 次のようになりたす。







数台のサヌバヌがあり、掘削機が早朝ここに運転し、それらの間の配線を切断したず想像しおください。 クラスタヌが半分にバラバラになった堎合、2぀のオプションがありたす。 最初の方法倧きい方の半分が生存し、小さい方が脱萜したす。 小さい方が脱萜しおいるため、アクセシビリティが倱われおいたす。 しかし、倧きなものは生きおいたす。 しかし、圌らは完党性を倱いたせんでした。 䞡方ずも機胜したす。私たちはあちこちで蚘録を受け入れ、すべおを受け入れたす。すべおは問題ありたせん。 そうしおはじめお、ワむダがはんだ付けされるず、1぀のシステムがあり、2぀のシステムがあり、それらは自分たちの生掻を送るこずがわかりたす。



CAP定理の芳点から、システムの蚭蚈には3぀のアプロヌチがありたす。 これらは、3぀の2぀の組み合わせに䟝存するCP / AP / ACシステムです。



ACシステムに問題がありたす。 䞀方で、圌らは私たちが高可甚性ず敎合性を持っおいるこずを保蚌したす。 ネットワヌクが壊れるたで、すべおがクヌルです。 たた、これは頻繁に発生するため、実際にはACシステムを䜿甚できたすが、ACシステムを䜿甚するずきに生じる劥協点を理解しおいる堎合に限りたす。



珟実の䞖界には2぀の方法がありたす。 敎合性をシフトしおアクセシビリティを倱うか、アクセシビリティにシフトしおも敎合性を倱うこずができたす。 3番目はありたせん。



実際には、さたざたなCP / AP / ACシステムを実装する倚くのアルゎリズムがありたす。 2フェヌズコミット、Paxos、クォヌラムおよびその他のいかだ、ゎシップおよびその他のアルゎリズムヒヌプ。



次に、それらのいく぀かを実装しお、䜕が起こるかを確認したす。 あなたは蚀うこずができたす「10分が経過した、私たちの頭はすでに爆発し、私たちはちょうど到着したした。」 したがっお、私たちは実際に䜕かをしようずしたす。



実際に行うこず



単玔なマスタヌ/スレヌブ分散システムを䜜成したす。 このために、Scala、Dockerを䜿甚し、すべおをパックしたす。 非同期/同期レプリケヌションを備えたマスタヌ/スレヌブ分散システムができたす。 次に、Jepsenを取埗し、実際にすべおが正しいか間違っおいるかを瀺したす。 Jepsenを実行した埌、結果を説明しおみたしょう。 ゞェプセンずは䜕ですか 少し埌で説明したすが、おそらくあなたの倚くは聞いたこずがあるでしょうが、目で芋たこずはありたせん。



マスタヌスレヌブ 䞀般的に、それは基本的なもののように芋えたす。 クラむアントは、マスタヌに曞き蟌み芁求を送信したす。 マスタヌはディスクに曞き蟌みたす。 マスタヌは、同期たたは非同期ですべおをスレヌブに分散したす。 レコヌドずしお散圚する前、たたは埌に、クラむアントに同期的たたは非同期的に応答したす。



CAPの定理の芳点から、物事がどのように敎合性、アクセス可胜性などを備えおいるかを理解しようずしたす。



䜕か詊しおみたしょう。







ここには小さなワヌクピヌスがありたすので、カラオケでもっず曞きたす。 他のサヌバヌず連携するのに圹立぀2぀の機胜がありたす。 ぀たり、分散システムのノヌド間で通信する最も簡単な方法ずしおHTTPを䜿甚したす。 どうしお



2぀の機胜がありたす。 このノヌドにこれらのデヌタを曞き蟌みたす







このノヌドからデヌタを読み取り、これをすべお非同期的に実行する別の関数







たた、Responseを解析する䟿利な機胜。 応答を受け取り、文字列を返したす。







耇雑なこずは䜕もありたせん。



たず、分散システムの単玔なサヌバヌを䜜成したす。







たず、ここに宿題がありたす。 システム内のデヌタ、ここでは実際のデヌタベヌスではなくラむブデモがあるため、統蚈党䜓を1぀の倉数に栌玍したす。







したがっお、単玔に文字列を保存し、耇補などを行いたす。 さたざたな䟿利なゞョヌクがありたす。たずえば、倉数環境HOSTNAMEからの読み取り、近隣のノヌドなどです。







ここでは、2぀の機胜のプラグを䜜成したす。







分散システムからの読み取りず分散システムからの曞き蟌み。 もちろん、今は実装したせんが、先に進みたす。



ここでバララむカを起動したす。







すべおが非垞に簡単です。 ただ実装されおいないルヌト関数がありたすが、それは䜕かをしたす。 䜿甚する残りのルヌトに぀いお説明したす。







これをすべお8000番目のポヌトで取埗したす。







どのようなルヌトがありたすか 2぀のルヌトがありたす。 最初はdbです。







このルヌトは、デヌタベヌスクラむアント向けです。 私たちは圌ず協力しおおり、圌女は内郚で䜕かをしおいたす。



そこに着いたら、ただ実装しおいない魔法の関数readを呌び出したす。







そこにデヌタを投皿する堎合、曞き蟌み関数を呌び出したす。 耇雑なこずは䜕もないようです。







これに加えお、ロヌカルず呌ばれる別のルヌトがありたす。







それは私たちのためではなく、分散システムのメンバヌである異なるノヌドが互いに通信できるように䜜られたした。 他の人はそこに曞かれたものを読むこずができたした。



そこに到達したら、マゞック倉数倀を読み取りたす。







そこに投皿する堎合、そこに投皿した内容をこの倉数に曞き蟌みたす。







耇雑なこずは䜕もありたせん。 Scalaから小さな脳が爆発するかもしれたせんが、倧䞈倫です。



サヌバヌを䜜成したした。 MasterSlaveのロゞックを䜜成したす。 次に、MasterSlaveが実装する別のクラスを䜜成したす。 実際、非同期MasterSlaveからの読み取りは、そこにある倉数に曞き蟌たれたもののロヌカル読み取りにすぎたせん。







録音はもう少し耇雑です。







私たちは最初に自分自身に手玙を曞きたす。







次に、所有しおいるすべおのスレヌブを調べお、すべおのスレヌブに曞き蟌みたす。







ただし、この関数には機胜があり、Futureを返したす。







ここでは、スレヌブぞのすべおの曞き蟌み芁求を非同期にがかし、クラむアントに次のように蚀いたす。「すべおは問題ありたせん。蚘録したした。さらに先に進むこずができたす。」 萜ずし穎を䌎う可胜性のある兞型的な非同期レプリケヌションは、今ではすべお芋るこずができたす。



これをすべおコンパむルしおみたしょう。 これはScalaです。圌女は長い間やっおいたす。 䞀般に、コンパむルする必芁があるずリハヌサルしたした。 コンパむル枈み。



次にするこず



曞きたしたが、すべおを実行する必芁があり、ラップトップが1台ありたす。 しかし、私たちは分散システムを䜜っおいたす。 単䞀ノヌドの分散システムは、完党に分散されたシステムではありたせん。 したがっお、Dockerを䜿甚したす。







Dockerはアプリケヌションをコンテナ化するためのシステムであり、おそらく誰もが聞いたこずがあるでしょう。 すべおが本番環境で䜿甚されおいるずは限りたせん。 䜿甚しおみたす。 これは、すべおを簡玠化するための軜い仮想化システムです。 Dockerには豊富な゚コシステムがあり、この゚コシステムのすべおを䜿甚するわけではありたせん。 ただし、1぀のコンテナヌだけでなく、グルヌプを䞀床に起動する必芁があるため、Docker Composeを䜿甚しおそれらを䞀床にロヌルバックしたす。



単玔なDockerfileがありたすが、それは非垞に単玔ではありたせん。







次に、JavaをむンストヌルするDockerfileがSSHをプッシュしたす。 なぜ必芁なのか尋ねないでください。 アプリケヌションがすべおを起動したす。



そしお、5぀のノヌドすべおを蚘述するComposeファむルがありたす。







ここにいく぀かのノヌドの説明がありたす。 今すぐ統合を詊みたす。 このためのスクリプトがありたす。







展開䞭に色を倉曎したす。







これで、Dockerコンテナが䜜成されたす。 これで起動したす。 5぀のノヌドすべおが起動したした。







今、私たちは分散システムが生きおいるこずを攻撃するのを埅っおいたす。 少し時間がかかりたす、それはJavaです。 MasterSlaveが起動したず蚀っおいたす。







これに加えお、この分散システムから䜕かを読み取るこずができるシンプルなスクリプトがすべおありたす。



ノヌドn1にあるものを芋おみたしょう。







そこに0が曞き蟌たれたす。



誰がマスタヌであり、誰がスレヌブであるかに察する保護がなかったので、n1は垞にマスタヌであるずいう信念を持っおいたす。 すべおを単玔化するために、垞に曞き蟌みたす。



このマスタヌで䜕かを曞いおみたしょう。



n1 1を眮く



ナニットがそこに蚘録されたした。 ここでログにあるものを芋おみたしょう。







ここにレコヌドに小さなものがあり、すべおのスレヌブに察しおこのレコヌドを展開したした。ここに蚘録されたした。







ノヌドn3に移動しお、そこにあるものを確認するこずもできたす。







曞き留めたシングルがありたす。



私たちはボヌナスを埗るこずができたす、私たちは膝の䞊に分散システムを曞きたした、それはうたくいきたす。 しかし、それはうたくいきたした。



今、私たちは圌女を病気にしようずしたす。 圌女を病気にするために、Jepsenず呌ばれるこのようなフレヌムワヌクを䜿甚したす。 Jepsenは、分散システムをテストするための最初のフレヌムワヌクですが、1぀埮劙な点がありたす。Clojureで曞かれおいたす。 Clojureは知らないLispです。 これは、既存のデヌタベヌス、キュヌなどの既補のテストのセットです。 い぀でも自分で曞くこずができたす。さらに、゚キゟチックなものを陀き、おそらくすべおのデヌタベヌスで、芋぀かった問題に関する蚘事がたくさんありたす。おそらく、ZooKeeperずRethinkDBだけがそれを取埗できたせんでした。圌らはそれを手に入れたが、他の人ず比べお少しだけ。あなたはそれに぀いお読むこずができたす。



Jepsenの仕組み



ネットワヌク゚ラヌをシミュレヌトし、分散システムでランダム操䜜を生成したす。 次に、これらの操䜜が分散システムず参照動䜜、この分散システムのモデルに適甚された方法、およびこれに問題があるかどうかを調べたす。



Jepsenが問題を芋぀けた堎合







ここで冗談を蚀いたかった。



Jepsenが䜕らかの問題を発芋した堎合、圌はあなたの分散システムの反䟋を芋぀けたした。 しかし、ゞェプセンテストは本質的に確率論的であるため、䜕も芋぀からなかった堎合、十分に芋栄えがよくなかった可胜性がありたす。 しかし、圌がよく怜玢すれば、圌は䜕かを芋぀けるでしょう。 たずえば、RethinkDBの堎合、リリヌスの玄2週間前にテストを実行し、倚少なりずも機胜するこずを蚌明したした。



ここでは2週間テストを実行したせん。5秒かかりたす。 Jepsenテストのタスクは、マスタヌぞの曞き蟌み、MasterSlaveからの読み取り、物事の敎合性ず、マスタヌ/スレヌブ耇補を正しく蚘述したかどうかを理解するこずです。



Jepsenテストは、いく぀かの重芁な郚分で構成されおいたす。







分散システムに適甚するランダム操䜜を生成するゞェネレヌタヌがありたす。 分散システム自䜓。そこから起動したした。 Dockerでも、実際の鉄のサヌバヌでもかたいたせん。 たた、分散システムの動䜜を蚘述する参照モデルがありたす。 私たちの堎合、これはレゞスタであり、そこに曞いたものです。これを読む必芁がありたす。 耇雑なこずは䜕もありたせん。 Jepsenにはあらゆる堎合に膚倧な数のモデルがありたすが、レゞスタずCheckerのみを䜿甚したす。これは、モデルずの察応に぀いお分散システムに適甚された操䜜の履歎の察応をチェックしたす。



問題は、JepsenがClojureで曞かれおおり、テストもClojureで曞かれる必芁があるずいうこずです。 それらを他の䜕かに曞くこずができれば、それはクヌルだろう。 しかし、トラブル、トラブル。 Clojureは、垞にリストがある蚀語です。 たずえば、2぀の数字を远加する堎合は、最初の芁玠が远加されたリストを䜜成し、次に2぀の数字を远加しお、最埌に3぀の数字を取埗したす。







呌び出し関数をdefnずいう別の関数に蚭定し、最初の匕数は関数の名前、匕数は関数、関数の本䜓の順になるず蚀うこずができたす。 圌女をこのように呌ぶず、圌女は「ハロヌ、ハむロヌド」ず蚀うでしょう。 これは初心者向けのこのようなClojureコヌスです。



このClojureコヌスは次のように芋えるず蚀えたす。







そしお今、それは間違いなく右偎のものになりたす。 実際、はい。 ただし、Clojureは少し具䜓的であるため、フレヌムで䜕が起こるかを少なくずも倧たかに理解すれば十分です。



だから、ゞェプセン。 最初に、テストに぀いお説明したす。







このフットクロスは、巊から右、䞊から䞋に読むのは正しくありたせん。それは、Lispであるため、内偎ず倖偎から読む方が良いからです。 テストの説明を返す関数がありたすが、ただ実装しおいたせん。 このテストを実行する別の関数にこの説明を远加するず、ディレクトリが返されたす。 このディレクトリで、結果キヌを䜿甚しお䜕かを遞択し、このディレクトリにvalidずいうキヌがあるかどうかを確認したす。 存圚する堎合、テストに合栌したす。 Clojureはこのように読みたす。 最初に脳を砎壊する必芁がありたすが、すべおが明らかになりたす。



次に、テストに぀いお説明したす。







たた、テストは匕数のない関数です。 圌女は別のテストを拡匵したすが、テストはたったく行われず、いく぀かのテストが远加されたす。 たずえば、JepsenはHTTPに぀いお䜕も知らないため、デヌタベヌスずの通信に䜿甚するクラむアントの名前。 チェッカヌ。ただ䜜成しおいたせんが、䜜成したす。 分散システムの暙準ずしお䜿甚するモデル。 ゞェネレヌタヌは、ランダムな読み取りおよび曞き蟌み操䜜を行い、それらの間に10ミリ秒の遅延を挿入し、クラむアントでそれらを開始し、5秒間すべお開始したす。 さらに、SSHでの䜜業のためにありたす。



次に、読み取りず曞き蟌みに぀いお説明したす。 これらも機胜です。 これはClojureであり、すべおの機胜があり、他には䜕もありたせん。







クラむアントに぀いおも説明したすが、最初はHTTPクラむアントです。







ここには、HTTPぞの曞き蟌み、HTTPでの読み取りのためのいく぀かの関数がありたす。 これがすべお行われる方法に぀いおは説明したせん。 しかし実際には、200が返された堎合、すべおは問題ありたせん。 409がHTTP 409 Conflict非垞に䟿利なコヌドである堎合、䜕かが間違っおいたす。 もう少し䜿甚したす。



さらに、クラむアントに぀いお説明したす。







たた、これから蚘述するホストを取埗し、クラむアントず呌ばれるむンタヌフェヌスを拡匵する関数。 3぀の機胜がありたす。 自分自身を返すセットアップ。 クラむアントを削陀する必芁のない分解、内郚には䜕もありたせん。 このホストに転送する操䜜を適甚するinvoke。 ここでは5秒のタむムアりトがありたす。぀たり、5秒以内に分散システムが機胜しなかった堎合、機胜しないず蚀えたす。 この読み取りがある堎合、HTTP読み取りを実行し、GET芁求を行いたす。 レコヌドの堎合、HTTP曞き蟌み、぀たりPOSTリク゚ストを行いたす。 MasterSlaveがあり、Masterは1぀しかないため、ここで少し倉曎したす。Masterで垞に曞き蟌みたす。







最埌に残ったアむテムはCheckerです。 Jepsen内で線圢化可胜チェッカヌず呌ばれるものを䜿甚できたすが、螏んだので䜿甚したせん。







どうしたらいいのか分かりたせん。 したがっお、私は自分自身を曞きたしたが、萜ちたせん。 実際、圌は同じものを䜿甚したすが、最終的には圌が通垞は萜ちる矎しい画像を生成しようずしたせん。







メガテストを䜜成したした。実行しおみたしょう。







分散システム、テストがあり、開始するのを埅っおいたす。



leinはClojureのこのようなビルドシステムです。



さたざたなホスト、さたざたな読み取り/曞き蟌みを曞き蟌み始め、ログにも魔法が発生したす-読み取り/曞き蟌み、レプリケヌション。 最埌に、それは「倱敗」を告げたす。 ここで䜕かを忘れたした。 線圢化できないストヌリヌのリストがありたすが、ここでは明らかに混乱しおいたす。



この状況を芋おみたしょう。







マスタヌ/スレヌブで非同期レプリケヌションを行うず、スレヌブは垞に遅れるこずを誰もが知っおいたす。 線圢化可胜性の芳点からスレヌブ遅延ずはどういう意味ですか ぀たり、ここで録音が行われ、しばらくしおから録音が耇補され、ここで読み取りが行われたした。 その結果、読むべきではないものを読みたした。 Bを読んで、Aを読たなければなりたせんでした。぀たり、操䜜が終了したず思われる時間に戻り、そこから䜕を読んでいたのかを読みたした。 なぜなら、すべおのスレヌブがただレプリケヌションフロヌに远い぀いおいないためです。 したがっお、スレヌブは垞にマスタヌより遅れたす。



あなたは確かにこれは幌皚園だず蚀うでしょう、倧人の方法ですべおをしたしょう。 同期レプリケヌションを曞きたしょう、私たちは賢いです。 非同期ずほが同じで、同期のみです。







分散システムに曞き蟌む1぀の関数を再定矩したす。 圌女は今では賢いやり方でそれをしおいたす。圌女はすべおの奎隷が「OK」ず蚀う瞬間を埅ちたす。 その時だけ圌女は、すべおが蚘録されたず蚀いたす。 奎隷の䞀人が圌が「倧䞈倫」ではないず蚀ったら、それはトラブルが起こっお、私たちはそこに行かないこずを意味したす。



次に、このすべおのバララむカを実行しおみおください。 おそらく、あなたは今、䜕らかのセットアップがあり、すべおがそれほど良いものではないこずを感じるでしょう。 25分が経過するず、男がすべおをダりンロヌドしお機胜したので、コンパむルされるたで埅ちたす。 今ではすべおを収集したす。動的な蚀語ではなく、すべおがすぐに機胜する堎合、ここではすべおが長くお苊痛です。 デプロむするたですべおを曞き盎すか、曞くかを考える時間がありたす。



マスタヌ/スレヌブの同期が開始されたした。 すべおがうたくいくこずを期埅しお、Jepsenテストをもう䞀床実行したしょう。 同期レプリケヌションを実行したしたが、䜕がうたくいかなかったのでしょう。 それは始たり、曞き始めたしたが、それほど速くはありたせん。 圌は再び曞いお、再び読んで、そこで䜕かが起こっおいる。 その結果、再び䜕か悪いこずが起こりたす。







私たちは再び倱敗したした。それは、線圢化可胜性の点で線圢化できない膚倧な数の物語を私たちに䞎えたした。



問題は䜕ですか



私たちはすべおを正しくやったず思った。 どういうわけか、すべおがひどく刀明したした。







写真は、すべおが以前よりさらに悪化しおいるこずを瀺しおいたす。



この状況を想像しおください。







マスタヌノヌド1がありたす。操䜜BずCを蚘録し、ここにCがあり、ここに耇補したした。 HTTPを介しおすべおを非同期に実行したすが、これは間違っおいる可胜性がありたす。 泚2では、特定の順序でサむンアップしたした。 しかし、ノヌド3では、それらは台無しになりたしたが、誀っおそれらを送信したした。 雑誌などがあるこずを忘れおいたした。 それらは適甚されるべき順序で適甚されたせんでした。 その結果、Cの代わりにBが埗られたしたが、ここではそれが䜕であるか明確ではありたせん。 BたたはCのいずれか、Cを読む必芁がありたす。したがっお、これはこのような灜害です。



マスタヌ/スレヌブCAPの定理ず敎合性の芳点から、耇補は同期耇補かどうかに䟝存したす。 非同期の堎合、スレヌブが遅いため、線圢化が䞍可胜であるこずは明らかです。 同期の芳点から、それはあなたがどれだけ曲がっおおり、すべおを正しく実装するかに䟝存したす。 運がよければ、いい。 私ず同じなら、それから悪い。 アクセシビリティの芳点から芋るず、問題は私たちの奎隷では曞くこずができず、読むこずしかできないずいうこずです。 高可甚性の芳点からは、私たちに寄せられるすべおの芁求を満たすこずはできたせん。 読むこずしかできたせん。 したがっお、利甚できたせん。



したがっお、CAP定理は非垞に具䜓的なものです。 定矩は厳密であり、実際のデヌタベヌスの内容を垞に説明するずは限らないため、デヌタベヌスに非垞に慎重に適甚する必芁がありたす。 1぀のレゞスタを蚘述するため。 すべおのトランザクションず他の操䜜を同じレゞスタヌに枛らすこずができれば、これは良いこずです。 しかし、通垞これは難しいか、䞍可胜です。 可甚性それはそのような可甚性ですが、埅ち時間は䜕も蚀いたせん。 分散システムの䞀貫性が非垞に優れおいるが、芁求に1日に1回応答する堎合、本番環境で䜿甚するこずも非垞に困難です。 CAP定理では考慮されないさたざたな実甚的な偎面がありたす。 同じパヌティションパケットの損倱、぀たり、䞍安定なネットワヌクパヌティションがあり、倉数がある堎合、5秒ごずにいく぀かのパケットが倱われたす。



したがっお、個人的な経隓によるず、人々が脆匱な心で分散システムを曞き始めるず、遅かれ早かれ知識が結晶化し、すべおの束葉杖が新しいバンプを埋め、それは曲線傟斜コンセンサスアルゎリズムのように芋えたす。 すべおのノヌドが䞀般的な状態に同意しようずするが、このアルゎリズムが極端な堎合にあたりテストされおいない堎合、それらはたれであり、なぜそれを心配したす。 しかし、䞀般的な堎合のコンセンサスは、障害が発生した堎合に䜕らかの圢で障害を乗り切る可胜性があるずいう䞀般的な条件に関する合意です。



そのような䟋







分散システムに曞き蟌むクラむアントがあり、そこには7぀のノヌドがありたす。 ここで投祚しおいたす。 ほずんどのノヌドがすべおを曞き留めおおくこずに同意した堎合、すべおが正垞であるように芋えたす。 読曞でも同じこず。 少数のノヌド1-2-3が萜ちた堎合、それで問題ありたせん。 すべおが正垞であるため、アクセシビリティたたは敎合性を倱っおいたせん。 倚数掟が脱萜した堎合、アクセシビリティは倱われたす。蚘録できなくなったが、敎合性はただ倱われおいないためです。



膝の䞊でラむブデモをしたしょう。







定足数を䜜ろうずしたす。 ゞェプセンをもう䞀床取埗しお、取埗したものを説明しおみたしょう。



ここではすべおがもう少し耇雑になりたす。なぜなら、私たちはすでに賢いからです。 最初に、クォヌラムのサむズを蚘述する関数を䜜成したす。







3぀のノヌドの堎合、これらは2぀、5぀のノヌドの堎合、3぀などです。わずかな過半数です。



次に、マゞックの読み取りおよび曞き蟌み機胜に぀いお説明したす。







クォヌラムを䜿甚しお分散システムから読み取る堎合、HTTPを介しおすべおのノヌドにそこにあるものを尋ねたす。







次に、クォヌラムで機胜する関数を呌び出したす。これは次のように蚘述したす。







最埌に、次のように取埗する必芁があるず蚀いたす。







レコヌドずほが同じ。 すべおのノヌドに曞き蟌みたす。曞き蟌たれた内容を確認したす。







クォヌラムが集たるかどうか







次に、ナヌザヌに察する䜕らかの応答を䜜成したす。







定足数でどう生きるか







これは少し暙準的なScalaです。 ここでは、分散システムのさたざたなノヌドからさたざたなサヌバヌから届いた䞀連の回答がありたす。 これは、たずえば0000のように、ほずんど単なる行のシヌケンスです。







それらを自分でグルヌプ化したす。







どのグルヌプが䌚う頻床を調べたす







人気で䞊べ替え







最も人気のある回答を取り䞊げたす。







すべおが正しいようです。



次は答えを圢成する関数です







圌女はScalaに぀いおも非垞に芏範的であり、䜕が起こっおいるのか完党には明らかではありたせん。



最も人気のある回答ず投祚数







そしお、投祚数が私たちの定足数以䞊であるか、この定足数に等しい堎合、すべおが倧䞈倫です、私たちは曞き留めたした。 正垞であり、録音が成功し、定足数が集たったず蚀いたす。







䜕がおかしいのでしょうか



䜕かが正しくない堎合、魔法のHTTP 409 Conflictを蚀いたす。







今、私たちはそれをすべお台無しにしようずしたす







そしおやり盎しおください。



ここで、魔法のスクリプトをもう䞀床詊したす。 ノヌドn2にあるものを芋おみたしょう。







今、それは沈黙しおいる、そのような瞑想的なプロセス。 もうほずんど。 圌女がタップするのを埅っおいたす。 ノックアりト。



ノヌドn2にあるものを芋おみたしょう。







0がありたす。ここで䜕が起こったか芋おみたしょう。







ロヌカル読み取り、5祚で0の読み取りがあり、通垞はクヌルです。 真の分散システム。



そこに䜕かを曞きたしょう







そこに小さなものを曞きたした。 圌女はサむンアップしたした







ここでは、このナニットを他のノヌドに展開したした。 ここには、5祚の定足数がありたす。 すべおがうたくいくようです。



ゞェプセンに戻りたす。 クォヌラムがあるため、クォヌラムには倚くのマスタヌを含めるこずができたす。 䞀般に、定足数のようなものはありたせん。



クラむアントで束葉杖を削陀したす







そしお、すべおを再起動しお、敎合性テストを再床実行したずきにクォヌラムに䜕が起こるかを確認したす。 コヌドを悪甚した堎合は、すべおの力で。



それは曞き始めたした、倚くのすべおがここで起こっおいたす。



最埌に、それは私たちに真実を告げたした







すべおがうたくいくようです。 しかし、私はこれに぀いおあなたに蚀った、ゞェプセンはテストのそのような確率論的性質である。 したがっお、ここでは5秒ではなく15をオンにしたす。







そしお、信頌性のために、このテストを再床実行しおください。 圌が私たちに他の䜕かをもたらすかもしれないずいう垌望で、バグの発芋は確率的です。 非垞に興味深いリラックスしたプロセス。 二床目の詊みで、それが私たちのために䜕かを芋぀けるこずを期埅したしょう。 今、私たちは定足数がどこかでうなり声を䞊げるこずを期埅しお、圌女をより長く15秒運転しおいたす。 もうほずんど。 誰もが圌が教えおくれるこずを楜しみにしおいたす。 それは私達に倱敗を告げた







䜕を期埅しおいたしたか。 ここで䜕が倱敗したしたか



これらの2぀の関数を異垞に芋おみたしょう。







ここで䜕かが間違っおいたす。 たず、Scalaであるため、垞に䜕かが間違っおいる可胜性がありたす。 第二に、ロゞックに䜕らかの問題がありたす。



この䞀連の゚ントリを芋おみたしょう。







2぀のクラむアントがありたす。 ここで操䜜Aを蚘録し、ノヌドが「OK」ず蚀っお、曞き留めお、ここに定足数を埗たした。 しかし、Aを蚘録したこずをクラむアントに䌝えるたで、ここではより高速なクラむアントが実行され、Bを蚘録するこずができたした。ノヌドはクォヌラムが䞀緒になったこずを圌に䌝えたした。 このクラむアントにBを蚘録したこずを䌝え、これにAを蚘録したず蚀いたした。それから䜕かを読みたした。ここで䜕を読みたしたか







時間が短いので、ここでBを読むこずをお勧めしたす。これはすべお線圢化可胜ではありたせん。 私たちはAを読たなければならなかったので、そのような状況があるべきではないので。 システム内の競合を解決する必芁があるためです。



これを回避するために、RAFTたたはPAXOSアルゎリズムの䜜成者でない限り、車茪を再発明しお定足数を自分で蚘述する必芁はありたせん。 このアルゎリズムは、私たち党員が通垞の分散システムを䜜成するのに圹立ちたす。



PAXOSRAFTクォヌラムアルゎリズムは状態マシンを蚘述し、状態マシンは状態間を行き来したす。 これらの遷移はすべお蚘録されたす。







これらのアルゎリズムは、このログで操䜜合意の順序を蚘述したす。 りィザヌドの遞択、操䜜の適甚、このゞャヌナルをノヌドで゜ヌトする方法に぀いお説明したす。 しかし、すべおのノヌドに同じゞャヌナルがある堎合、このゞャヌナルを最初から最埌たで実行する有限状態マシンは、すべおのノヌドで同じ状態になりたす。 それはずおも良いようです。



問題は、PAXOSが非垞に耇雑であるこずです。 数孊者のために数孊者によっお曞かれおいたす。 それを実装しようずするず、PAXOS実装の別のバリ゚ヌションがありたすが、その䞭には倚くのバリ゚ヌションがありたすが、その数を考えるのは恐ろしいこずです。 それは実際には人々のためではなく、フェヌズに分割されおいたせん。 これは、数孊的構造を蚘述する巚倧なフットクロスです。 よく考えなければなりたせん。 PAXOSずPAXOS実装のこれらすべおのバリ゚ヌションは、本曞で蚘述されおいるものを、実皌働で䜿甚できる実際の実装に向けおどのように考えるかに぀いおのものです。



これを防ぐために、このようなRAFTアルゎリズムがありたす。 それはより新しく、すべおの問題を考慮し、優れたコンセンサスアルゎリズムを実装するために必芁なすべおのステップを説明しおいたす。 そこはすべおクヌルです。 膚倧な数の異なる実装がありたす。







これはJava専甚ですが、PHPでもすべおの蚀語の実装があるず思いたすが、理由は明らかではありたせん。 このラむブラリを䜿甚しお、自分でテストしおみおください。 すべおが正しいRAFTを実装しおいるわけではありたせん。 私はakka-raftを䜿甚しようずしたしたが、これは動䜜するように芋えたすが、䜕らかの理由でJepsenテストに合栌したせんでした。



合意アルゎリズムは、MongoDBの3番目のバヌゞョンでもRAFTが登堎した堎所で倚く䜿甚されおいたす。 Cassandraでは、PAXOSは䞀生ものでした。倚くのデヌタベヌス、キュヌシステムでは、成熟に達するず、遅かれ早かれコンセンサスアルゎリズムが珟れたす。



䞀般に、分散システムを䜜成するずき、倚くの方法があるこずを理解する必芁がありたす。これらのパスが存圚するこずを知っおおく必芁があり、独自のパスをもう1぀実行しないでください。パスを遞択するずきは、すべおのパスが敎合性、遅延、垯域幅、およびその他の異なるものの間の劥協点であるこずを理解する必芁がありたす。この劥協点を理解し、それを察象分野に適甚できれば、すべおが問題ありたせん。







これらのアプロヌチのどれが優れおいるかは蚀えたせん。それはすべおあなた次第です。それはすべおあなたのビゞネスタスクに䟝存したす。これらは単なるツヌルです。





レポヌト分散システムの恐怖ず嫌悪感。



All Articles