スケヌリングに耐え、デヌタセンタヌ間ですべおを同期する方法



そうでない堎合は、圌はAmazonにトラフィックを誘導し、そこで$ 26のボトル入り飲料氎を販売したす。SaaSコンストラクタヌのサむトに぀いお説明したす



たずえば、1幎間、䞭断のない動䜜を保蚌できるサむトはありたせん。これは、いく぀かの理由で䞎えられおいたす。 そのため、デヌタセンタヌレベルでフォヌルトトレランスを確保し、トラフィックを少し拟うバックアップサむトを䜜成するには、「プランB」が必芁です。 すべおがサヌバヌを同期したす。Yandex、Google、およびカットされたヒヌロヌ。



新しいサむトビルダヌを䜜成し始めたずき、チヌムには10人しかいたせんでしたが、そのようなオフィスの代わりに、職堎はアパヌトでした長くはありたせんが、芚えおおくべきこずがありたす。 これにより、サヌバヌの同期を1幎以䞊詊すこずができたした。同時に、他のプロゞェクトの同僚に、どのように、どのように機胜するかを尋ねたした。



n回目の実隓ずn回目の秘密のむベントに参加した埌、プログラマのマキシムが来お蚀った 「私たちはそんなに倢䞭ではないようです。 」 ぀たり、独自の同期システムを完党に䜜成したした。 そしお今、その理由を説明したす。



プロロヌグシステム管理者の目を通しおuKit



私たちのシステムの䞻芁な゚ンティティの1぀は「サむト」です。これは、ナヌザヌが䜕らかの方法で配眮しお蚘入する構成芁玠「りィゞェット」ぞのリンクを含むデヌタベヌス内のドキュメントです。 りィゞェットを奜みに合わせお配眮し、入力した埌、ナヌザヌは「公開」ボタンをクリックする時間であるず刀断し、いわば圌のサむトが実皌働に入るはずです。





プロゞェクトのメむンデヌタベヌスずしおMongoDBを遞択したため、フォヌルトトレランスに぀いお特に心配する必芁はありたせんでした。すぐに䜿甚できる非同期レプリケヌションがあり、これはすべお良奜です。



たた、2぀のデヌタセンタヌ間をすばやく切り替えるこずができる必芁がありたしたそしお、突然met石がそれらの1぀に萜ちたす。぀たり、すべおのサむトが䞡方のサヌバヌで垞に最新である必芁がありたす。 Mongoのようにシンプルにしたかった。 しかし、単玔さには耇雑さが䌎い、逆もたた同様です。 特に反察



これが私たちが探し求めた道です

私たちは「ハむロむド」を発明したす



裞のrsync'omで発生する可胜性のある問題



非同期を远加したすか ああ、远加したせん



岐路に立っおアマゟンずあなた自身のルナパヌク



タヌニングポむントたたは䞊玚の仲間が行う方法



「Vershansky comb」非同期性のある䞊列性の問題を解決する方法



ナノ秒を考えないでくださいレコヌダヌシステムをテストするずきに考慮すべきこず



ハッピヌ゚ンドメンバヌサヌバヌのヒロむックレスキュヌ



私たちは「ハむロむド」を発明したす



最初のアむデアは、サむトの珟圚の状態を別のコレクションにコピヌするこずでした。 この圢匏では、タスクはプログラマに䞎えられたした。しかし、いじくり回しお、圌はすべおをファむルに取り蟌んでダンプし、ディスクに眮くこずを提案したした。 マキシムは通垞、システムリ゜ヌスを凊理する傟向がありたす。



熟考するず、私たちは埐々にこのアむデアに觊発され始めたした「高負荷」の芳点から、より優れた、より信頌性の高いものを考え出すこずはおそらく䞍可胜です。 ベヌスは、どれほど良いものであっおも、遅かれ早かれ、シャヌディング、新しいむンデックスの構築、その他の定期的なメンテナンスを芁求し始めたす。 そしお、私たちは非垞に負荷の高いサヌビスを行っおいたす。私たちはそのようなこずを考える矩務がありたす。 結局、さらに簡単です。



裞のrsync'omで発生する可胜性のある問題



したがっお、静的ファむル、䞻に異なる圢匏のHTMLおよび画像がありたす。 2぀のサヌバヌ間でそれほど倚くないファむルを同期する方法は Rsync



私たちは十分に小さい間、cronを切っお、ディレクトリ党䜓をサむトず毎分同期したしたロックファむルを䜿甚。 スクリプトはすぐに機胜し、サヌバヌ間で数回切り替えたしたが、悲しみは知りたせんでした。





マヌケティング担圓者のタスクは、システム内のサむトを倧きくするこずです。 そしお私は蚀わなければならない、圌らは仕事に察凊する。



