高負荷の状況でPHPコヌドをデプロむする5぀の方法

孊校で高負荷が教えられた堎合、この䞻題の教科曞はそのような仕事を持っおいるでしょう。 「N゜ヌシャルネットワヌクには2,000台のサヌバヌがあり、その䞊に各PHPコヌド900 MBの150,000個のファむルず50台のマシンのステヌゞングクラスタヌがありたす。 コヌドはサヌバヌに1日に2回展開され、コヌドはステヌゞングクラスタヌで数分ごずに曎新されたす。远加の「修正プログラム」がありたす。完党な蚈算を埅たずに、サヌバヌのすべおたたは遞択した郚分に順番に配眮された小さなファむルセットです。 質問そのような条件は高負荷ず芋なされ、それらを展開する方法は 少なくずも5぀の展開オプションを䜜成したす。」 私たちは、hyload問題の本に぀いおのみ倢を芋るこずができたすが、すでに、 Yuri Nasretdinov  youROCK が間違いなくこの問題を解決し、「5」を獲埗するこずがわかっおいたす。





ナリは単玔な゜リュヌションに留たらず、「コヌドデプロむ」コンセプトの抂念を開瀺し、倧芏暡なPHPデプロむメントの埓来の代替゜リュヌションに぀いお話し、そのパフォヌマンスを分析し、MDKデプロむメントシステムを提瀺したレポヌトを远加したした。



「コヌドのデプロむ」の抂念



英語では、「展開」ずいう甚語は軍隊を譊戒させるこずを意味し、ロシア語では「コヌドを戊闘に投入する」ずいうこずもありたすが、これは同じこずを意味したす。 すでにコンパむルされおいるコヌドたたは元のコヌドPHPの堎合を䜿甚しお、ナヌザヌトラフィックを凊理するサヌバヌにアップロヌドし、魔法によっおコヌドのバヌゞョンを別のバヌゞョンに切り替えたす。 これらはすべお、「コヌドのデプロむ」の抂念に含たれおいたす。



通垞、展開プロセスはいく぀かの段階で構成されたす。





すべおがアセンブルされた埌、即時展開のフェヌズが始たりたす- コヌドは運甚サヌバヌに泚がれたす 。 Badooに぀いおは、このフェヌズに぀いお説明したす。



Badooの叀い展開システム



ファむルシステムむメヌゞのあるファむルがある堎合、それをマりントする方法は Linuxでは、 䞭間ルヌプデバむスを䜜成し、それにファむルを添付する必芁がありたす。その埌、このブロックデバむスは既にマりントできたす。



ルヌプデバむスは、Linuxがファむルシステムむメヌゞをマりントするために必芁な束葉杖です。 この束葉杖が必芁ないOSがありたす。







簡単にするために「ルヌプ」ずも呌ばれるファむルを䜿甚しお、展開プロセスはどのように行われたすか ゜ヌスコヌドず自動生成されたコンテンツが配眮されおいるディレクトリがありたす。 ファむルシステムの空のむメヌゞを取埗したす。珟圚はEXT2であり、以前はReiserFSを䜿甚しおいたした。 ファむルシステムの空のむメヌゞを䞀時ディレクトリにマりントし、そこにすべおの内容をコピヌしたす。 本番に入るために䜕かが必芁ない堎合、すべおをコピヌするわけではありたせん。 その埌、デバむスをアンマりントし、必芁なファむルが配眮されおいるファむルシステムのむメヌゞを取埗したす。 次に、 画像をアヌカむブしおすべおのサヌバヌにアップロヌドし 、そこで解凍しおマりントしたす。



他の既存の゜リュヌション



たず、 Richard Stallmanに感謝したしょう。圌のラむセンスがなければ、私たちが䜿甚するナヌティリティのほずんどは存圚しなかったでしょう。







私は埓来、PHPコヌドをデプロむする方法を4぀のカテゎリヌに分けおいたした。





各メ゜ッドには長所ず短所の䞡方がありたす。そのため、それらを攟棄したした。 これら4぀の方法をより詳现に怜蚎しおください。



svn upバヌゞョン管理システムに基づく展開



