Kate MatsudeiraスケヌラブルなWebアヌキテクチャず分散システム

半幎前、私の卒業蚌曞翻蚳のテキストに぀いお質問がありたした 。 集合的な粟神の助けの結果は、 ケむト束平によっお曞かれたスケヌラブルなりェブアヌキテクチャず分散システムの章を翻蚳する決定でした。 これは、このような量ず耇雑さの私の最初の翻蚳であるこずに泚意する必芁がありたす。 テキストは比范的うたく翻蚳されたしたが、翻蚳の質の芳点からは10から6-7に蚭定したした。私の努力が無駄にならないように、䜜業の結果を公開したす。



Habrの読者の芁望により 、珟圚はトピック圢匏の完党版。



オヌプン゜ヌスアプリケヌションのアヌキテクチャ第2巻

スケヌラブルなWebアヌキテクチャず分散システム



ケむト・マツデむラ

翻蚳 jedi-to-be 。

蚂正 Anastasiaf15 、 sunshine_lass 、 Amaliya 、 fireball 、 Goudron 。













オヌプン゜ヌス゜フトりェアは、最倧芏暡のWebサむトの䞻芁な構成芁玠になりたした。 これらのWebサむトの成長に䌎い、アヌキテクチャのベストプラクティスずガむドラむンが登堎したした。 この章では、倧芏暡なWebサむトを蚭蚈する際に考慮すべき重芁な問題のいく぀かず、これらの目暙を達成するために䜿甚される基本的なコンポヌネントのいく぀かを取り䞊げたす。









この章ではWebシステムの分析に焊点を圓おおいたすが、䞀郚の資料は他の分散システムに倖挿するこずができたす。









1.1分散Webシステム構築の原則





スケヌラブルなWebサむトたたはアプリケヌションの䜜成ず管理ずはどういう意味ですか 原始的なレベルでは、これは単にナヌザヌをむンタヌネット経由でリモヌトリ゜ヌスに接続するこずです。 たた、リ゜ヌスたたはこれらのリ゜ヌスぞのアクセスは、倚くのサヌバヌに分散されおおり、Webサむトのスケヌラビリティを保蚌するリンクです。









人生のほずんどのこずず同様に、事前にWebサヌビスを蚈画するのに費やした時間は、将来的に圹立ちたす。 倧芏暡なWebサむトの背埌にある考慮事項ずトレヌドオフの䞀郚を理解するず、小芏暡なWebサむトを䜜成する際に、より賢明な決定を䞋すこずができたす。 以䞋は、倧芏暡なWebシステムの蚭蚈に圱響するいく぀かの重芁な原則です。













これらの原則はそれぞれ、分散型Webアヌキテクチャの蚭蚈における意思決定の基瀎ずなりたす。 ただし、䞀方の目暙の達成は、他方の怠慢によるものであるため、それらは互いに察立する可胜性もありたす。 簡単な䟋パフォヌマンス゜リュヌションスケヌラビリティずしお耇数のサヌバヌを単玔に远加するこずを遞択するず、管理コスト远加のサヌバヌを実行する必芁がありたすを増やし、サヌバヌを賌入できたす。









あらゆる皮類のWebアプリケヌションを開発する堎合、プロゞェクトがそれらの1぀以䞊を寄付できるこずを確認するこずであっおも、これらの重芁な原則を考慮するこずが重芁です。













1.2基本





システムのアヌキテクチャを怜蚎する際には、たずえば、どのコンポヌネントを䜿甚するか、どのように組み合わせるか、どのようなトレヌドオフを行うかなど、察凊する必芁があるいく぀かの問題がありたす。 スケヌラビリティを明らかに必芁ずせずにスケヌラビリティに投資するこずは、合理的なビゞネス䞊の決定ずは芋なされたせん。 ただし、蚈画の際に事前に考慮しおおくず、将来倚くの時間ずリ゜ヌスを節玄できたす。









このセクションでは、ほずんどすべおの倧芏暡なWebアプリケヌションに䞍可欠ないく぀かの基本的な芁玠、 サヌビス 、

冗長性 、 セグメンテヌション 、およびフェヌルオヌバヌ 。 これらの各芁因には、特に前のセクションで説明した原則の文脈においお、遞択ず劥協が䌎いたす。 明確にするために、䟋を瀺したす。









䟋画像ホスティングアプリケヌション





おそらくすでに画像をオンラむンで投皿しおいるでしょう。 耇数の画像の保存ず配信を提䟛する倧芏暡なサむトの堎合、䜎応答遅延迅速な取埗を特城ずする費甚察効果の高い信頌性の高いアヌキテクチャを䜜成する際に問題がありたす。









ナヌザヌが䞭倮サヌバヌに画像をアップロヌドし、FlickrやPicasaのようなサむトたたはAPIぞのリンクを介しお画像を芁求できるシステムを想像しおください。 説明を簡単にするために、このアプリケヌションには2぀の䞻なタスクがあるず仮定したす。サヌバヌに画像をアップロヌド曞き蟌みし、画像を芁求する機胜です。 もちろん、効果的なダりンロヌドは重芁な基準ですが、優先床はナヌザヌのリク゚ストに応じお迅速に配信するこずですたずえば、Webペヌゞたたは他のアプリケヌションで衚瀺する画像をリク゚ストできたす。 この機胜は、コンテンツ配信ネットワヌクCDNのWebサヌバヌたたぱッゞサヌバヌによっお提䟛される機胜に䌌おいたす。 通垞、CDNサヌバヌは倚くの堎所にデヌタオブゞェクトを栌玍するため、地理的/物理的な堎所がナヌザヌに近くなり、パフォヌマンスが向䞊したす。









システムの他の重芁な偎面













図1.1は、機胜の簡略図です。











図1.1画像ホスティングアプリケヌションの簡略化されたアヌキテクチャ図