ロックファむルがラッシュアワヌで10分以䞊ハングし始めるこずに気づき始めたした-ディレクトリの階局が成長し、Rsyncはすぐにそれを回避する時間がありたせんでした。 Rsyncは最初に゜ヌス䞊のすべおのディレクトリを巡回し、ツリヌを構築し、受信機から同様のツリヌを取埗し、比范したす...そしおその埌、䜕かを送信し始めたす-これも時間がかかりたす。 その結果、2番目のサヌバヌの統蚈は遅れをずっおおり、特定の時点からの䞍䞀臎は発生しないため、問題が増倧したす。



非同期を远加したすか ああ、远加したせん



そこで、私たちは「分散ファむルシステム」ずいうアむデアを思い぀きたした-䞖界にはたくさんありたすLeoFS、LustreFS、GlusterFS、XtreemFS、WhateverFS。 しかし、その時点でおそらく倉曎されおいたす、すべおが同期であったか、非同期モヌドが実際に機胜したせんでした。 たたはあたりにもひどく働きたした。



Habréに倢䞭になっお、私たちはLsyncdプロゞェクトを発芋したした-各ディレクトリでハングするInotifyりォッチャヌず、ファむルの䜜成/倉曎/削陀のむベントによっおトリガヌされる同じRsyncを介しお動䜜したす。 私たちは詊しおみるこずにしたした玄1時間、100䞇個のディレクトリでハングしたしたが、最終的には動䜜し、䜕かを同期し始めたした。 しかし、Lsyncdには再詊行ず倉曎の長いリストの蚘憶に問題があるこずが刀明したした。







はい、Lsyncdはサヌバヌ間の通信で長い䞭断を経隓しおいたす。





岐路に立っおアマゟンずあなた自身のルナパヌク



「聖杯」を探した結果、次の2぀のオプションの奇劙な岐路にたどり着きたした。



S3-Likeストレヌゞを䜿甚したす -たずえば、Amazon S3たたは倚くのアナログの1぀。 オプションずしお、自分にデプロむしたす。 そのようなアプロヌチは、䞀方で、ファむルがどこにどのように保存されおいるかを考えるのをやめ、生掻を始めるこずができたす。䞀方で、倚くの新しい問題を玄束したす。



たず、ファむルを操䜜するためにコヌド党䜓を曞き盎さなければなりたせん。さらに、ファむルがほが瞬時に即座にディスクに曞き蟌たれるずいう事実に䟝存する堎所をリファクタリングする必芁がありたす。 第二に、デバッグ䞭に必芁になるこずがあるMidnight Commanderファむルをりォヌクスルヌする機胜が倱われたす。



第䞉に、このスキヌムのファむルが他の人の叔父のものである堎合、それらはどんな汚いトリックでも私たちに合うこずができたす-䟋えば、突然䟡栌を2倍にするか、あなたのサヌビスを萜ずしお、りィンドりでミスをしたす はい、ファむルはSwift / Elliptics / Riakにある可胜性がありたす-しかし、たずえばYandexの堎合、デヌタが私たちのものよりも10倍倚い堎合は合理的です。 すぐに5台のサヌバヌに配眮されたす。3台はデヌタがあり、2台はマネヌゞャヌです。これは最小限です。



䞀般的に、タスクに必芁以䞊に難しい。



独自の高床に専門化された゜リュヌションを開発したす。 だから、あなたのルナパヌク-たあ、たたはあなたが奜きな自転車。 はい、ずにかくコヌドを曞き換えるこずができたすしかし、そのほずんどが通過する堎所を芋぀けるこずができたす。 そしお、この堎合のファむルは、サヌバヌ䞊の通垞のファむルの圢匏です。



唯䞀の欠点がありたす-これは自分で行わなければならず、堎所がなくなる前に間に合うようにする必芁がありたす。 Xは2017幎の新幎の前倜でした。



タヌニングポむントたたは䞊玚の仲間が行う方法



自䜜゜リュヌションを支持する遞択には時間がかかりたした。 同時に、ホテル経営者や非女性だけでなく、ワヌクショップでの同僚の経隓にも導かれたした。むベントで圌らを捕たえお、慎重に尋問したした。





芪愛なる同志、私たちの考えが理解できたせんでした。



おそらくタヌニングポむントは、おそらくVKのメンバヌずの䌚議でした。䌚議の傍らで、圌らがファむルを同期する方法を尋ねたした。 圌らはたた、自分が同期できるず蚀いたした。





埌で、Badooで写真が同様の方法で同期されるこずがわかりたした。



䞀般に、マキシムはシステムを曞くために座っお、その間、LVM zashniksからディスクスペヌスを取り出し、重いログをクリヌンアップしたした。



「Vershansky comb」非同期性のある䞊列性の問題を解決する方法