私は偶然ではなくSVNを遞択したした-私の芳察によれば、この圢匏ではSVNの堎合に展開が正確に存圚したす。 システムは非垞に軜量で 、 簡単か぀迅速に展開を実行できたす-svnを実行するだけで完了です。



ただし、この方法には倧きなマむナス点が1぀ありたす。svnupを実行し、゜ヌスコヌドを曎新する過皋で、リポゞトリから新しいリク゚ストが来るず、リポゞトリに存圚しないファむルシステムの状態が衚瀺されたす。 新しいファむルの䞀郚ず叀いファむルの䞀郚がありたす。これは非原子的な展開方法で、高負荷には適しおいたせんが、小さなプロゞェクトにのみ適しおいたす。 それにもかかわらず、私はただこの方法で展開されおいるプロゞェクトを知っおいたす。



rsyncナヌティリティに基づく展開



これを行うには2぀のオプションがありたす。ナヌティリティを䜿甚しおファむルをサヌバヌに盎接アップロヌドし、「䞊に」アップロヌドする-曎新したす。



新しいディレクトリぞのrsync



最初にすべおのコヌドをサヌバヌにただ存圚しないディレクトリに完党に泚ぎ蟌み、それからトラフィックを切り替えるため、このメ゜ッドはアトミックです -誰も䞭間状態を芋たせん。 この堎合、150,000個のファむルを䜜成し、150,000個のファむルがある叀いディレクトリを削陀するず、ディスクサブシステムに倧きな負荷がかかりたす 。 私たちはハヌドディスクを非垞に積極的に䜿甚しおおり、そのような操䜜の埌、1分間のサヌバヌはあたり気分が悪くなりたす。 2000台のサヌバヌがあるため、900 MBを2000回アップロヌドする必芁がありたす。



このスキヌムは、最初に特定の数の䞭間サヌバヌたずえば50にアップロヌドしおから、残りのサヌバヌに远加するず改善できたす。 これにより、ネットワヌクで発生する可胜性のある問題は解決されたすが、膚倧な数のファむルを䜜成および削陀する問題はどこにも消えたせん。







䞊のrsync



rsyncを䜿甚した堎合、このナヌティリティはディレクトリ党䜓を埋めるだけでなく、既存のディレクトリを曎新するこずもできたす。 倉曎のみを送信するのはプラスですが、バトルコヌドを提䟛する同じディレクトリに倉曎をアップロヌドするため、䜕らかの䞭間状態もありたす。これはマむナスです。



倉曎の送信は次のように機胜したす。 Rsyncは、デプロむが実行されるサヌバヌ偎ず受信偎でファむルのリストを䜜成したす。 その埌、すべおのファむルからstatをカりントし、リスト党䜓を受信偎に送信したす。 展開を進めおいるサヌバヌ䞊で、これらの倀の違いが考慮され、どのファむルを送信するかが決定されたす。



私たちの条件では、このプロセスには玄3 MBのトラフィックず1秒のプロセッサヌ時間がかかりたす。 これは倧したこずではないようですが、2,000台のサヌバヌがあり、すべおが少なくずも1分間のプロセッサ時間になりたす。 これはそれほど簡単な方法ではありたせんが、rsyncを䜿甚しおすべおを送信するよりも確実に優れおいたす。 どうにかしお原子性の問題を解決し、ほが完璧になりたす。



単䞀ファむルを展開する



アップロヌドするファむルが1぀であっおも、BitTorrentたたはUFTPナヌティリティを䜿甚するず比范的簡単に実行できたす。 1぀のファむルは解凍が簡単で、Unixでアトミックに眮き換えるこずができたす。たた、ファむルからMD5たたはSHA-1の量を蚈算するこずにより、ビルドサヌバヌで生成され、宛先マシンに配信されるファむルの敎合性を簡単に確認できたすrsyncの堎合、宛先サヌバヌに䜕があるかわかりたせん



ハヌドドラむブの堎合、シヌケンシャルレコヌディングは倧きなプラスです。玄10秒で、空いおいるハヌドドラむブに900 MBのファむルが曞き蟌たれたす。 ただし、これらの同じ900 MBを蚘録し、ネットワヌク経由で転送する必芁がありたす。



UFTPに関する叙情的な䜙談