この画像ホスティングの䟋では、システムは非垞に高速であり、そのデヌタは安党に保存され、これらの属性はすべおスケヌラブルです。 このアプリケヌションの小さなバヌゞョンを䜜成するこずは暙準的なタスクであり、単䞀のサヌバヌでホストできたす。 ただし、このような状況はこの章では重芁ではありたせん。 Flickrず同じくらい倧きなものを䜜成する必芁があるずしたしょう。













サヌビス





スケヌラブルなシステムの蚭蚈を怜蚎する堎合、機胜を分離し、システムの各郚分を明確に定矩されたむンタヌフェむスを持぀個別のサヌビスず考えるず䟿利です。 実際には、この方法で蚭蚈されたシステムにはサヌビス指向アヌキテクチャSOAがあるず考えられおいたす。 これらのタむプのシステムの堎合、各サヌビスには独自の機胜コンテキストがあり、このコンテキスト倖の䜕かずの盞互䜜甚は、通垞は別のサヌビスのパブリックAPIである抜象むンタヌフェヌスを介しお行われたす。









システムをいく぀かの補完的なサヌビスに分解するず、䞀郚の郚分の動䜜が他の郚分から分離されたす。 この抜象化により、サヌビス、その基盀ずなる環境、およびサヌビスコンシュヌマヌ間の明確な関係を確立できたす。 明確なアりトラむンを䜜成するず、問題の堎所を特定するのに圹立ちたすが、各パヌツを個別にスケヌリングするこずもできたす。 広範囲の芁求に察応するためのこのタむプのサヌビス指向システムの蚭蚈は、プログラミングにおけるオブゞェクト指向アプロヌチに䌌おいたす。









この䟋では、すべおのダりンロヌドおよび画像取埗リク゚ストは同じサヌバヌで凊理されたす。 ただし、システムは拡匵する必芁があるため、これら2぀の機胜を独自のサヌビスに分離するこずをお勧めしたす。









このサヌビスは将来頻繁に䜿甚されるず仮定したす。 このシナリオは、2぀の機胜が共有リ゜ヌスを奪い合うため、録画が画像の読み取りにかかる時間にどの皋床圱響するかを远跡するのに圹立ちたす。 アヌキテクチャによっおは、この効果は倧きくなる堎合がありたす。 送受信速床が同じであっおも少なくずも31の受信/出力速床比を持぀ように蚭蚈されおいるため、ほずんどのIPネットワヌクでは䞀般的ではありたせん、読み取りファむルは通垞キャッシュから抜出され、レコヌドは最終的にはディスクにアクセスしたす同様の状況で耇数回曞き換えられる可胜性がありたす。 すべおのデヌタがメモリ内にある堎合、たたはディスクSSD゜リッドステヌトドラむブなどから読み取られた堎合でも、デヌタベヌスぞの曞き蟌みはほずんどの堎合デヌタベヌスからの読み取りよりも遅くなりたす。 Pole Position、ベンチマヌクデヌタベヌス甚のオヌプン゜ヌスツヌル、 http//polepos.org/およびhttp://polepos.sourceforge.net/results/PolePositionClientServer.pdfの結果。。









この蚭蚈のもう1぀の朜圚的な問題は、ApacheやlighttpdなどのWebサヌバヌでは、通垞、凊理できる同時接続の数に䞊限があるこずですデフォルト倀は玄500ですが、それ以䞊の堎合もありたすトラフィックが倚い堎合、レコヌドはこの制限をすぐに䜿い果たす可胜性がありたす。 読み取りは非同期であるか、gzip圧瞮やバッチ転送などの他のパフォヌマンス最適化を利甚できるため、Webサヌバヌはフィヌドの読み取りをより速く切り替えおクラむアントを切り替えるこずができ、最倧接続数Apacheを䜿甚接続の最倧数を500に蚭定するず、1秒あたり数千の読み取り芁求を凊理するこずができたす。 䞀方、レコヌドは、ダりンロヌド時間䞭は開いた接続を維持する傟向がありたす。 そのため、ほずんどのホヌムネットワヌクでは、1 MBのファむルをサヌバヌに転送するのに1秒以䞊かかる可胜性がありたす。その結果、Webサヌバヌは500件のこのような同時レコヌドしか凊理できたせん。











図1.2読み取りず曞き蟌みの分離





このような朜圚的な問題を予枬するこずは、 図1.2に瀺すように、画像の読み取りず曞き蟌みを独立したサヌビスに分離する必芁があるこずを瀺しおいたす 。 これにより、各レコヌドを個別にスケヌリングできるだけでなく垞にレコヌドよりも倚くの読み取りを行う可胜性が高いため、各サヌビスで䜕が起こっおいるかを認識できるようになりたす。 最埌に、これにより、将来発生する可胜性のある問題が区別され、読み取りアクセスが遅い問題の蚺断ず評䟡が簡玠化されたす。









このアプロヌチの利点は、互いに独立しお問題を解決できるこずです。この堎合、1぀のコンテキストで新しい画像を蚘録および受信する必芁に぀いお考える必芁はありたせん。 これらのサヌビスはどちらも匕き続きグロヌバルむメヌゞコヌパスを䜿甚したすが、特定のサヌビスに適したメ゜ッドを䜿甚する堎合、独自のパフォヌマンスを最適化できたすたずえば、リク゚ストをキュヌに入れたり、人気のあるむメヌゞをキャッシュしたりするこずで-詳现は埌述 サヌビスずコストの䞡方の芳点から、必芁に応じお各サヌビスを個別にスケヌリングできたす。 䞊蚘のシナリオのように、これらの組み合わせず混合がパフォヌマンスに䞍泚意に圱響を䞎える可胜性があるため、これはプラスの芁因です。









もちろん、2぀の異なる゚ンドポむントがある堎合、䞊蚘のモデルの䜜業は最適です実際、これはクラりドストレヌゞプロバむダヌずコンテンツ配信ネットワヌクのいく぀かの実装に非垞に䌌おいたす。 このような問題を解決するには倚くの方法があり、それぞれのケヌスで劥協点を芋぀けるこずができたす。









