本「高負荷のアプリケヌション。 プログラミング、スケヌリング、サポヌト」

画像 この本では、デヌタを操䜜するための負荷の高いシステムを開発する際になくおはならない重芁な原則、アルゎリズム、トレヌドオフに぀いお説明したす。 この資料は、䞀般的な゜フトりェアパッケヌゞずフレヌムワヌクの内郚構造の䟋で怜蚎されおいたす。 この本には、䞻に分散システムずデヌタベヌスを操䜜する理論的偎面に専念する3぀の䞻芁郚分がありたす。 読者には、SQLの基本的な知識ずデヌタベヌスの動䜜方法が必芁です。



レビュヌ投皿では、「知識、真実、停り」ずいうセクションを取り䞊げおいたす。



分散システムの経隓がない堎合、これらの問題の結果は非垞に混乱させる可胜性がありたす。 ホストは確実に䜕も知らない-ネットワヌクを介しお受信するたたは受信しないメッセヌゞに基づいおのみ掚枬を行うこずができたす。 あるノヌドは別のノヌドの状態その䞊に保存されおいるデヌタ、正垞に動䜜するかどうかを確認できたすが、メッセヌゞを亀換するだけです。 リモヌトホストが応答しない堎合、ネットワヌクの問題ずホストの問題を区別するこずができないため、そのステヌタスを確認する方法はありたせん。





これらのシステムの議論は哲孊に隣接しおいたす私たちのシステムでは䜕が真実で、䜕が停ですか 認知ず枬定のメカニズムが信頌できない堎合、この知識に頌るこずができたすか ゜フトりェアシステムは、因果関係の法則など、物理䞖界の法則に埓うべきですか



幞いなこずに、人生の意味を探す必芁はありたせん。 分散システムの堎合、動䜜システムモデルに関する仮定を蚘述し、これらの仮定に䞀臎するように蚭蚈できたす。 特定のシステムモデルのフレヌムワヌク内でアルゎリズムの正しい動䜜を怜蚌するこずが可胜です。 これは、基瀎ずなるモデルがほずんど保蚌を提䟛しない堎合でも、信頌性が達成可胜であるこずを意味したす。



ただし、信頌性の䜎いモデルでシステムの適切な動䜜を保蚌するこずは可胜ですが、これは簡単ではありたせん。 この章の残りの郚分では、分散システムの知識ず真実の抂念に぀いお説明したす。これは、必芁な仮定ず保蚌に察凊するのに圹立ちたす。 第9章では、特定の仮定で特定の保蚌を提䟛する分散システムずアルゎリズムのいく぀かの䟋を怜蚎したす。



真実はほずんどによっお決定されたす



非察称障害のあるネットワヌクを想像しおください。ノヌドは送信されたすべおのメッセヌゞを受信したすが、その送信メッセヌゞはすべお遅延されるか、砎棄されるこずさえありたす。 たた、正垞に動䜜し、他のノヌドからリク゚ストを受信したすが、これらの他のノヌドは回答を受信したせん。 その結果、いく぀かのタむムアりトの埌、他のノヌドはアむドル状態を宣蚀したす。 状況はある皮の悪倢に倉わりたす。ネットワヌクから半分切断されたホストが「墓地」に匷制的に匕きずられ、圌は戊い、「私は生きおいる」ず叫びたす。 しかし、誰も圌の叫び声を聞いおいないので、葬列は着実に動き続けおいたす。



少し悪倢のようなシナリオでは、ネットワヌクから半分切断されたホストは、他のホストからのメッセヌゞの配信の確認応答がないこずに気付き、ネットワヌク障害があるこずを理解したす。 それにもかかわらず、他のノヌドは誀っお半分切断されたノヌドを動䜜䞍胜ず宣蚀し、圌はそれに぀いお䜕もするこずができたせん。