このオヌプン゜ヌスナヌティリティは、元々、たずえば衛星ベヌスのネットワヌクを介しお、ネットワヌク䞊で長い遅延のあるファむルを転送するために䜜成されたした。 しかし、UFTPはマルチキャストに基づくUDPプロトコルを䜿甚しお動䜜するため、倚数のマシンぞのファむルのアップロヌドに適しおいるこずが刀明したした。 単䞀のマルチキャストアドレスが䜜成され、ファむルを受信するすべおのマシンがサブスクラむブし、スむッチがパケットのコピヌが各マシンに配信されるようにしたす。 そこで、デヌタをネットワヌクに送信する負担をシフトしたす。 ネットワヌクがこれを凊理できる堎合、この方法はBitTorrentよりもはるかにうたく機胜したす。



クラスタヌでこのオヌプン゜ヌスナヌティリティを詊すこずができたす。 UDP䞊で動䜜するずいう事実にもかかわらず、NACKメカニズム配信時に倱われたパケットの再転送を匷制する吊定応答がありたす。 これは展開する信頌できる方法です。



単䞀ファむルの展開オプション



tar.gz



䞡方のアプロヌチの欠点を組み合わせたオプション。 ディスクに900 MBを順番に曞き蟌む必芁があるだけでなく、その埌、同じ900 MBをランダムに読み曞きしおもう䞀床曞き蟌み、150,000個のファむルを䜜成する必芁がありたす。 この方法は、rsyncよりもパフォヌマンスがさらに劣りたす。



ファヌ



PHPは、phar圢匏のアヌカむブPHPアヌカむブをサポヌトし、コンテンツの提䟛方法ずファむルのむンクルヌド方法を知っおいたす。 ただし、すべおのプロゞェクトを1぀のpharに入れるのが簡単なわけではありたせん。コヌドの適合が必芁です。 このアヌカむブからのコヌドが機胜しないずいう理由だけで。 さらに、アヌカむブ内の1぀のファむルを倉曎するこずはできたせん 将来のYuri理論的には、ただ可胜です。アヌカむブ党䜓をリロヌドする必芁がありたす。 たた、pharアヌカむブはOPCacheで機胜するずいう事実にもかかわらず、デプロむするずきにキャッシュを砎棄する必芁がありたす。そうしないず、叀いpharファむルからOPCacheにガベヌゞが発生したす。



hhbc



このメ゜ッドは、HHVMのネむティブであるHipHop Virtual Machineであり、Facebookで䜿甚されおいたす。 これはpharアヌカむブのようなものですが、゜ヌスコヌドは含たれおいたせんが、HHVM仮想マシンFacebookのPHPむンタヌプリタヌのコンパむル枈みバむトコヌドは含たれおいたせん。 このファむルの内容を倉曎するこずは犁止されおいたす。新しいクラス、関数を䜜成するこずはできたせん。たた、このモヌドのその他の動的機胜は無効になりたす。 これらの制限により、仮想マシンは远加の最適化を䜿甚できたす。 Facebookによるず、これによりコヌド実行速床が最倧30向䞊する可胜性がありたす。 これはおそらく圌らにずっお良い遞択肢です。 ここで1぀のファむルを倉曎するこずも䞍可胜です 将来のYurisqliteベヌスであるため、実際には可胜です。 1行倉曎したい堎合は、アヌカむブ党䜓を再床やり盎す必芁がありたす。



この方法では、 evalおよび動的なincludeの䜿甚は犁止されおいたす。 これはそうですが、完党ではありたせん。 Evalは䜿甚できたすが、新しいクラスたたは関数が䜜成されず、このアヌカむブの倖郚にあるディレクトリからむンクルヌドするこずはできたせん。



ルヌプ



これは叀いバヌゞョンであり、2぀の倧きな利点がありたす。 たず、通垞のディレクトリのように芋えたす。 ルヌプをマりントするず、ずにかくコヌドのために-開発環境ず本番環境の䞡方でファむルを凊理したす。 2番目の-ルヌプは読み取りおよび曞き蟌みモヌドでマりントでき、実皌働のために䜕かを緊急に倉曎する必芁がある堎合は1぀のファむルを倉曎できたす。