たずえば、Flickrは異なるモゞュヌル間でナヌザヌを分散するこずでこの読み取り/曞き蟌みの問題を解決したす。これにより、各モゞュヌルは限られた数の特定のナヌザヌのみにサヌビスを提䟛でき、ナヌザヌ数が増加するず、より倚くのモゞュヌルがクラスタヌに远加されたす

http://mysqldba.blogspot.com/2008/04/mysql-uc-2007-presentation-file.html 。 最初の䟋では、実際の負荷システム党䜓の読み取りず曞き蟌みの数に基づいおハヌドりェアをスケヌリングするのが簡単ですが、Flickrのスケヌリングはナヌザヌベヌスに基づいおいたすただし、ここでは異なるナヌザヌ間で均䞀に䜿甚するずいう仮定が䜿甚されるため、容量を蚈画する必芁がありたす圚庫。 過去には、アクセス䞍胜たたはサヌビスの1぀に問題があるずシステム党䜓の機胜が無効になりたずえば、誰もファむルを曞き蟌めない、Flickrモゞュヌルの1぀にアクセスできないず、それに関連するナヌザヌのみが圱響を受けたす。 最初の䟋では、Flickrアヌキテクチャでは各モゞュヌルを曎新たたは怜玢する必芁がありたすたたは、怜玢サヌビスを曎新する必芁がありたすが、新しいメタデヌタを含めるように蚘録サヌビスを曎新する、画像のすべおのメタデヌタを怜玢するなど、デヌタセット党䜓に察しお操䜜を実行する方が簡単です実際にこれを目的ずするメタデヌタを゜ヌトするために䜜成されたす。









これらのシステムに関しおは、䞇胜薬はありたせんが、この章の冒頭で説明した原則から垞に進める必芁がありたすシステムのニヌズを決定したす「読み取り」たたは「曞き蟌み」のロヌド操䜜たたはすべおを䞀床に、䞊列凊理のレベル、デヌタセットのク゚リ、範囲、゜ヌトなど、さたざたな遞択肢の比范ベンチマヌクテストを実斜し、朜圚的なシステム障害の状態を理解し、障害が発生した堎合の包括的な蚈画を䜜成したす。













冗長性





障害に゚レガントに察凊するには、Webアヌキテクチャのサヌビスずデヌタに冗長性が必芁です。 たずえば、単䞀のサヌバヌにファむルのコピヌが1぀しか保存されおいない堎合、このサヌバヌの損倱はファむルの損倱を意味したす。 この状況が明確に特城づけられる可胜性は䜎く、通垞、耇数のコピヌたたはバックアップコピヌを䜜成するこずで回避できたす。









これず同じ原則がサヌビスにも圓おはたりたす。 耇数のコピヌたたはバヌゞョンの同時操䜜を保蚌するアプリケヌションの機胜の䞍可欠な郚分を提䟛する堎合、単䞀ノヌドの障害から身を守るこずができたす。









システムに冗長性を䜜成するず、脆匱性を取り陀き、緊急時にバックアップたたは冗長機胜を提䟛できたす。 たずえば、本番環境で同じサヌビスのコピヌが2぀あり、そのうちの1぀が完党にたたは郚分的に倱敗した堎合、システムは䜜業コピヌに切り替えるこずで倱敗を克服できたす 。

切り替えは自動的に行われるか、手動の介入が必芁になる堎合がありたす。





。



サヌビスの冗長性のもう1぀の重芁な圹割は、リ゜ヌス共有を䌎わないアヌキテクチャの䜜成です。 このアヌキテクチャにより、各ノヌドは独立しお動䜜するこずができ、さらに、他のノヌドの状態たたは調敎アクションを制埡する䞭倮の「頭脳」がなくおも動䜜できたす。 新しいノヌドの远加は特別な条件や知識を必芁ずしないため、スケヌラビリティに貢献したす。 そしお、最も重芁なこずは、これらのシステムには臎呜的な脆匱点がなく、障害に察する回埩力がはるかに高いこずです。





。



たずえば、画像サヌバヌアプリケヌションでは、すべおの画像に別のハヌドりェアのどこかに冗長コピヌがあり理想的には、デヌタセンタヌでの地震や火灜などの灜害時に地理的に異なる堎所にありたす、画像アクセスサヌビスそれらはすべお朜圚的にリク゚ストを凊理したすが、冗長になりたす。  図1.3を参照しおください。

将来的には、ロヌドバランサヌはこれを可胜にする優れた方法ですが、以䞋でさらに詳しく説明したす。











図1.3冗長むメヌゞホスティングアプリケヌション









セグメンテヌション





デヌタセットは非垞に倧きいため、単䞀のサヌバヌでホストするこずはできたせん。 たた、コンピュヌティング操䜜に必芁なコンピュヌタヌリ゜ヌスが倚すぎお、パフォヌマンスが䜎䞋し、電力の増加が必芁になる堎合もありたす。 いずれの堎合でも、2぀のオプションがありたす垂盎たたは氎平スケヌリング。









スケヌルアップには、単䞀のサヌバヌにリ゜ヌスを远加するこずが含たれたす。 したがっお、非垞に倧きなデヌタセットの堎合、これはより倚くのたたはより倚くのハヌドディスクを远加するこずを意味するため、デヌタセット党䜓を単䞀のサヌバヌでホストできたす。 蚈算操䜜の堎合、これは、より高速なCPUたたはより倚くのメモリを備えたより倧きなサヌバヌに蚈算を移動するこずを意味したす。 いずれにしおも、远加のデヌタ凊理が可胜なコンピュヌティングシステムの個別のリ゜ヌスを䜜成するために、垂盎スケヌリングが実行されたす。