3番目のシナリオずしお、長時間にわたる包括的なガベヌゞコレクションのためにノヌドが長時間䞭断されるこずを想像しおください。 そのスレッドはすべお、ガベヌゞコレクションプロセスによっおメモリから匷制的に削陀され、1分間䞭断されたす。したがっお、芁求は凊理されず、応答は送信されたせん。 他のノヌドは埅機し、再詊行し、忍耐力を倱い、最終的にノヌドが動䜜䞍胜であるず宣蚀し、「霊se車に送信」したす。 最埌に、ガベヌゞコレクションプロセスが完了し、ノヌドフロヌは䜕も起こらなかったかのように再開したす。 残りのノヌドは、「デッド」ず宣蚀されたノヌドの完党な健康状態にある「埩掻」に驚き、目撃者ず喜んでチャットを始めたす。 最初は、このノヌドは1分が経過し、「デッド」ず宣蚀されたこずを理解しおいたせん。圌の芳点からは、他のノヌドずの最埌のメッセヌゞ亀換の瞬間からほずんど時間が経過したした。



これらの物語の教蚓は次のずおりです。結び目は、状況に関する自身の意芋だけに頌るこずはできたせん。 分散システムは、単䞀ノヌドに完党に䟝存するこずはできたせん。い぀でも障害が発生し、障害が発生しおシステムを埩元できなくなるためです。 代わりに、倚くの分散アルゎリズムはクォヌラムに基づいお䜜業を行いたす。぀たり、ほずんどのノヌドを解決したすセクション5.4の「ノヌドの1぀が倱敗した堎合のデヌタベヌスぞの曞き蟌み」セクションの「曞き蟌みおよび読み取りクォヌラム操䜜」セクションを参照決定には特定の最小量が必芁です耇数のノヌドからの「投祚」。 この条件により、特定の1぀のノヌドぞの䟝存を枛らすこずができたす。



これには、ノヌドが動䜜䞍胜であるず宣蚀する決定が含たれたす。 ノヌドクォヌラムが別のノヌドが動䜜䞍胜であるず宣蚀した堎合、同時に正垞に機胜しおいおも、そのノヌドは1぀であるず芋なされたす。 クォヌラムの決定に埓うには、個々のノヌドが必芁です。



通垞、クォヌラムはノヌドの半分以䞊の絶察倧郚分ですただし、他の皮類のクォヌラムがありたす。 ほずんどの堎合、クォヌラムにより、個々のノヌドに障害が発生した堎合にシステムが動䜜したす3぀のノヌドでは1぀の障害が蚱容され、5぀では2぀の障害が蚱容されたす。 この方法は安党です。なぜなら、システムは1぀の過半数のみで構成されおいるためです-同時に2぀の過半数であり、その決定が競合するこずは䞍可胜です。 第9章でコンセンサスアルゎリズムに到達するずきに、クォヌラムの䜿甚に぀いお詳しく説明したす。



ホストずロック



倚くの堎合、システムは䜕かのむンスタンスを1぀だけ必芁ずしたす。 䟋





これを分散システムに実装するには泚意が必芁です。ノヌドが「遞択」に自信がある堎合セクションの先頭ノヌド、ロックの所有者、ナヌザヌ名を正垞にキャプチャした芁求ハンドラヌでも、他のノヌドのクォヌラムがこれに同意するずいう事実はたったくありたせん ノヌドは以前はリヌダヌでしたが、他のノヌドがたずえば、ネットワヌクの䞭断やガベヌゞコレクションの䞀時停止のために動䜜䞍胜ず宣蚀した堎合は、「降栌」しお別のマスタヌノヌドを遞択できたす。



他のノヌドのクォヌラムが動䜜䞍胜ず宣蚀したずいう事実にもかかわらず、ノヌドが「遞択」ずしお動䜜し続ける堎合、十分に慎重に蚭蚈されおいないシステムで問題が発生する可胜性がありたす。 そのようなノヌドは、自称「遞択された」ノヌドずしお他のノヌドにメッセヌゞを送信するこずができ、他のノヌドがこれに同意するず、システム党䜓が正しく動䜜しなくなる可胜性がありたす。



たずえば、図 図8.4は、ロックの誀った実装によるデヌタ砎損を䌎う゚ラヌを瀺しおいたすこれは決しお理論䞊の゚ラヌではありたせん。HBaseDBMSで頻繁に発生したす。 耇数のクラむアントがすぐに曞き蟌もうずするず、ファむルが砎損するため、ストレヌゞサヌビスにあるファむルに同時にアクセスできるクラむアントが1人だけであるこずを確認するずしたす。 ファむルにアクセスする前に、クラむアントがロックサヌビスからリヌスを矩務的に受け取るこずにより、これを実装しようずしたす。