しかし、ルヌプには短所がありたす。 たず、Dockerで奇劙に動䜜したす。 これに぀いおは埌で説明したす。



2番目-最埌のルヌプでdocument_rootずしおシンボリックリンクを䜿甚するず、OPCacheで問題が発生したす。 パスにシンボリックリンクを含めるのはあたり埗意ではなく、䜿甚するファむルのバヌゞョンを混乱させ始めたす。 したがっお、デプロむ時にOPCacheをリセットする必芁がありたす。



もう1぀の問題は、ファむルシステムをマりントするにはスヌパヌナヌザヌ特暩が必芁なこずです。 たた、マシンの起動/再起動時にそれらをマりントするこずを忘れないでください。そうしないず、コヌドの代わりに空のディレクトリが存圚したす。



ドッカヌの問題



ドッカヌコンテナヌを䜜成し、その䞭に「ルヌプ」たたは他のブロックデバむスがマりントされるフォルダヌをスロヌするず、2぀の問題が同時に発生したす。新しいマりントポむントがドッカヌコンテナヌに萜ちないこず、および䜜成時に存圚した「ルヌプ」 Dockerコンテナは 、Dockerコンテナによっお占有されおいるため、 マりント解陀できたせん 。



圓然、これは通垞、展開ず互換性がありたせん。ルヌプデバむスの数が制限されおおり、新しいコヌドがコンテナにどのように分類されるかが䞍明だからです。



たずえば、ロヌカルNFSサヌバヌを起動したり、SSHFSを䜿甚しおディレクトリをマりントしたりするなど、奇劙なこずをしようずしたしたが、さたざたな理由でこれが定着したせんでした。 その結果、cronでrsyncを最埌の「ルヌプ」から珟圚のディレクトリに登録し、1分ごずにコマンドを実行したした。

rsync /var/loop/<N>/ /var/www/
      
      





ここで/var/www/



は、コンテナに昇栌されるディレクトリです。 しかし、Dockerコンテナを備えたマシンでは、PHPスクリプトを頻繁に実行する必芁がないため、rsyncはアトミックではなく、私たちに適しおいたす。 それでも、この方法はもちろん非垞に悪いです。 Dockerでうたく機胜する展開システムを䜜成したいず思いたす。



rsync、2぀のディレクトリおよびrealpath_root



この方法は、PHPの䜜成者であるRasmus Lerdorfによっお提案されたもので、圌は展開方法を知っおいたす。



アトミックデプロむを䜜成する方法ず、私が説明した方法のいずれかを䜿甚したすか シンボリックリンクを取埗し、document_rootずしお登録したす。 各時点で、シンボリックリンクは2぀のディレクトリのいずれかを指し、rsyncを近隣のディレクトリ、぀たりコヌドが指し瀺しおいないディレクトリに䜜成したす。







しかし、問題が発生したすPHPコヌドは、どのディレクトリで起動されたかを知りたせん。 したがっお、たずえば、configの最初のどこかに曞き蟌む倉数を䜿甚する必芁がありたす。これにより、コヌドが実行されたディレクトリず新しいファむルが含たれるディレクトリが修正されたす。 スラむドでは、 ROOT_DIR



ず呌ばれROOT_DIR



。



本番環境で䜿甚するコヌド内のすべおのファむルにアクセスするずきに、この定数を䜿甚したす。 アトミックプロパティを取埗したす。symlinkを切り替える前に到着したリク゚ストには、䜕も倉曎しおいない叀いディレクトリからのファむルが匕き続き含たれ、symlink切り替え埌に来た新しいリク゚ストは新しいディレクトリから動䜜を開始しお凊理されたす新しいコヌド。







ただし、これはコヌドで蚘述する必芁がありたす。 すべおのプロゞェクトがこれに察応できるわけではありたせん。



ラスマススタむル



Rasmusは 、コヌドを手動で倉曎しお定数を䜜成する代わりに、Apacheをわずかに倉曎するか、nginxを䜿甚するこずをお勧めしたす。







document_rootには、最新バヌゞョンぞのシンボリックリンクを指定したす。 nginxをお持ちの堎合は、 root $realpath_root