䞀方、氎平スケヌリングには、ノヌドの远加が含たれたす。 倧芏暡なデヌタセットの堎合、これは合蚈デヌタ量の䞀郚を栌玍するために2番目のサヌバヌを远加するこずを意味し、コンピュヌティングリ゜ヌスの堎合、これはいく぀かの远加ノヌドを通じお䜜業たたは負荷を共有するこずを意味したす。 氎平スケヌリングの可胜性を最倧限に掻甚するには、システムアヌキテクチャ開発の内郚原則ずしお実装する必芁がありたす。 そうでない堎合、氎平スケヌリングに必芁なコンテキストの倉曎ず匷調衚瀺に問題が生じる可胜性がありたす。









氎平スケヌリングの最も䞀般的な方法は、サヌビスをセグメントたたはモゞュヌルに分離するこずです。 機胜の各論理セットが個別に機胜するような方法で配垃できたす。 これは、地理的な境界、たたは有料ナヌザヌず無料ナヌザヌなどの他の基準に埓っお行うこずができたす。 これらのスキヌムの利点は、機胜が匷化されたサヌビスたたはデヌタりェアハりスを提䟛するこずです。









この䟋のむメヌゞサヌバヌでは、むメヌゞの保存に䜿甚される唯䞀のファむルサヌバヌを倚くのファむルサヌバヌに眮き換えるこずができ、各ファむルサヌバヌには独自のむメヌゞセットが含たれたす。  図1.4を参照しおください。このアヌキテクチャにより、システムは各ファむルサヌバヌをむメヌゞで満たし、ディスクスペヌスがいっぱいになるずサヌバヌを远加できたす。 デザむンには、むメヌゞファむル名ずそれを含むサヌバヌを関連付ける呜名スキヌムが必芁です。 むメヌゞ名は、サヌバヌに関連付けられた䞀貫したハッシュスキヌムから䜜成できたす。 たたは、各画像に増分識別子を付けるこずもできたす。これにより、配信サヌビスは、画像を芁求するずきに各サヌバヌに関連付けられた識別子の範囲のみをむンデックスずしお凊理できたす。











図1.4冗長性ずセグメンテヌションを備えたむメヌゞホスティングアプリケヌション





もちろん、デヌタや機胜を耇数のサヌバヌに配垃するのは困難です。 重芁な問題の1぀はデヌタの堎所です。 分散システムでは、デヌタが操䜜の堎所たたは蚈算のポむントに近いほど、システムのパフォヌマンスが向䞊したす。 したがっお、デヌタを耇数のサヌバヌに配垃するこずには問題が発生する可胜性がありたす。このデヌタが必芁になる堎合はい぀でも、デヌタが需芁の堎所にない可胜性があるため、サヌバヌはネットワヌク䞊で必芁な情報の高䟡なサンプリングを実行する必芁があるためです。









別の朜圚的な問題がフォヌムで発生したす

䞍敎合䞍敎合さたざたなサヌビスが共有リ゜ヌス、朜圚的に別のサヌビスたたはデヌタストアに察しお読み取りおよび曞き蟌みを行うず、「競合」状態の可胜性がありたす。 -この堎合、デヌタには䞀貫性がありたせん。 たずえば、画像ホスティングスクリプトでは、䞀方のクラむアントが犬の画像を曎新する芁求を送信し、「犬」の芋出しを「ギズモ」に倉曎しお、他のクラむアントが画像を読んでいる堎合に競合状態が発生する可胜性がありたす。 このような状況では、「Dog」ず「Gizmo」のどちらの芋出しが2番目のクラむアントによっお受信されるかは明確ではありたせん。





。



もちろん、デヌタのセグメンテヌションに関連するいく぀かの障害がありたすが、セグメンテヌションを䜿甚するず、デヌタ、ロヌド、䜿甚パタヌンなどに応じお、各問題を他の問題ず区別できたす。 マネヌゞドブロックに。 スケヌラビリティず管理性の向䞊に圹立ちたすが、リスクはただ残っおいたす。 リスクを軜枛し、障害を凊理するには倚くの方法がありたす。 ただし、簡朔にするため、この章では説明したせん。このトピックに関する詳现情報が必芁な堎合は、フォヌルトトレランスず監芖に関するブログ投皿をご芧ください。

















1.3。 高速でスケヌラブルなデヌタアクセスの構造コンポヌネント





分散システムの開発におけるいく぀かの基本原則を怜蚎したので、今床はより困難なポむントであるデヌタアクセスのスケヌリングに移りたしょう。









LAMPスタックアプリケヌションなどの最も単玔なWebアプリケヌションは、図1.5の画像に䌌おいたす。











図1.5単玔なWebアプリケヌション





: . - , . . ; .









.











図1.6簡略化されたWebアプリケヌション





ほずんどのシステムは、内の回路に簡略化するこずができ、図1.6、

レビュヌのための良い出発点です。倧量のデヌタがある堎合は、テヌブルの䞊郚の匕き出しにあるキャンディヌ付きのボックスず同じくらい簡単にアクセスできるようにするこずができたす。この比范は非垞に単玔化されおいたすが、デヌタりェアハりスのスケヌラビリティずデヌタぞの迅速なアクセスずいう2぀の耇雑な問題を指摘しおいたす。









このセクションを確認するために、倚くのテラバむトTBのデヌタがあり、ナヌザヌがこのデヌタの小さな郚分にランダムな順序でアクセスできるようにするず仮定したす。図1.7を参照。

同様のタスクは、画像ホスティングアプリケヌションの䟋で、ファむルサヌバヌ䞊のどこかに画像ファむルを配眮するこずです。











図1.7特定のデヌタぞのアクセス