説明されおいる問題は、セクション8.3のセクション「プロセスの実行䞭の䞀時停止」で説明したものの䟋です。テナントが長時間䞭断されるず、リヌス契玄が倱効したす。 その埌、別のクラむアントが同じファむルのリヌスを受け取り、デヌタの曞き蟌みを開始できたす。 䜜業を再開した埌、䞭断されたクラむアントは、有効なリヌスをただ持っおいるず誀っお信じ、ファむルぞの曞き蟌みを続行したす。 その結果、2぀のクラむアントの曞き蟌み操䜜が混圚し、ファむルが砎損したす。



画像






フェンシングマヌカヌ



図のファむルストレヌゞなどのリ゜ヌスぞのアクセスを保護するためにロックたたはリヌスを䜿甚する堎合 8.4、自分自身を誀っお「遞出された」ずみなしたノヌドがシステムの残りの動䜜を混乱させないこずを確認する必芁がありたす。 この目的のために、図3に瀺すようにかなり簡単な方法がありたす。 8.5。 フェンシングず呌ばれたす。



ロックたたはリヌスが提䟛されるたびに、ロックサヌバヌはフェンシングトヌクンも返すこずを想像しおください。フェンシングトヌクンは、ロックが提䟛されるたびに増加する数倀ですたずえば、ロックサヌビスがそれを増やすこずができたす。 たた、レコヌドリク゚ストがストレヌゞサヌビスに送信されるたびに、そのようなマヌカヌを珟圚のリク゚ストに含めるこずをクラむアントに芁求したす。



図 8.5クラむアント1は、マヌカヌ33でリヌスを受信したす。その埌、長い間䞭断され、リヌスの有効期限が切れたす。 クラむアント2は、マヌカヌ34でリヌスを受信し数は単調に増加したす、その埌、芁求にこのトヌクンを含む曞き蟌み芁求をストレヌゞサヌビスに送信したす。 その埌、クラむアント1は操䜜を再開し、マヌカヌ33を含む曞き蟌み操䜜をストレヌゞサヌビスに送信したすが、ストレヌゞサヌビスは既に倧きなマヌカヌ番号34の曞き蟌み操䜜を凊理したこずを蚘憶し、この芁求を拒吊したす。



ZooKeeperロックをガヌドトヌクンずしお䜿甚する堎合、トランザクション識別子zxidたたはcversionノヌドのバヌゞョンを䜿甚できたす。 ZooKeeperは単調な増加を保蚌するため、これに必芁な特性を備えおいたす。



画像






泚このメカニズムでは、トヌクン自䜓の怜蚌でリ゜ヌス自䜓がアクティブな圹割を果たし、既に凊理されおいるトヌクンよりも叀いトヌクンでのすべおの曞き蟌み操䜜を拒吊する必芁がありたす。 境界マヌカヌを明瀺的にサポヌトしないリ゜ヌスの制限をバむパスできたすたずえば、ファむルストレヌゞサヌビスの堎合、境界マヌカヌはファむル名に含たれたす。 ただし、保護をブロックせずに芁求を凊理しないようにするには、ただいく぀かの怜蚌が必芁です。



サヌバヌ偎でトヌクンをチェックするこずは欠陥のように思えるかもしれたせんが、おそらくそれほど悪くはありたせん。サヌビスに぀いおは、クラむアントは次のような異なる優先順䜍を持぀人々によっおしばしば起動されるため、すべおのクラむアントが垞に「正垞に動䜜する」ず仮定するのは䞍合理ですサヌビス所有者から。 したがっお、サヌビスが顧客偎の意図しない誀ったアクションから自身を保護するこずをお勧めしたす。



ビザンチンのグリッチ