Rabbitmqプロゞェクトで既に䜿甚されおいたしたずfpm npmモゞュヌルをシステムの基盀ずしお䜿甚したした-ほずんどのファむル操䜜はそれを通過したした。 アむデアはこれでした-fsモゞュヌルを再定矩し、キュヌで実行されるすべおのアクションを匷制的に曞き蟌み、完了したず芋なしたすプルコヌルバック。 キュヌの隣にデヌモンが起動され、キュヌからゞョブを取埗し、http経由で受信サヌバヌで実行される別のデヌモンに送信したす。 これがファむルを䜜成しおいる堎合、削陀する堎合は削陀コマンドなどを送信するためにファむルを送信したす。



ただし、 Node.jsがデフォルトで行うように、すべおのタスクを連続しお実行し、非同期で䜜業する堎合、アクションが順䞍同になる可胜性がありたす。 たずえば、ただ存圚しないフォルダヌなどにファむルを曞き蟌もうずしたす。 たた、タスクを順番に完了するず、時間がかかりたす。



キッチンでこのゞレンマに぀いお話し合ったずき、ビティダは偶然であるこずが刀明したした。 VityaはCRUDの動䜜を象城する垂盎線を描き始めたした。線は互いに平行に走り、a、b、c、dず呌ばれおいたした。





ギタヌで-これはVityaです。 䌚瀟でこのような興味深いこずに取り組んでいるパシャも、「くし」のアむデアを完成させるのを助けたした。



ビンゎ ファむルは叀き良きa / b / cスキヌムに埓っお保存されたす。぀たり、サむトvasya.ruはパス/v/a/s/vasya.ruに沿っお配眮されたす。 私たちは、受信偎が1぀の「䞊䜍」レタヌ内で順番にタスクを実行するこずを決定したしたが、それは非同期です。 それは迅速か぀確実に起こりたした。 たた、ボヌド䞊のVitiの図は櫛に䌌おいるため、この原則は、たたたた適切な堎所に適切なタむミングでいたプログラマヌにちなんで呜名されたした。



ナノ秒を考えないでくださいレコヌダヌシステムをテストする際に考慮すべきこず



テストするものがすでにある堎合、叀代の堎合ず同じ方法で2぀の堎所でディレクトリの同期を確認するこずにしたした。぀たり、Rsync自䜓がドラむランモヌドです。



このオプションでは実際には䜕も起こりたせんが、発生するアクションは衚瀺されたす。コピヌする必芁があるすべおのファむルがそれぞれ衚瀺されたす。これが「非同期」のポむントです。







別の問題が埅っおいたした -Node.jsはctimeファむルを最も近いミリ秒に蚭定しその埌さらにれロにしたす、Rsyncは同じもののファむルを比范するずきにナノ秒も考慮したす そしお、実際には同じファむルであっおも、ファむルが異なるず考えたす。



ファむルのmd5ハッシュを蚈算しお比范できたすが、これは非垞に遅いです。 UltraHDモヌドで䜜成時間ファむルを倉曎できる既補のモゞュヌルを怜玢しおも䜕も起こらず、これらの目的のためにCでモゞュヌルを䜜成する必芁がありたした。 これが、同期の起源に戻るず、プログラミングの起源に戻った理由です。



ハッピヌ゚ンド2぀のメンバヌサヌバヌのヒロむックレスキュヌ



すべおが順調に進み、2番目のサヌバヌのディスクをより倧きなサヌバヌに亀換する準備を始めたした。



移行の準備ずしお、圌らは、愛情を蟌めおcoolSyncず呌ばれる「コヌルド同期」スクリプトを䜜成したした。長い間ディスク䞊にあり、䜕のアクションも行わないファむルをダりンロヌドしたすただし、どのファむルかはわかりたせん。 通垞の再垰的Rsyncを䜿甚したバリアントは、ここには適合したせんでした。 この再垰は氞遠に続き、結果ずしお生じるファむルのリストは、完了しなければ関連しなくなりたす。 スクリプトはa / b / cパス自䜓を生成し、それらに沿っお歩いお、「詳现な」フォルダのみをバむパスし、各反埩で個別のフォルダごずにRsyncを実行したした。 わずか1週間で、ほがすべおのファむルをダりンロヌドするこずができたした。









ほんの数週間で、「ほが」の理由を決定したした。 2台のサヌバヌ間の個々の「文字」の同期を確認し始めたずき、倱われたファむルが発芋されたした。たずえば、ファむルが䜜成盎埌に別のディレクトリに移動され、送信デヌモンが適切な堎所でそれを芋぀けられなかったこずが刀明したした。



その結果、これらの問題を克服するこずができたした-新しい2017幎はすでに錻にかかっおいたしたが、ハリりッドの倧ヒット䜜品のように、X時間で管理したした。システムは次のように機胜したす







゚ピロヌグの代わりに



残念ながら、そのようなプロゞェクトのための既補の゜リュヌションもありたせんでした。 したがっお-Lunaparksを構築しおください そしお、あなたの経隓を共有しおください。



All Articles