, -. — , , , . ; 6 , , 100,000 — (. « », http://queue.acm.org/detail.cfm?id=1563874).  , , , .









, , — , , . , , .













: . : , , -, - . : , , , , . , , , .









サンプルAPIの䞀郚ずしお、キャッシュを䜿甚しおデヌタぞのアクセスを高速化するにはどうすればよいですかこの堎合、キャッシュをホストするのに適した堎所がいく぀かありたす。可胜な配眮オプションの1぀ずしお、

図1.8に瀺すように、リク゚ストレベルでノヌドを遞択できたす。











図1.8芁求レベルのホストでキャッシュをホストする





芁求レベルのノヌドにキャッシュを盎接配眮するず、応答デヌタのロヌカルストレヌゞが可胜になりたす。サヌビスリク゚ストが実行されるたびに、ノヌドはロヌカルのキャッシュされたデヌタがあればすぐに返したす。キャッシュにない堎合、芁求ノヌドはディスクからデヌタを芁求したす。芁求レベルの1぀のノヌドのキャッシュは、メモリ非垞に高速ずノヌドのロヌカルディスクネットワヌクストレヌゞぞのアクセスよりも高速の䞡方に配眮するこずもできたす。











図1.9キャッシュシステム





キャッシュを耇数のノヌドに分散するずどうなりたすか図1.9でわかるように、芁求レベルに倚くのノヌドが含たれる堎合、各ノヌドに独自のキャッシュがある可胜性がありたす。ただし、ロヌドバランサヌがノヌド間でリク゚ストをランダムに分散するず、同じリク゚ストが異なるノヌドに送信されるため、キャッシュ゚ラヌが増加したす。このハヌドルを克服する2぀の方法は、グロヌバルキャッシュず分散キャッシュです。













グロヌバルキャッシュ





: . , , , . , . , , . ( , , , ).









図に描かれおいるグロヌバルキャッシュには2぀の暙準圢匏がありたす。䞊の図1.10は、キャッシュされた応答がキャッシュ内で芋぀からなかった堎合の状況を瀺し、キャッシュ自䜓はデヌタ・ベヌス・ストレヌゞの䞍足しおいる郚分を取埗する責任ずなりたす。䞊の図1.11キャッシュで発芋されおいない任意のデヌタを受信するノヌドを芁求する矩務を瀺したす。











図1.10キャッシュが取埗を担圓する







グロヌバルキャッシュ図1.11芁求ノヌドが取埗を担圓するグロヌバルキャッシュ









, , , , . , , . , , ; ( ) . — , , , . ( - — , — , .)

















( 1.12 ), , , — , , . -. , , , , . , . , — , .









分散キャッシングの欠点は、ノヌドが欠萜しおいる状況で機胜するこずです。䞀郚の分散キャッシュは、デヌタの冗長コピヌを耇数のノヌドに保存するこずにより、この問題を回避したす。ただし、特にク゚リレベルでノヌドを远加たたは削陀する条件では、そのようなキャッシュの論理構造がどれほど迅速に耇雑になるか想像できたす。ノヌドが消えおキャッシュの䞀郚が倱われたずしおも、結果は必ずしも壊滅的ではありたせん-芁求は゜ヌスから盎接デヌタを受信するだけです











図1.12分散キャッシュ。





(, !) . , . , , .









Memcached (), , ); , ( ).









Memcached -, , , - , (O(1)) .









Facebookは、さたざたな皮類のキャッシュを䜿甚しお、サむトで高いパフォヌマンスを実珟しおいたす 「Facebookキャッシュずパフォヌマンス」を参照。 これらは、 $GLOBALS



およびAPC、蚀語レベルのキャッシング関数を呌び出すこずでPHPで衚されるを䜿甚したす。これは、䞭間関数呌び出しを高速化し、結果を取埗するのに圹立ちたす。 ほずんどの蚀語には、Webペヌゞのパフォヌマンスを向䞊させるためにこれらのタむプのラむブラリが装備されおおり、ほが垞に䜿甚する必芁がありたす。さらに、Facebookは耇数のサヌバヌに分散するグロヌバルキャッシュを䜿甚したす「 Facebookでのmemcachedのスケヌリング 」を参照キャッシュにアクセスする関数呌び出しは、異なるMemcachedサヌバヌに保存されたデヌタに察する倚くのリク゚ストを同時に実行できたす。 このアプロヌチにより、ナヌザヌプロファむルデヌタのパフォヌマンスずスルヌプットを倧幅に向䞊させ、デヌタを曎新するための集䞭型アヌキテクチャを䜜成できたす。 これは重芁です。䜕千ものサヌバヌでは、キャッシュの䞀貫性を無効にしお維持するこずが困難な堎合があるためです。









さらに、キャッシュにデヌタがない堎合のアクションのアルゎリズムに぀いお説明したす。













プロキシ





基本レベルでは、プロキシサヌバヌはクラむアントからのリク゚ストを受信し、それらをバック゚ンド゜ヌスサヌバヌに送信するハヌドりェア/゜フトりェアの䞭間郚分です。 通垞、プロキシは、リク゚ストのフィルタリング、リク゚ストのログ蚘録、たたはリク゚ストの倉換ヘッダヌの远加/削陀、暗号化/埩号化たたは圧瞮に䜿甚されたす。











図1.13プロキシサヌバヌ





プロキシは、倚数のサヌバヌからの芁求を調敎する際にも非垞に圹立ちたす。これにより、システム党䜓の芁求トラフィックを最適化できたす。 プロキシを䜿甚しおデヌタぞのアクセスを高速化する方法の1぀は、同じたたは同様の芁求を結合し、単䞀の応答を芁求クラむアントに送信するこずです。 この甚語は、折りたたみ転送ず呌ばれたす。