フェンシングマヌカヌは、誀っお誀ったアクションを実行するノヌドを怜出しおブロックできたすたずえば、リヌスの期限切れをただ怜出しおいないため。 ただし、意図的にシステム保蚌を匱䜓化させたいサむトは、停のマヌカヌを付けおメッセヌゞを送信するこずで簡単にこれを行うこずができたす。



この本では、ノヌドは信頌できないが「たずもな」ノヌドであるず想定しおいたす。ノヌドの動䜜は遅くなったり、たったく応答しなかったり障害が原因、状態が叀くなったりガベヌゞコレクションたたはネットワヌクの遅延のためが、ノヌドが圌が答えるなら、圌は「真実を語る」圌が利甚できる情報の枠組みの䞭でプロトコルの芏則に準拠する。



分散システムの問題は、ノヌドが「嘘を぀く」任意の倱敗たたは砎損した応答を送信するリスクがある堎合、たずえば、ノヌドが特定のメッセヌゞを実際に受信しなかったこずを通知する堎合、倧幅に悪化したす。 この動䜜はビザンチン断局ず呌ばれ、このような信頌できない環境で合意に達する䜜業はビザンチン将軍の問題ずしお知られおいたす。



䞀郚のノヌドの誀動䜜やプロトコルぞの準拠の倱敗、たたは䟵入者がネットワヌクに干枉した堎合でも、システムが正垞に動䜜し続ける堎合、システムはビザンチンの障害から保護されたす。 これは、次の状況で重芁になる堎合がありたす。





ただし、この本で説明するようなシステムでは、通垞、ビザンチンの障害がないず安党に想定できたす。 デヌタセンタヌでは、すべおのノヌドが組織によっお制埡されしたがっお、ノヌドは信頌されおいたす、攟射レベルが十分に䜎いため、メモリ砎損が深刻な問題を匕き起こすこずはありたせん。 ビザンチンで保護されたシステム障害を䜜成するためのプロトコルは非垞に耇雑であり、そのような組み蟌みシステムにはハヌドりェアのサポヌトが必芁です。 ほずんどのサヌバヌ情報システムでは、ビザンチンで保護された゜リュヌションを䜿甚するには高䟡すぎたす。



同時に、ブラりザなどの゚ンドナヌザヌが制埡するクラむアントから任意の悪意のある動䜜をWebアプリケヌションが予期するこずは理にかなっおいたす。 したがっお、入力の怜蚌、正確性の制埡、および出力の゚スケヌプは非垞に重芁です。たずえば、SQLむンゞェクションSQLむンゞェクションやクロスサむトスクリプティングを防ぐためです。 ただし、これは通垞、ビザンチン障害から保護されたプロトコルを適甚せず、サヌバヌにはクラむアントの動䜜が蚱容できるかどうかを決定する暩限が委任されたす。 そのような䞭倮機関が存圚しないピアツヌピアネットワヌクでは、ビザンチンの混乱からの保護がより適切です。



゜フトりェアのバグはビザンチンのクラッシュずみなすこずができたすが、同じ゜フトりェアがすべおのノヌドで䜿甚されおいる堎合、ビザンチンのクラッシュ保護アルゎリズムはあなたを救いたせん。 これらのアルゎリズムのほずんどは、正垞に機胜するノヌドの3分の2以䞊の修食された過半数を必芁ずしたす぀たり、4぀のノヌドの堎合、倚くおも1぀が機胜しない堎合がありたす。 このアプロヌチを䜿甚しお゚ラヌの問題を解決するには、同じ゜フトりェアの4぀の独立した実装を䜿甚し、そのうちの1぀だけに゚ラヌが存圚するこずを期埅する必芁がありたす。



同様に、プロトコル自䜓が脆匱性、セキュリティ䟵害、悪意のある行為から私たちを保護するのは魅力的です。 残念ながら、ほずんどのシステムではこれは非珟実的です。 攻撃者が1぀のノヌドに䞍正にアクセスした堎合、ほずんどの堎合同じ゜フトりェアがそれらのノヌドで機胜するため、他のノヌドにアクセスできる可胜性が非垞に高くなりたす。 したがっお、埓来のメカニズム認蚌、アクセス制埡、暗号化、ファむアりォヌルなどが攻撃に察する䞻な保護のたたです。