登録できたす。Apacheの堎合は、スラむドに衚瀺される蚭定を持぀別のモゞュヌルが必芁です。 これは次のように機胜したす。リク゚ストが到着するず、nginxたたはApacheがパスからrealpathを怜蚎し、シンボリックリンクから保存し、このパスをdocument_rootずしお枡したす。 この堎合、document_rootは垞にシンボリックリンクのない通垞のディレクトリを指し、PHPコヌドはどのディレクトリから呌び出されるかを考慮する必芁がない堎合がありたす。



この方法には興味深い利点がありたす-OPCache PHPぞの実際のパスはシンボリックリンクを含みたせん。 リク゚ストが届いた最初のファむルでさえ、すでにいっぱいになっおいお、OPCacheに問題はありたせん。 document_rootが䜿甚されるため、これはどのPHPプロゞェクトでも機胜したす。 䜕も適応する必芁はありたせん。



fpmのリロヌドは䞍芁です。デプロむ䞭にOPCacheをリセットする必芁はありたせん。これは、すべおのファむルを再床解析する必芁があるため、プロセッササヌバヌの負荷が高い理由です。 私の実隓では、OPCacheを玄30分リセットするず、プロセッサの消費が2〜3倍増加したした。 それを再利甚するのは良いこずであり、この方法でそれを行うこずができたす。



今、短所。 OPCacheを再利甚せず、2぀のディレクトリがあるため、各ディレクトリのメモリにファむルのコピヌを保存する必芁がありたす-OPCacheでは、2倍のメモリが必芁です。



奇劙に思われる別の制限がありたす-max_execution_timeごずに耇数回デプロむするこずはできたせん 。 そうしないず、rsyncがディレクトリの1぀にアクセスしおいる間、そのディレクトリからのリク゚ストを凊理できるため、同じ問題が発生したす。



䜕らかの理由でApacheを䜿甚する堎合は、Rasmusも曞いたサヌドパヌティのモゞュヌルが必芁です。



ラスマスは、このシステムは優れおいるず蚀いたす。私もあなたにお勧めしたす。 99のプロゞェクトでは、新しいプロゞェクトず既存のプロゞェクトの䞡方に適しおいたす。 しかし、もちろん、私たちはそのようなものではなく、独自の決定を曞くこずにしたした。



新しいシステム-MDK



基本的に、私たちの芁件はほずんどのWebプロゞェクトの芁件ず倉わりたせん。 ステヌゞングずプロダクションでの迅速な展開 、 䜎リ゜ヌス消費 、OPCacheの再利甚、および高速ロヌルバックが必芁です。



ただし、他の芁件ずは異なる2぀の芁件がありたす。 たず、 アトミックにパッチを適甚する機胜です。 パッチは、本番環境で䜕かを支配する1぀たたは耇数のファむルの倉曎ず呌ばれたす。 早くやりたいです。 原則ずしお、Rasmusが提䟛するシステムはパッチタスクに察凊しおいたす。



たた、数時間実行できる CLIスクリプトもありたすが 、それらは匕き続きコヌドの䞀貫したバヌゞョンで動䜜するはずです。 この堎合、䞊蚘の゜リュヌションは、残念ながら私たちに合わないか、倚くのディレクトリが必芁です。



可胜な解決策





ここで、Nは数時間で発生する蚈算の数です。 それらを䜕十個も持぀こずができるので、コヌドの远加コピヌのために非垞に倧きなスペヌスを費やす必芁がありたす。



そのため、新しいシステムを思い぀いおMDKず呌びたした。 これは、 マルチバヌゞョン展開ツヌルであるマルチバヌゞョン展開キットの略です。 以䞋の仮定に基づいおそれを行いたした。



ツリヌストレヌゞアヌキテクチャはGitから取埗したした。 スクリプトが機胜するコヌドの䞀貫したバヌゞョンが必芁です。぀たり、スナップショットが必芁です。 スナップショットはLVMでサポヌトされおいたすが、BtrfsやGitなどの実隓的なファむルシステムでは非効率的に実装されおいたす。 Gitからスナップショットの実装を取りたした。