いく぀かのノヌドが同じデヌタに察するリク゚ストを受信するずしたすlittleBず呌びたしょうが、このデヌタの䞀郚はキャッシュにありたせん。 この芁求がプロキシを介しお送信される堎合、すべおの芁求を1぀にたずめるこずができ、この最適化の結果、littleBはディスクから1回だけ読み取られたす。  図1.14を参照この堎合、芁求を凊理しおそれらを結合するプロセスはわずかに長い遅延に぀ながるため、少し速床を犠牲にする必芁がありたす。 ただし、逆に負荷が高いず、特に同じデヌタに察する芁求が繰り返される堎合に、パフォヌマンスが向䞊したす。 プロキシの機胜戊略はキャッシュに䌌おいたすが、デヌタを保存する代わりに、ドキュメントぞのリク゚ストたたは呌び出しを最適化したす。









たずえば、LANプロキシでは、クラむアントはむンタヌネットに接続するために独自のIPアドレスを必芁ずしたせん。 プロキシは、同じコンテンツに察するクラむアントからの芁求を結合したす。 ただし、倚くのプロキシもキャッシュであるためキャッシュを配眮する論理的な堎所であるため、これによりあいたいさが生じたすが、すべおのキャッシュがプロキシずしお機胜するわけではありたせん。











図1.14プロキシサヌバヌを䜿甚しお芁求を結合する





プロキシを䜿甚するもう1぀の優れた方法は、同じデヌタに察する芁求を結合するだけでなく、゜ヌスリポゞトリディスク䞊で互いに空間的に近いデヌタの郚分も結合するこずです。 この戊略を䜿甚するず、ク゚リのデヌタの局所性が最倧化され、ク゚リの埅機時間が短瞮されたす。 たずえば、ノヌドのセットがパヌトBをリク゚ストする堎合パヌトB1、パヌトB2など、個々のリク゚ストの空間䜍眮を認識するようにプロキシを構成し、それらを単䞀のリク゚ストに結合しおbigBのみを返し、読み取りを倧幅に最小化できたすデヌタ゜ヌスから。  図1.15を参照任意の順序でテラバむトのデヌタ党䜓にアクセスする堎合、ク゚リの実装時間は非垞に異なる可胜性がありたす。 プロキシは基本的に耇数の芁求を1぀にグルヌプ化できるため、負荷が高い状況やキャッシング機胜が制限されおいる状況で特に圹立ちたす。











図1.15プロキシを䜿甚しお、空間的に近いデヌタの芁求を結合する





プロキシずキャッシュを䞀緒に䜿甚できるこずは泚目に倀したすが、倚くの参加者ずのマラ゜ンでより速いランナヌがスタヌトできるようにする方がよいのず同じ理由で、通垞はプロキシの前にキャッシュを眮く方が良いです。 これは、キャッシュがメモリからのデヌタを䜿甚するためです。これは非垞に高速であり、同じ結果に察する耇数の芁求ず矛盟したせん。 ただし、キャッシュがプロキシサヌバヌの反察偎にある堎合、キャッシュの前に各リク゚ストに远加の遅延が発生し、パフォヌマンスが䜎䞋する可胜性がありたす。









プロキシをシステムに远加するこずを怜蚎しおいる堎合は、倚くの遞択肢がありたす。

むカず

ワニスは時の詊緎に耐え 、倚くの生産的なりェブサむトで広く䜿甚されおいたす。 これらのプロキシ゜リュヌションは、クラむアントずサヌバヌ間の通信を最倧限に掻甚するための倚くの最適化オプションを提䟛したす。 それらの1぀をWebサヌバヌレベルでリバヌスプロキシモヌド負荷分散のセクションで埌述に蚭定するず、Webサヌバヌのパフォヌマンスが倧幅に向䞊し、着信クラむアント芁求を凊理するための䜜業量が削枛されたす。













指数





むンデックスを䜿甚しおデヌタにすばやくアクセスするこずは、デヌタぞのアクセスを効果的に最適化するためのよく知られた戊略です。 むンデックスは、デヌタベヌスで最も広く䜿甚されおいたす。 むンデックスは盞互に譲歩し、デヌタストレヌゞボリュヌムのオヌバヌヘッドを䜿甚し、「曞き蟌み」操䜜の速床を䜎䞋させたすデヌタの曞き蟌みずむンデックスの曎新を同時に行う必芁があるため。より高速な「読み取り」操䜜の圢で勝぀こずができたす。









リレヌショナルデヌタセットのように、この抂念をより倧きなデヌタストアに適甚するこずもできたす。 むンデックスのコツは、ナヌザヌがデヌタにアクセスする方法を明確に理解するこずです。 デヌタセットのボリュヌムがテラバむト単䜍で枬定され、有甚な情報がほずんどない堎合たずえば1 KB、デヌタぞのアクセスを最適化するためにむンデックスを䜿甚する必芁がありたす。 このような倧芏暡なデヌタセットで小さな有甚な情報を芋぀けるこずは、劥圓な時間内にこのような倧量のデヌタを順番に䞊べ替えるこずができないため、実際の問題になる可胜性がありたす。 さらに、このような倧きなデヌタセットが耇数のたたは倚数の物理デバむスに分散しおいる可胜性が非垞に高いため、必芁なデヌタの正しい物理的な堎所を䜕らかの方法で芋぀ける必芁がありたす。 これを行うには、むンデックスが最適な方法です。











図1.16むンデックス





むンデックスは、デヌタの堎所を瀺す目次ずしお䜿甚できたす。 たずえば、セクション「B」のパヌト2のデヌタを探しおいるずしたしょう。どこでそれを芋぀けるこずができたすか。 デヌタタむプ別に゜ヌトされたむンデックスがある堎合-デヌタを「A」、「B」、「C」ず呌びたしょう-゜ヌス内のデヌタ「B」の堎所を瀺したす。 次に、この堎所を芋぀けお、必芁な郚分「B」を数えるだけです。  図1.16を参照









これらのむンデックスは、倚くの堎合、メモリに栌玍されるか、着信クラむアント芁求に察しお非垞にロヌカルな堎所に栌玍されたす。 Berkeley DBBDBおよびツリヌ状のデヌタ構造は、順序付きリストにデヌタを栌玍するために䞀般的に䜿甚され、むンデックスアクセスに最適です。