「嘘」の匱い圢。 ノヌドは䞻に「尊敬」されるものず想定しおいたすが、゜フトりェアの匱い「嘘」に察する保護メカニズムを远加するこずは理にかなっおいたす。たずえば、ハヌドりェアの問題、゜フトりェア゚ラヌ、蚭定の誀りによる誀ったメッセヌゞなどです。 そのようなメカニズムは、明確な攻撃者から救うこずができないため、ビザンチンの砎壊に察する党面的な保護ずは芋なせたせんが、これらは信頌性を高めるための簡単で実甚的な手順です。 以䞋に䟋を瀺したす。





実際のシステムモデル



分散システムの問題を解決するために、倚くのアルゎリズムが開発されおいたす。たずえば、第9章でコンセンサス問題の解決策を怜蚎したす。䜕らかの利点をもたらすには、これらのアルゎリズムは、この章で説明した分散システムのさたざたな障害に察凊できなければなりたせん。



アルゎリズムは、動䜜するシステムのハヌドりェアおよび゜フトりェア蚭定の機胜にできるだけ䟝存しないようにする必芁がありたす。 これには、発生する可胜性のある障害のタむプを圢匏化する必芁がありたす。 これを行うために、システムのモデルを説明したす。これは、アルゎリズムが受け入れる仮定を説明する抜象抂念です。



タむミングの仮定に関しおは、3぀のシステムモデルがよく䜿甚されたす。





ただし、タむミングの問題に加えお、ノヌド障害の可胜性も考慮する必芁がありたす。 ノヌドの最も䞀般的な3぀のシステムモデルを次に瀺したす。





実際のシステムのシミュレヌションには、通垞、郚分的に同期した障害埩旧モデルが最適です。 しかし、分散アルゎリズムはどのように察凊したすか



アルゎリズムの正確さ



アルゎリズムの正確さの定矩を䞎えるために、その特性を説明したす。 たずえば、゜ヌトアルゎリズムの結果には次のプロパティがありたす。出力リストの2぀の異なる芁玠の堎合、巊偎の芁玠は右偎の芁玠よりも小さくなりたす。 これはリストの䞊べ替えを蚘述する正匏な方法です。



正しい分散アルゎリズムに必芁なプロパティは、同様の方法で定匏化されたす。 たずえば、ブロック甚のフェンシングマヌカヌを生成する堎合、アルゎリズムから次のプロパティを芁求できたす。





アルゎリズムは、システムのこのモデルで発生する可胜性があるすべおの状況でこれらのプロパティを垞に満たす限り、システムの䞀郚のモデルで正しいです。 しかし、それは理にかなっおいたすか すべおのノヌドたたはすべおのネットワヌク遅延で臎呜的な障害が突然発生するず、アルゎリズムは䜕もできたせん。



機胜的な安党性ず生存性



この状況を明確にするには、機胜安党性安党性ず生存性生存性の2皮類の特性を区別する必芁がありたす。 䞊蚘の䟋では、䞀意性ず倀の単調な増加の特性は、機胜的安党性ず生存性ぞのアクセス性に関連しおいたす。



これら2぀のタむプのプロパティの違いは䜕ですか 特城的な機胜存続可胜性プロパティの決定における「最埌に」ずいうフレヌズの存圚そしお、はい、あなたは絶察に正しいです最終的な䞀貫性は、存続可胜性のプロパティです。



機胜安党は、倚くの堎合、「悪いこずは䜕も起こらなかった」ずいうフレヌズず、存続可胜性-「時間の経過ずずもに良いこずが起こる」ずいうフレヌズによっお非公匏に説明されたす。 しかし、「悪い」ず「良い」ずいう蚀葉は䞻芳的であるため、このような非公匏の定矩にあたり倢䞭にならない方が良いです。 機胜的安党性ず生存性の本物の定矩は数孊的に正確です。





機胜安党性ず生存性の特性に分割する利点は、耇雑なシステムモデルでの䜜業を簡玠化するこずです。 分散アルゎリズムの堎合、システムモデルのあらゆる可胜性のある状況で、機胜安党特性を垞に尊重するこずがしばしば芁求されたす。 ぀たり、すべおのノヌドたたはネットワヌク党䜓の臎呜的な障害が発生した堎合でも、アルゎリズムは間違った結果を返さないこずを保蚌する必芁がありたす぀たり、機胜安党特性が芳察されたす。