file.phpからfile.php。<version>にすべおのファむルの名前を倉曎したした。 持っおいるファむルはすべおディスクに保存されおいるため、同じファむルの耇数のバヌゞョンを保存する堎合は、そのバヌゞョンにサフィックスを远加する必芁がありたす。



私はGoが倧奜きなので、スピヌドのためにGoでシステムを䜜成したした。



Multiversion Deployment Kitの仕組み



Gitからスナップショットのアむデアを取り入れたした。 それを少し単玔化し、MDKでの実装方法を説明したす。



MDKには2皮類のファむルがありたす。 最初はカヌドです。 以䞋の図は緑色でマヌクされおおり、リポゞトリ内のディレクトリに察応しおいたす。 2番目のタむプは盎接ファむルで、通垞ず同じ堎所にありたすが、ファむルバヌゞョンの圢匏のサフィックスが付いおいたす。 ファむルずマップは、その内容に基づいおバヌゞョン管理されたす。この䟋では、単にMD5です。







ルヌトマップが他のマップのファむルの特定のバヌゞョンを参照し、それらが他のファむルずマップを参照し、特定のバヌゞョンを修正するファむルの階局があるずしたす。 䜕らかのファむルを倉曎したいのです。







おそらく同様の写真を芋たこずがあるかもしれたせんネストの第2レベルでファむルを倉曎し、察応するマップ-map *で、3぀の*ファむルのバヌゞョンが曎新され、その内容が倉曎され、バヌゞョンが倉曎されたす-バヌゞョンもルヌトマップで倉曎されたす。 䜕かを倉曎するず、垞に新しいルヌトマップが取埗されたすが、倉曎しなかったファむルはすべお再利甚されたす。



リンクは以前ず同じファむルに残りたす。 これは、任意の方法でスナップショットを䜜成する䞻なアむデアです。たずえば、 ZFSでは 、ほが同じ方法で実装されたす。



MDKがディスク䞊にある方法







ディスク䞊にありたす 最新のルヌトマップぞのシンボリックリンク-Webから提䟛されるコヌド、ルヌトマップのいく぀かのバヌゞョン、堎合によっおは異なるバヌゞョンのいく぀かのファむル、およびサブディレクトリには察応するディレクトリのマップがありたす。



私は質問を予芋したす「 そしお、これはどのようにりェブリク゚ストを凊理したすかナヌザヌコヌドはどのファむルに来るでしょうか 」



はい、私はあなたを欺いた-バヌゞョンなしのファむルもありたす。index.phpのリク゚ストを受信し、ディレクトリにそれがない堎合、サむトは機胜したせん。







すべおのPHPファむルには、 スタブず呌ばれるファむルがありたす。これらのファむルには、これらのカヌドの操䜜方法を知っおいる関数が宣蚀されおいるファむルからのファむルず、目的のバヌゞョンのファむルからのファむルの2行が含たれおいるためです。



 <?php require_once "mdk.inc"; require mdk_resolve_path("a.php");
      
      





これは、バヌゞョンなしでa.phpファむルからb.phpを陀倖した堎合、require_onceが曞き蟌たれおいるため、システムはどのルヌトカヌドから開始したかを蚘憶し、それを䜿甚するため、最新バヌゞョンにシンボリックリンクされたせん䞀貫したバヌゞョンのファむルを取埗したす。



残りのファむルに぀いおは、最新バヌゞョンぞのシンボリックリンクがありたす。



MDKを䜿甚しお展開する方法



モデルはgit pushに非垞に䌌おいたす。





䟋



サヌバヌに「one」ずいう名前のファむルがあるずしたす。 ルヌトマップを送信したす。







ルヌトマップの砎線の矢印は、存圚しないファむルぞのリンクを瀺しおいたす。 それらがマップ䞊にあるため、それらの名前ずバヌゞョンを知っおいたす。 サヌバヌにリク゚ストしたす。 サヌバヌが送信するず、ファむルの1぀がカヌドでもあるこずがわかりたす。







芋おください-単䞀のファむルはありたせん。 再床、䞍足しおいるファむルをリク゚ストしたす。 サヌバヌはそれらを送信したす。 残りのカヌドはありたせん-展開プロセスが完了したした。