倚くの堎合、必芁なデヌタの䞀郚を取埗するたで、マップずしお機胜する倚くのレベルのむンデックスがあり、ある堎所から別の堎所に移動したす。  図1.17を参照











図1.17マルチレベルむンデックス





むンデックスを䜿甚しお、同じデヌタの他のいく぀かの衚珟を䜜成するこずもできたす。 倧芏暡なデヌタセットの堎合、これは、デヌタの倚くの远加コピヌを䜜成するこずなく、さたざたなフィルタヌずビュヌを定矩する優れた方法です。









たずえば、䞊蚘の画像ホスティングシステムが実際に本のペヌゞに画像を配眮し、サヌビスがこれらの画像でクラむアント偎のテキストク゚リを有効にし、怜玢゚ンゞンがHTMLで怜玢できるように、特定のトピックのすべおのテキストコンテンツを怜玢するずしたすコンテンツ。 この堎合、これらのすべおの本の画像は倚くのサヌバヌを䜿甚しおファむルを保存するため、ナヌザヌに衚瀺する1぀のペヌゞを芋぀けるのは非垞に困難です。 最初は、任意の単語や単語セットを照䌚するための逆むンデックスに簡単にアクセスできる必芁がありたす。 次に、正確なペヌゞに移動しおこの本に配眮し、怜玢結果の正しい画像を抜出するタスクがありたす。 したがっお、この堎合、転眮されたむンデックスは堎所ブックBなどに衚瀺され、Bにはすべおの単語、堎所、各郚分の出珟回数を含むむンデックスを含めるこずができたす。









䞊蚘の図でIndex1が衚瀺できる逆玢匕は次のようになりたす。各単語たたは単語のセットは、それらを含む本の玢匕ずしお機胜したす。













単語s 本s
玠晎らしい ブックB、ブックC、ブックD
い぀も Book C、Book F
信じる ブックB






䞭間むンデックスも同様に芋えたすが、ブックBの単語、堎所、情報のみが含たれたす。耇数のレベルを含むこのようなアヌキテクチャでは、すべおの情報が1぀の倧きな逆むンデックスに栌玍される堎合よりも各むンデックスのスペヌスを節玄できたす。









そしお、これは倧芏暡システムの重芁なポむントです。なぜなら、これらのむンデックスは圧瞮されおいおも、非垞に倧きく、保存するのに費甚がかかる可胜性があるからです。 このシステムには䞖界䞭からたくさんの本がありたす-100,000,000ブログ゚ントリ「Inside Google Books」を参照-各本は1ペヌゞあたり250ワヌドで10ペヌゞ蚈算を簡単にするためで構成されおいるず仮定したすこれにより、合蚈2500億語になりたす。 単語の平均文字数を5ずし、各文字が8ビットたたは実際には2バむトを占有しおいる堎合でも1バむトで゚ンコヌドされおいるため、単語ごずに5バむトを費やしおいる堎合、むンデックス各単語を1回だけ含めるには、1テラバむト以䞊の容量のストレヌゞが必芁です。 このように、単語セット、デヌタの堎所、䜿甚回数などの他の情報も含むむンデックスは、非垞に急速に増加する可胜性があるこずがわかりたす。











このような䞭間むンデックスを䜜成し、デヌタをより小さな郚分で提瀺するず、「ビッグデヌタ」の問題を解決しやすくなりたす。 デヌタは耇数のサヌバヌに分散でき、同時に迅速にアクセスできたす。 むンデックスは、情報怜玢の基瀎であり、今日の最新の怜玢゚ンゞンの基盀です。 もちろん、このセクションでは䞀般にむンデックス付けのトピックのみを扱い、むンデックスを小さく、高速に、より倚くの情報関連性などを䜿甚しお自由に曎新する方法に぀いお倚くの研究が行われおいたす。 特に関連性や評䟡が関係する堎合、競合する条件の制埡性、および新しいデヌタの远加や既存のデヌタの倉曎に必芁な曎新の数にいく぀かの問題がありたす。









デヌタをすばやく簡単に芋぀ける機胜は非垞に重芁であり、これを実珟するための最も簡単で効果的なツヌルはむンデックスです。









ロヌドバランサヌ





最埌に、分散システムのもう1぀の重芁な郚分はロヌドバランサヌです。 ロヌドバランサヌの圹割は、芁求の凊理を担圓するノヌド間で負荷を分散させるこずであるため、ロヌドバランサヌはアヌキテクチャの重芁な郚分です。 これにより、耇数のノヌドがシステム内の同じ機胜を透過的に提䟛できたす。  図1.18を参照。䞻な目暙は、倚くの同時接続を凊理し、これらの接続を芁求されたノヌドの1぀にルヌティングし、ノヌドを远加しおより倚くの芁求に察応できるようにするこずです。











図1.18ロヌドバランサヌ





ク゚リを凊理するためのさたざたなアルゎリズムがありたす。ランダムノヌドの遞択、埪環アルゎリズムの遞択、䞭倮プロセッサやRAMの䜿甚などの特定の基準に基づいたノヌドの遞択も含たれたす。 ロヌドバランサヌは、ハヌドりェアデバむスたたは゜フトりェアずしお実装できたす。 オヌプン゜ヌス゜フトりェア䞊のロヌドバランサヌの䞭で、 HAProxyは最も広く䜿甚されおいたす。









分散システムでは、ロヌドバランサヌは倚くの堎合システムの「フロント゚ンド」にあるため、すべおの着信芁求はそれらを盎接通過したす。 以䞋に瀺すように、耇雑な分散システムでは、リク゚ストが耇数のバランサヌを通過する必芁がある可胜性が非垞に高くなりたす。

図1.19











図1.19耇数のロヌドバランサヌ





プロキシず同様に、䞀郚のロヌドバランサヌは、リク゚ストのタむプに応じお異なる方法でリク゚ストを送信するこずもできたす。 それらは逆プロキシずしおも知られおいたす。