ただし、サバむバビリティプロパティに぀いおは明確化が必芁です。たずえば、ほずんどのノヌドで臎呜的な障害が発生せず、サヌビス停止埌にネットワヌクが最終的に回埩した堎合にのみ、リク゚ストぞの応答を返す必芁があるず蚀えたす。 郚分同期モデルの定矩では、システムが埐々に同期状態に戻る必芁がありたす。぀たり、ネットワヌク䞭断の期間は限られた時間だけ続き、その埌埩元されたす。



システムモデルを実䞖界にリンクする



システムモデルず同様に、機胜安党性ず生存性のプロパティは、分散アルゎリズムの正確性を刀断するのに非垞に䟿利です。 ただし、実際にアルゎリズムを実装するず、残酷な珟実が匕き継がれ、システムモデルが珟実の単玔化された抜象化にすぎないこずが明らかになりたす。



たずえば、「臎呜的な障害-埩旧」モデルのアルゎリズムでは、通垞、信頌性の高いストレヌゞに保存されおいるデヌタに臎呜的な障害が発生しおいるず想定しおいたす。 しかし、ディスク䞊のデヌタが砎損した堎合、たたはハヌドりェア゚ラヌや誀った蚭定[91]によりデヌタが消去された堎合はどうなりたすか たた、サヌバヌファヌムりェアに゚ラヌが含たれおおり、ハヌドドラむブがサヌバヌに適切に接続されおいおも、再起動埌にハヌドドラむブの「衚瀺」が停止した堎合



クォヌラムアルゎリズムセクション5.4の「ノヌドの1぀に障害が発生した堎合のデヌタベヌスぞの曞き蟌み」のサブセクション「クォヌラムの曞き蟌みおよび読み取り操䜜」を参照は、ストレヌゞが宣蚀したデヌタを蚘憶するノヌドに䟝存したす。 ノヌドの「健忘症」および以前に保存されたデヌタを忘れる可胜性は、クォヌラム条件に違反し、その結果、アルゎリズムの正確性に違反したす。 おそらく、ほずんどの堎合、信頌性の高いストレヌゞは臎呜的な障害に耐えるこずができたすが、デヌタが倱われる可胜性があるずいう前提で、システムの新しいモデルが必芁です。 ただし、このモデルを正圓化するこずはより困難です。



アルゎリズムの理論的説明では、特定のこずは単に発生しないはずであるず述べるこずができたす。たた、ビザンチン以倖のシステムでは、どの障害が発生し、どの障害が発生しないかを仮定するだけです。 ただし、実際には、この凊理がprintf「あなたは運が悪い」に萜ちお終了666しおも䞍可胜ず思われる事態が発生した堎合に察凊するために、実装にコヌドを含める必芁がある堎合がありたす。人に。 これは、コンピュヌタヌサむ゚ンスず゜フトりェア゚ンゞニアリングの違いです。



これは、理論的で抜象的なシステムが無䟡倀であるこずを意味するのではなく、たったく逆です。 問題を理解し、䜓系的に解決しようずするために考慮できる蚱容可胜な䞀連の障害を、実際のシステムの耇雑さ党䜓から抜出するのに非垞に圹立ちたす。 システムの特定のモデルでその特性が垞に芳察されるこずを実蚌するこずにより、アルゎリズムの正確性を蚌明できたす。



アルゎリズムの正確性の蚌明は、実際のシステムでの実装が垞に正しく動䜜するこずを意味したせん。 しかし、これは非垞に良い最初のステップです。理論的な分析は、実際のシステムに隠れたたたであり、䜕らかの異垞な状況による仮定の厩壊タむミングなどの堎合にのみ珟れる可胜性があるアルゎリズムの問​​題を特定するのに圹立ちたす。 理論的分析ず実蚌的テストも同様に重芁です。



»本の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

» コンテンツ

» 抜粋



プログラマヌ向けクヌポンの20割匕- プログラミング



All Articles