ファむルが150,000個の堎合はどうなるか簡単に掚枬できたすが、倉曎されおいたす。 ルヌトマップで1぀のマップが欠萜しおいるこずがわかりたす。ネストのレベルを確認しお、ファむルを取埗したしょう。 蚈算の耇雑さずいう点では、プロセスはファむルを盎接コピヌするこずずほずんど倉わりたせんが、同時にコヌドの䞀貫性ずスナップショットが保持されたす。



MDKには欠点はありたせん:) 1週間以内にデプロむされたすべおのファむルを残すこずができるため、 小さな倉曎を迅速か぀アトミックにデプロむでき 、 スクリプトは数日間機胜したす。 それらはかなり十分なスペヌスを占有したす。 OPCacheを再利甚するこずもでき、CPUはほずんど䜕も食べたせん。



監芖は非垞に困難ですが、可胜です。 すべおのファむルはコンテンツごずにバヌゞョン管理されおおり、すべおのファむルを調べお名前ずコンテンツを確認するcronを䜜成できたす。 ルヌトマップがすべおのファむルを参照しおいるこず、砎損したリンクがないこずを確認するこずもできたす。 さらに、展開䞭に敎合性がチェックされたす。



叀いカヌドはすべお揃っおいるため、倉曎を簡単にロヌルバックできたす 。 カヌドを投げるだけで、すぐにすべおが揃いたす。



私にずっお、さらにMDKがGoで蚘述されおいるずいう事実は、 MDKがすばやく動䜜するこずを意味したす。



私は再びあなたを欺いた、ただ短所がありたす。 プロゞェクトをシステムで動䜜させるには、コヌドを倧幅に倉曎する必芁がありたすが、䞀芋するず思われるよりも簡単です。 システムは非垞に耇雑です。Badooなどの芁件がない堎合は、実装をお勧めしたせん。 たた、ずにかく、遅かれ早かれ堎所は終了するので、 ガベヌゞコレクタヌが必芁です 。



ファむルを線集するための特別なナヌティリティを䜜成したした-スタブではなく実際のファむル、たずえばmdk-vim。 ファむルを指定するず、目的のバヌゞョンが怜出されお線集されたす。



数字のMDK



ステヌゞングに50台のサヌバヌがあり、その䞊に3〜5秒間展開したす。 rsync以倖のすべおず比范するず、非垞に高速です。 本番環境では、玄2分 、 5〜10秒の小さなパッチを展開したす。



䜕らかの理由で、すべおのサヌバヌ䞊のコヌドでフォルダヌ党䜓が倱われた堎合これは決しお発生しないはずです、 完党アップロヌドのプロセスには玄40分かかりたす。 倜はトラフィックが最小でしたが、それは䞀床起こりたした。 したがっお、誰も怪我をしたせんでした。 2番目のファむルは5分間サヌバヌのペア䞊にあったため、蚀及する䟡倀はありたせん。



システムはオヌプン゜ヌスではありたせんが、もし興味があれば、コメントを曞いおください-レむアりトされるかもしれたせん 将来のゆりこの蚘事を曞いおいる時点ではただシステムはオヌプン゜ヌスではありたせん 。



おわりに



ラスマスに耳を傟け、圌は嘘を぀いおいたせん 。 私の意芋では、そのrsyncメ゜ッドずrealpath_rootが最適ですが、ルヌプも非垞にうたく機胜したす。



頭で考えおください 。プロゞェクトに必芁なものを芋お、十分な「トりモロコシ」がある宇宙船を䜜ろうずしないでください。 ただし、同様の芁件がある堎合は、MDKに䌌たシステムが適しおいたす。



HighLoad ++で説明されたこのトピックに戻るこずにしたしたが、おそらく高いパフォヌマンスを達成するための倚くのレンガの1぀にすぎなかったため、十分な泚意が払われたせんでした。 しかし今、完党にPHPに特化した専門のPHPロシア䌚議が開催されおいたす。 そしお、ここで私たちは本圓に完党に抜けたす。 パフォヌマンス 、 暙準 、およびツヌルに぀いお、 リファクタリングを含む倚くのこずに぀いお培底的に話したす。



䌚議プログラムの曎新で電報チャンネルを賌読し、5月17日に䌚いたしょう。



All Articles