特定のナヌザヌセッションに固有のデヌタの管理は、ロヌドバランサヌを䜿甚する際の問題の1぀です。 eコマヌスサむトでは、顧客が1人だけの堎合、ナヌザヌが買い物かごに物を入れたり、蚪問の間にその内容を保存したりするこずは非垞に簡単です補品がただサむトに返されるず、補品を販売する確率が倧幅に増加するため、これは重芁です圌のバスケットにありたす。 ただし、ナヌザヌが最初のセッションで1぀のノヌドに誘導され、次の蚪問䞭に別のノヌドに誘導された堎合、新しいノヌドにはそのナヌザヌのバスケットの内容に関するデヌタがないため、矛盟が発生する可胜性がありたす。 Mountain Dewのパッケヌゞをバスケットに入れた堎合、動揺したせんか。返品しおもセッションはありたせん。1぀の解決策は、セッションが「スティッキヌ」になり、ナヌザヌが垞に同じノヌド。 ただし、自動フォヌルトトレランスなどの特定の信頌性機胜を利甚するこずは非垞に困難です。 この堎合、ナヌザヌのバスケットには垞にコンテンツがありたすが、スティッキヌノヌドにアクセスできなくなった堎合、特別なアプロヌチが必芁になり、バスケットのコンテンツに関する仮定はもはや成り立たなくなりたすただし、この仮定はアプリケヌションに組み蟌たれないこずが望たれたす。 もちろん、この問題は、この章で説明するサヌビスやその他の倚くブラりザキャッシュ、Cookie、URL曞き換えなどなど、他の戊略やツヌルを䜿甚しお解決できたす。









システムに少数のノヌドしかない堎合、DNSカルヌセルなどの手法はロヌドバランサヌよりも実甚的である可胜性が高く、コストがかかり、䞍芁なレベルを远加するこずでシステムの耇雑さを増す可胜性がありたす。 もちろん、倧芏暡なシステムには、ランダム遞択やカルヌセルアルゎリズムなどの単玔なアルゎリズムず、システム䜿甚モデルのパフォヌマンス機胜を考慮したより耇雑なメカニズムの䞡方を含む、あらゆる皮類の異なる蚈画および負荷分散アルゎリズムがありたす。 これらのすべおのアルゎリズムを䜿甚するず、トラフィックず芁求を分散でき、自動フォヌルトトレランスや砎損したノヌドの自動削陀たずえば、応答停止時などの䟿利な信頌性ツヌルを提䟛できたす。 ただし、これらの高床な機胜を䜿甚するず、問題の蚺断が面倒になりたす。 たずえば、高負荷の状況では、ロヌドバランサヌは、実行が遅くなったり、埅機時間が長くなるリク゚ストの急増によりノヌドを削陀したす。これにより、他のノヌドの状況が悪化するだけです。 これらの堎合、システム党䜓のトラフィックず負荷が枛少したように芋える堎合でもノヌドの芁求が少ないため、個々のノヌドが過負荷になる可胜性があるため、広範な制埡が重芁です。









ロヌドバランサヌは、システムの電源を構築する簡単な方法です。 この蚘事で説明した他の方法ず同様に、分散システムのアヌキテクチャで重芁な圹割を果たしたす。 ロヌドバランサヌは、ノヌドの状態を怜蚌するための重芁な機胜も提䟛したす。 そのようなチェックの結果に基づいお、ノヌドが応答しないか、過負荷になっおいる堎合、芁求凊理プヌルから削陀できたす。システムの冗長性により、残りの䜜業ノヌド間で負荷が再分配されたす。













キュヌ





これたで、デヌタをすばやく読み取るための倚くの方法を怜蚎しおきたした。 同時に、デヌタレむダヌのスケヌリングのもう1぀の重芁な郚分は、レコヌドの効率的な管理です。システムがシンプルで、最小限の凊理負荷ず小さなデヌタベヌスを備えおいる堎合、蚘録は予想以䞊に高速になりたす。ただし、より耇雑なシステムでは、このプロセスに無期限に長い時間がかかる堎合がありたす。たずえば、異なるサヌバヌたたはむンデックスの耇数の堎所にデヌタを蚘録する必芁がある堎合や、システムの負荷が高い堎合がありたす。蚘録やタスクだけでも時間がかかる堎合、パフォヌマンスず可甚性を実珟するには、システムに非同期性を組み蟌む必芁がありたす。これを行う䞀般的な方法は、リク゚ストをキュヌに入れるこずです。











図1.20同期リク゚スト





, . , . , ( ) , , . , , , , . — , 1.20 .









このタむプの同期動䜜は、クラむアントのパフォヌマンスを倧幅に䜎䞋させる可胜性がありたす。実際にアむドル状態の堎合、クラむアントは芁求に察する応答を受信するたで埅機する必芁がありたす。システムの負荷に察凊するためにサヌバヌを远加しおも、実際には問題は解決したせん。効率的な負荷分散が行われおいる堎合でも、顧客の生産性を最倧化するために必芁な均等か぀公平な負荷分散を確保するこずは非垞に困難です。さらに、この芁求を凊理するサヌバヌが利甚できないたたは倱敗した堎合、それに接続されおいるクラむアントも動䜜を停止したす。この問題を効果的に解決するには、クラむアントのリク゚ストず、サヌビスを提䟛するために行われた実際の䜜業を抜象化する必芁がありたす。











図1.21キュヌを䜿甚しおリク゚ストを管理する





. : , , «» , . (. 1.21 .) - . , ; . , .









, . , , , . , , , , , , . , , , . — , .









. , , , - . , , , .









— , . RabbitMQ ,

ActiveMQ ,

BeanstalkD ,

Zookeeper , Redis .













1.4。 おわりに





, , . , — .


















Creative Commons Attribution 3.0 . . .







The Architecture of Open Source Applications .




















All Articles