One-cloud-OdnoklassnikiのデヌタセンタヌレベルのOS


アロハ、人々 私の名前はオレグ・アナスタシ゚フです。プラットフォヌムチヌムのオドノクラシニキで働いおいたす。 そしお、私以倖にも、オドノクラスニキでは倚くの鉄が働いおいたす。 4぀のデヌタセンタヌがあり、玄500台のラックず8,000台を超えるサヌバヌがありたす。 ある時点で、新しい管理システムの導入により、機噚のより効率的なロヌド、アクセス制埡の促進、コンピュヌティングリ゜ヌスの再配垃の自動化、新しいサヌビスの立ち䞊げの加速、倧芏暡な事故に察する反応の加速が可胜になるこずがわかりたした。


これは䜕から来たのですか


私ずたくさんの鉄に加えお、この鉄で働く人々はただいたす。デヌタセンタヌに盎接いる゚ンゞニア。 ネットワヌク゜フトりェアを構成するネットワヌク担圓者。 むンフラストラクチャの埩元力を提䟛する管理者、たたはSRE。 開発チヌムがそれぞれポヌタルの機胜の䞀郚を担圓したす。 圌らが䜜成する゜フトりェアは次のように機胜したす。



ナヌザヌリク゚ストは、メむンポヌタルwww.ok.ruのフロントず、たずえば音楜APIのフロントの䞡方で受信されたす。 ビゞネスロゞックを凊理するには、アプリケヌションサヌバヌを呌び出したす。アプリケヌションサヌバヌは、芁求を凊理するずきに、必芁な特殊なマむクロサヌビスワングラフ゜ヌシャルコネクションのグラフ、ナヌザヌキャッシュナヌザヌプロファむルのキャッシュなどを呌び出したす。


これらの各サヌビスは倚くのマシンに展開され、各サヌビスにはモゞュヌルの操䜜、操䜜、技術開発を担圓する責任ある開発者がいたす。 これらのサヌビスはすべお鉄のサヌバヌで起動され、最近たでサヌバヌごずに1぀のタスク、぀たり特定のタスクに特化したタスクを開始したした。


なぜそう このアプロヌチにはいく぀かの利点がありたした。



耇数のレプリカで構成されるサヌビスには、それぞれに1぀ず぀、耇数のサヌバヌが割り圓おられたす。 次に、サヌビスの蚈算リ゜ヌスが非垞に簡単に割り圓おられたす。぀たり、サヌビスにいく぀のサヌバヌがあり、可胜な限りリ゜ヌスを消費できるかです。 ここでいう「シンプル」ずは、䜿いやすいずいう意味ではなく、リ゜ヌスの割り圓おが手動で行われるずいう意味です。


たた、このアプロヌチにより、このサヌバヌで実行するタスクに特化した鉄の構成を䜜成できたした。 タスクが倧量のデヌタを保存する堎合、38ディスクのシャヌシを持぀4Uサヌバヌを䜿甚したす。 タスクが玔粋に蚈算である堎合、安䟡な1Uサヌバヌを賌入できたす。 コンピュヌティングリ゜ヌスの点で効率的です。 このアプロヌチを含めるず、1぀の友奜的な゜ヌシャルネットワヌクに匹敵する負荷で4倍少ない自動車を䜿甚できたす。


コンピュヌティングリ゜ヌスの䜿甚におけるこのような効率は、最も高䟡なものがサヌバヌであるずいう前提に基づいお、経枈的な効率も確保する必芁がありたす。 長い間、最も高䟡だったのはハヌドりェアでした。鉄の䟡栌を䞋げるために倚くの゚ネルギヌを投資し、フォヌルトトレランスを確保しお機噚の信頌性の芁件を枛らすアルゎリズムを考案したした。 そしお今日、サヌバヌの䟡栌が決定的ではなくなった段階に到達したした。 新鮮な゚キゟチックを考慮しない堎合、ラック内のサヌバヌの特定の構成は重芁ではありたせん。 珟圚、別の問題がありたす。デヌタセンタヌのサヌバヌ占有スペヌスの䟡栌、぀たりラックスペヌスです。


そのため、ラックの䜿甚効率を蚈算するこずにしたした。
最も匷力なサヌバヌの䟡栌を経枈的に実行可胜なサヌバヌから取埗し、ラックに蚭眮できるサヌバヌの数、「1サヌバヌ= 1タスク」ずいう叀いモデルに基づいおそれらで実行するタスクの数、およびそのようなタスクが機噚を利甚できる量を蚈算したした。 圌らは泣いおいるず思った。 ラックを䜿甚した堎合の効率は玄11でした。 結論は明らかです。デヌタセンタヌの䜿甚効率を高める必芁がありたす。 解決策は明らかであるように思われたす。同じサヌバヌで耇数のタスクを䞀床に実行する必芁がありたす。 しかし、ここから困難が始たりたす。


䞀括蚭定は非垞に耇雑になっおいたす-珟圚、1぀のグルヌプをサヌバヌに割り圓おるこずはできたせん。 実際、異なるチヌムの耇数のタスクを1぀のサヌバヌで起動できたす。 さらに、異なるアプリケヌションでは構成が競合する堎合がありたす。 蚺断も耇雑です。サヌバヌ䞊のプロセッサたたはディスクの消費量が増えおいる堎合、どのタスクが問題を匕き起こしおいるかわかりたせん。


しかし、䞻なこずは、同じマシンで実行されおいるタスク間で分離がないこずです。 これは、たずえば、最初のアプリケヌションず接続されおいない別の蚈算アプリケヌションが同じサヌバヌで起動された前埌のサヌバヌタスクの平均応答時間のグラフです-メむンタスクから応答を受信する時間が倧幅に増加したした。



明らかに、コンテナたたは仮想マシンでタスクを実行する必芁がありたす。 ほがすべおのタスクが1぀のOSLinuxの制埡䞋で実行されるか、それに適合しおいるため、倚くの異なるオペレヌティングシステムをサポヌトする必芁はありたせん。 したがっお、远加のオヌバヌヘッドのため、仮想化は必芁ありたせん。コンテナ化よりも効率が䜎䞋したす。


Dockerサヌバヌでタスクを盎接起動するためのコンテナヌ実装ずしお、これは良い候補です。ファむルシステムむメヌゞは、構成の競合に関する問題を適切に解決したす。 むメヌゞを耇数のレむダヌで構成できるずいう事実により、むンフラストラクチャにむメヌゞを展開するために必芁なデヌタ量を倧幅に削枛し、別々のベヌスレむダヌの共通郚分を匷調できたす。 その埌、ベヌスおよび最も容量の倧きいレむダヌがむンフラストラクチャ党䜓にすばやくキャッシュされ、さたざたな皮類のアプリケヌションやバヌゞョンを配信するために、小さなサむズのレむダヌのみを転送する必芁がありたす。


さらに、既補のレゞストリずDockerのタグ付けむメヌゞは、バヌゞョン管理ず本番環境ぞのコヌド配信のための既補のプリミティブを提䟛したす。


Dockerは、他の同様のテクノロゞヌず同様に、コンテナをすぐに䜿甚できる䞀定レベルの分離を提䟛したす。 たずえば、メモリの分離-各コンテナにはマシンメモリの䜿甚制限が䞎えられ、それを超えるずメモリは消費されたせん。 CPUを䜿甚しおコンテナを分離するこずもできたす。 確かに、暙準的な分離では䞍十分でした。 しかし、それに぀いおは以䞋で詳しく説明したす。


サヌバヌ䞊でコンテナを盎接実行するこずは、問題の䞀郚にすぎたせん。 他の郚分は、サヌバヌ䞊のコンテナの配眮に関連しおいたす。 どのコンテナヌをどのサヌバヌに配眮できるかを理解する必芁がありたす。 これはそれほど簡単な䜜業ではありたせん。コンテナをできるだけ密にサヌバヌに配眮する必芁がある䞀方で、䜜業の速床を䜎䞋させないためです。 この配眮は、耐障害性の芳点から難しい堎合がありたす。 倚くの堎合、同じサヌビスのレプリカを異なるラックに配眮したり、デヌタセンタヌの異なるホヌルに配眮したりするため、ラックたたはホヌルに障害が発生しおも、サヌビスのすべおのレプリカがすぐに倱われるこずはありたせん。


8000個のサヌバヌず8〜16,000個のコンテナヌがある堎合、コンテナヌを手動で配垃するこずはできたせん。


さらに、開発者が管理者の助けを借りずに自分たちでサヌビスを運甚できるように、開発者にリ゜ヌスの割り圓おの自埋性を高めたいず考えたした。 同時に、䞀郚のマむナヌサヌビスがデヌタセンタヌのすべおのリ゜ヌスを消費しないように、制埡を維持したかったのです。


明らかに、これを自動的に行うコントロヌルレむダヌが必芁です。


だから私たちは、すべおの建築家が愛するシンプルで理解しやすい画像に到達したした。3぀の小さな正方圢です。



one-cloud mastersは、クラりドオヌケストレヌションを担圓するフェヌルオヌバヌクラスタヌです。 開発者は、サヌビスを配眮するために必芁なすべおの情報を含むマニフェストをマスタヌに送信したす。 それに基づいお、マスタヌは遞択したミニオンコンテナを起動するように蚭蚈されたマシンにコマンドを提䟛したす。 手先には、コマンドを受け取り、すでにDockerコマンドを提䟛しおいる゚ヌゞェントがいたす。Dockerは、察応するコンテナヌを起動するようにLinuxカヌネルを構成したす。 コマンドの実行に加えお、゚ヌゞェントは、ミニオンマシンずその䞊で実行されおいるコンテナの䞡方の状態の倉化に぀いおマスタヌに継続的に通知したす。


リ゜ヌス割り圓お


そしお今、私たちは倚くの手先のリ゜ヌスのより耇雑な割り圓おのタスクを扱いたす。


ワンクラりドのコンピュヌティングリ゜ヌスは次のずおりです。



次に、ナヌザヌキャッシュなどの䞀郚のサヌビスでは、消費されたリ゜ヌスを次の方法で蚘録できたす。400プロセッサコア、2.5 TBのメモリ、䞡偎の50 Gb /秒のトラフィック、100スピンドルにあるHDDの6 TBのスペヌス。 たたは、次のようなより銎染みのある圢匏で


alloc: cpu: 400 mem: 2500 lan_in: 50g lan_out: 50g hdd:100x6T 

ナヌザヌキャッシュサヌビスのリ゜ヌスは、運甚むンフラストラクチャで利甚可胜なすべおのリ゜ヌスのほんの䞀郚を消費したす。 したがっお、オペレヌタヌの゚ラヌが原因で突然、ナヌザヌキャッシュが割り圓おられたより倚くのリ゜ヌスを消費しないようにしたいず思いたす。 ぀たり、リ゜ヌスを制限する必芁がありたす。 しかし、なぜクォヌタを割り圓おるこずができたすか


非垞に単玔化されたコンポヌネントむンタラクションダむアグラムに戻り、次のように詳现を再描画したしょう。



あなたの目を匕くもの



もう䞀床絵を描き盎したしょう。



ああ はい、階局がありたす したがっお、リ゜ヌスをより倧きな郚分に分散できたす。機胜サブシステム図の「音楜」などに察応するこの階局のノヌドに責任のある開発者を割り圓お、同じ階局レベルにクォヌタを割り圓おたす。 このような階局により、管理を容易にするためにサヌビスをより柔軟に線成するこずもできたす。 たずえば、すべおのWebはサヌバヌの非垞に倧きなグルヌプ化であるため、図にgroup1、group2ずしお瀺されおいるいく぀かの小さなグルヌプに分割したす。


䜙分な行を削陀したので、画像の各ノヌドをよりフラットな圢匏で蚘述するこずができたす group1.web.front 、 api.music.front 、 user-cache.cache 。


そこで、「階局型キュヌ」の抂念に取り組みたす。 圌女の名前は「group1.web.front」です。 リ゜ヌスずナヌザヌ暩利のクォヌタが割り圓おられたす。 DevOpsの人にサヌビスをキュヌに送信する暩利を䞎えたす。そのような埓業員はキュヌで䜕かを実行でき、OpsDevの人-管理者暩限、そしお今、圌はキュヌを管理し、そこで人を指名し、これらの人に暩利を䞎えるこずができたす。このキュヌで起動されたサヌビスは、キュヌクォヌタの䞀郚ずしお実行されたす。 キュヌの蚈算クォヌタがすべおのサヌビスの同時実行に十分でない堎合、それらは順次実行されるため、キュヌ自䜓が圢成されたす。


サヌビスをより詳现に怜蚎しおください。 サヌビスには完党修食名があり、垞にキュヌ名が含たれたす。 その堎合、フロントWebサヌビスの名前はok-web.group1.web.frontになりたす。 そしお、圌が参照するアプリケヌションサヌバヌサヌビスはok-app.group1.web.frontず呌ばれたす。 各サヌビスには、特定のマシンに配眮するために必芁なすべおの情報が瀺されおいるマニフェストがありたすこのタスクが消費するリ゜ヌスの数、サヌビスに必芁な構成、レプリカの数、このサヌビスの障害を凊理するためのプロパティ。 そしお、サヌビスをマシンに盎接配眮するず、そのむンスタンスが衚瀺されたす。 たた、むンスタンス番号ずサヌビス名ずしお䞀意に名前が付けられたす 1.ok-web.group1.web.front、2.ok-web.group1.web.front、...


これは非垞に䟿利です。実行䞭のコンテナの名前だけを芋るず、すぐに倚くのこずがわかりたす。


次に、これらのむンスタンスが実際に行うこず、぀たりタスクに぀いお詳しく芋おいきたす。


タスク分離クラス


OKのすべおのタスクおよびおそらくどこでもはグルヌプに分割できたす。



そのようなタスクが、たずえば䞭倮凊理装眮のリ゜ヌスをどのように消費するかを芋おみたしょう。


短い遅延のあるタスク。 このようなタスクの堎合、CPU消費パタヌンは次のようになりたす。



ナヌザヌが凊理のリク゚ストを受信するず、タスクは䜿甚可胜なすべおのCPUコアの䜿甚を開始し、凊理し、応答を返し、次のリク゚ストを埅機し、コストをかけたす。 次のリク゚ストが届きたした-再び圌らはすべおを遞択し、蚈算し、次を埅っおいたす。


このようなタスクの最小遅延を保蚌するには、消費する最倧リ゜ヌスを取埗し、ミニオンタスクを実行するマシンで必芁な数のコアを予玄する必芁がありたす。 次に、タスクの予玄匏は次のようになりたす。


 alloc: cpu = 4 (max) 

16コアのミニオンマシンがある堎合、そのようなタスクを正確に4぀配眮できたす。 そのようなタスクの平均プロセッサ消費は非垞に䜎いこずが倚いこずを匷調したす。これは、タスクがリク゚ストを埅機しお䜕もしない時間のかなりの郚分を占めるためです。


決枈タスク。 それらはわずかに異なるパタヌンを持ちたす



このようなタスクのプロセッサリ゜ヌスの平均消費量は非垞に高くなりたす。 倚くの堎合、䞀定の時間内に蚈算タスクを完了する必芁があるため、蚱容時間内に蚈算を完了するために必芁な最小数のプロセッサヌを予玄する必芁がありたす。 圌女の予玄匏は次のようになりたす。


 alloc: cpu = [1,*) 

「少なくずも1぀の空きコアがあるミニオンに配眮しおください。そこにどれだけあるず、すべおが飲み蟌んでしたいたす。」


ここでは、䜿甚の効率はすでに、短い遅延のタスクよりもはるかに優れおいたす。 ただし、同じマシンミニオンで䞡方のタむプのタスクを組み合わせお、倖出先でそのリ゜ヌスを分散するず、ゲむンはさらに倧きくなりたす。 短い遅延のタスクにプロセッサが必芁な堎合-すぐにそれを受け取り、リ゜ヌスが䞍芁になった堎合-蚈算タスクに転送されたす。぀たり、次のようなものです。



しかし、それを行う方法は


最初に、prodずそのallocを芋おみたしょうcpu =4。4぀のコアを予玄する必芁がありたす。 Docker実行では、これは2぀の方法で実行できたす。



しかし、これらの方法のどれが適しおいたすか


かなりかわいいcpusetに芋えたす。 このタスクには4぀の専甚コアがありたす。぀たり、プロセッサキャッシュは可胜な限り効率的に動䜜したす。 これには裏返しもありたすOSの代わりにマシンのアンロヌドされたカヌネルに蚈算を分散するタスクを匕き受ける必芁がありたす。これは、特にそのようなマシンにバッチタスクを配眮しようずする堎合、かなり重芁なタスクです。 テストでは、クォヌタオプションの方が適しおいるこずが瀺されおいたす。オペレヌティングシステムは珟時点でタスクのカヌネルを遞択する自由床が高く、プロセッサ時間がより効率的に割り圓おられたす。


最小数のコアをdockerで予玄する方法を芋぀けたす。 最倧倀を制限する必芁はなく、最小倀を保蚌するのに十分であるため、バッチタスクのクォヌタは適甚されなくなりたした。 そしお、ここでdocker run --cpusharesオプションdocker run --cpushares 。


バッチで少なくずも1぀のコアの保蚌が必芁な堎合は--cpushares=1024を指定し、少なくずも2぀のカヌネルの堎合は--cpushares=2048指定するこずに--cpushares=2048 。 CPUシェアは、プロセッサ時間の割り圓おに十分であれば干枉したせん。 したがっお、prodが珟圚4぀のコアのすべおを䜿甚しおいない堎合、バッチタスクを制限するものはなく、远加のプロセッサ時間を䜿甚できたす。 しかし、プロセッサが䞍足しおいる状況で、prodが4぀のコアすべおを消費しおクォヌタに達した堎合、残りのプロセッサ時間はcpusharesに比䟋しお分割されたす。 cpushares。


ただし、クォヌタず共有を䜿甚するだけでは䞍十分です。 プロセッサ時間の割り圓おにおいお、バッチタスクよりも短い遅延のタスクを優先させる必芁がありたす。 このような優先順䜍付けがないず、バッチタスクは、prodが必芁な瞬間にすべおのプロセッサ時間を消費したす。 Dockerの実行にはコンテナの優先順䜍付けオプションはありたせんが、Linux CPUスケゞュヌラポリシヌが圹立ちたす。 それらに぀いおはこちらで読むこずができたすが、この蚘事の䞀郚ずしおそれらに぀いお簡単に説明したす。



 one.nio.os.Proc.sched_setscheduler( pid, Proc.SCHED_IDLE ) 

ただし、Javaでプログラミングしおいない堎合でも、chrtコマンドで同じこずができたす。


 chrt -i 0 $pid 

明確にするために、すべおの断熱レベルを1぀のプレヌトにたずめたしょう。


絶瞁クラス割り圓おの䟋Docker実行オプションsched_setscheduler chrt *
補品CPU = 4--cpuquota=400000 --cpuperiod=100000SCHED_OTHER
バッチCPU = [1、*--cpushares=1024SCHED_BATCH
アむドル状態CPU = [2、*--cpushares=2048SCHED_IDLE

*コンテナ内でchrtを実行する堎合、sys_nice機胜が必芁になる堎合がありたす。これは、デフォルトでは、Dockerがコンテナの起動時にこの機胜を無効にするためです。


しかし、タスクはプロセッサだけでなくトラフィックも消費したす。これは、ネットワヌクリ゜ヌスの遅延に、プロセッサリ゜ヌスの䞍適切な割り圓お以䞊に圱響を䞎えたす。 したがっお、トラフィックに぀いおはたったく同じ状況を取埗したいのです。 ぀たり、prod-taskがネットワヌクにパケットを送信するずき、prodがこれを実行できる最倧速床 alloclan = [*、500mbps を匕甚したす。 バッチの堎合、最小垯域幅のみを保蚌したすが、最倧垯域幅は制限したせん alloclan = [10Mbps、*匏この堎合、prodトラフィックはバッチタスクよりも優先されたす。
ここで、Dockerには䜿甚できるプリミティブがありたせん。 しかし、 Linux Traffic Controlは私たちの助けになりたす。 分野の階局的公正サヌビス曲線を䜿甚しお、望たしい結果を達成するこずができたした。 その助けにより、トラフィックの2぀のクラスを区別したす。高優先床の補品ず䜎優先床のバッチ/アむドルです。 その結果、発信トラフィックの構成は次のずおりです。



ここで10はhsfc分野の「ルヌトqdisc」です。 11-合蚈垯域幅制限が8 Gbit / sの子クラスhsfc。その䞋にすべおのコンテナの子クラスが配眮されたす。 12-すべおのバッチおよびアむドルタスクに共通の子クラスhsfcで、「動的」制限がありたす。 残りのhsfc子クラスは、珟圚動䜜しおいるprodコンテナ専甚のクラスであり、マニフェストに察応する制限がありたす-450および400 Mbit / s。 各hsfcクラスには、Linuxカヌネルのバヌゞョンに応じおfqたたはfq_codelに割り圓おられたqdiscキュヌがあり、トラフィックの急増時のパケット損倱を防ぎたす。


通垞、tc分野はアりトバりンドトラフィックのみを優先したす。 ただし、着信トラフィックにも優先順䜍を付ける必芁がありたす。結局、バッチタスクは、たずえばmapreduceの入力デヌタの倧きなパケットを受信しお​​、着信チャネル党䜓を簡単に遞択できたす。 これを行うには、 ifbモゞュヌルを䜿甚したす。このモゞュヌルは、各ネットワヌクむンタヌフェむスに仮想ifbXむンタヌフェむスを䜜成し、むンタヌフェむスからの着信トラフィックをifbXの発信トラフィックにリダむレクトしたす。 さらに、ifbXの堎合、発信トラフィックを制埡するために同じ分野がすべお機胜したす。hsfcの構成は非垞に䌌おいたす。



実隓の過皋で、非優先バッチ/アむドルトラフィックのクラス12がミニオンマシンで特定の空き垯域以䞋に制限されおいる堎合、hsfcが最良の結果を瀺すこずがわかりたした。 それ以倖の堎合、非優先トラフィックはprodタスクの遅延に倧きな圱響を䞎えたす。 フリヌバンドminiondの珟圚の倀は1秒ごずに決定され、このミニオンのすべおのprodタスクによる平均トラフィック消費量を枬定したす Tprodそしお、ネットワヌクむンタヌフェヌス垯域幅からそれを匕きたす Ceth小さなマヌゞンで、すなわち


Tbatch=Ceth− sumTprod\∗1.1


垯域は、着信トラフィックず発信トラフィックに察しお個別に決定されたす。 そしお、新しい倀に埓っお、miniondは非優先クラスの制限12を再構成したす。


したがっお、3぀の分離クラスprod、batch、およびidleをすべお実装したした。 これらのクラスは、タスクのパフォヌマンスに倧きく圱響したす。 したがっお、この機胜を階局の最䞊郚に配眮するこずにしたした。これにより、階局キュヌの名前を芋るず、凊理察象がすぐに明確になりたす。



その埌、おなじみのりェブず音楜の面はすべお、prodの䞋の階局に配眮されたす。 たずえば、バッチの䞋に、Odnoklassnikiにアップロヌドされた䞀連のmp3ファむルからトラックのカタログを定期的にコンパむルする音楜カタログサヌビスを配眮したしょう。 たた、アむドル状態のサヌビスの䟋は、 音楜の音量レベルを正芏化する音楜トランスフォヌマヌです。


䜙分な行を再床削陀したら 、サヌビスの名前をよりフラットに蚘述し、完党なサヌビス名の最埌にタスクの分離クラスを远加できたす web.front.prod 、 catalog.music.batch 、 transformer.music.idle 。


そしお今、サヌビスの名前を芋るず、サヌビスが実行する機胜だけでなく、その重芁性などを意味する分離クラスも理解しおいたす。


すべおが玠晎らしいですが、䞀぀の厳しい真実がありたす。 同じマシンで実行されおいるタスクを完党に分離するこずは䞍可胜です。


私たちが䜕ずか達成したのは、バッチがプロセッサリ゜ヌスのみを集䞭的に消費する堎合、組み蟌みのLinux CPUスケゞュヌラがその仕事を非垞にうたく行い、prodタスクに実質的に圱響がないこずです。 しかし、このバッチタスクがメモリでアクティブに動䜜し始めた堎合、盞互の圱響はすでに珟れおいたす。 これは、prodタスクがプロセッサのメモリキャッシュを「掗い流した」ためです。その結果、キャッシュの増加を芋逃し、プロセッサがprodタスクをよりゆっくりず凊理したす。 このようなバッチタスクにより、䞀般的なprodコンテナの遅延が10増加する可胜性がありたす。


最新のネットワヌクカヌドには内郚パケットキュヌがあるため、トラフィックの分離はさらに困難です。 バッチタスクからのパケットが最初に到着した堎合、それが最初であり、ケヌブルで送信され、䜕もする必芁はありたせん。


さらに、これたでのずころ、TCPトラフィックの優先順䜍付けのタスクのみを解決できたした。UDPの堎合、hsfcアプロヌチは機胜したせん。 たた、TCPトラフィックの堎合でも、バッチタスクで倧量のトラフィックが生成されるず、prodタスクの遅延が玄10増加したす。


耐障害性


ワンクラりドの開発における目暙の1぀は、Odnoklassnikiの回埩力を向䞊させるこずでした。 したがっお、さらに障害や事故の可胜性のあるシナリオをさらに詳しく調べたいず思いたす。 単玔なシナリオから始めたしょう-コンテナヌの障害。


コンテナ自䜓はいく぀かの方法で倱敗する堎合がありたす。 これは、ある皮の実隓、バグ、たたはマニフェストの゚ラヌである可胜性がありたす。そのため、prod-taskはマニフェストに瀺されおいるよりも倚くのリ゜ヌスを消費し始めたす。 開発者が1぀の耇雑なアルゎリズムを実装し、䜕床も䜜り盎し、自分自身を芆い隠しお混乱させたため、最終分析でタスクが非垞に重芁なルヌプになりたした。 たた、prodタスクは同じミニオンの他のすべおのタスクよりも優先床が高いため、䜿甚可胜なすべおのプロセッサリ゜ヌスを消費し始めたした。 この状況では、分離が保存されるか、プロセッサ時間のクォヌタが節玄されたす。 タスクにクォヌタが割り圓おられおいる堎合、タスクはそれ以䞊消費したせん。 したがっお、同じマシンで動䜜するバッチおよびその他のprodタスクは䜕も気付きたせんでした。


2番目の可胜性のある迷惑は、コンテナの萜䞋です。 そしお、ここで政治家が私たちを救っおくれたす、誰もが知っおいたす、Dockerは非垞にうたくやっおいたす。 ほずんどすべおのprodタスクには、垞に再起動ポリシヌがありたす。 バッチタスクやprodコンテナのデバッグにon_failureを䜿甚する堎合がありたす。


そしお、ミニオン党䜓にアクセスできない堎合、䜕ができたすか


明らかに、コンテナを別のマシンで実行したす。 ここで最も興味深いのは、コンテナに割り圓おられたIPアドレスがどうなるかです。


これらのコンテナが実行されるミニオンマシンず同じIPアドレスをコンテナに割り圓おるこずができたす。 次に、コンテナが別のマシンで起動するず、そのIPアドレスが倉曎され、すべおのクラむアントがコンテナが移動したこずを理解する必芁がありたす。今床は別のアドレスに移動する必芁がありたす。


サヌビス怜出は䟿利です。 サヌビスのレゞストリを敎理するためのさたざたな皋床のフォヌルトトレランスを備えた垂堎には倚くの゜リュヌションがありたす。 倚くの堎合、このような゜リュヌションでは、ロヌドバランサヌのロゞックが実装され、KVストアの圢匏で远加の構成が保存されたす。
ただし、個別のレゞストリを実装する必芁はありたせん。これは、本番環境のすべおのサヌビスで䜿甚される重芁なシステムの導入を意味するためです。 これは、これが朜圚的な障害点であり、非垞に耐障害性のある゜リュヌションを遞択たたは開発する必芁があるこずを意味したす。


もう1぀の倧きな欠点は、叀いむンフラストラクチャが新しいむンフラストラクチャず連動するために、䜕らかの皮類のサヌビスディスカバリシステムを䜿甚するためのすべおのタスクを完党に曞き盎す必芁があるこずです。 たくさんの䜜業があり、OSのカヌネルレベルたたはハヌドりェアで盎接動䜜する䜎レベルのデバむスに関しおは䞍可胜な堎合がありたす。 サむドカヌなどの十分に確立された決定パタヌンの助けを借りおこの機胜を実珟するず、堎所によっおは負荷が増え、堎所によっおは操䜜が耇雑になり、障害シナリオが増えたす。 耇雑にしたくなかったので、Service Discoveryの䜿甚をオプションにするこずにしたした。


one-cloud IP , . . IP-. «»: . — IP-, .


: production. IP- . , .


, IP- . , ( 1.ok-web.group1.web.front.prod, 2.ok-web.group1.web.front.prod, 
 ), , FQDN, DNS. , IP- DNS-. DNS IP- — , (, , — ). , , — , . , DNS, Service Discovery, , . , , , DNS, IP-.


IP — , , :



, one-cloud M1 1.ok-web.group1.web.front.prod 1.1.1.1. BIRD , route reflector . BGP- , 1.1.1.1 M1. M1 Linux. route reflector , one-cloud — one-cloud . , -, .


, one-cloud 1 . one-cloud , , 1 . 2 web.group1.web.front.prod 1.1.1.1. 1.1.1.1: 1 2. , Multi Exit Discriminator, BGP-. , . MED. one-cloud MED IP- . MED = 1 000 000. MED, 2 1.1.1.1 c MED = 999 999. , M1, , , .



- . — .


, , -.


-? , . , , , - 100 % .


. - , - , , .


?


, , . - , , . . , .


, .



, , , . . prod. — , . - , .


prod , 0; batch — , 100; idle — , 200. . . , prod , cache = 0 front = 1. , , , , music , — 10.


— . , , -, , . , , .



, batch-, . . , . . , . , , , . . .


, prod- batch- idle-, , idle , 200. , , , . , , , -, : 10.



-? . , - . , - , - . : , - . - . , - — . .


, # .


— . one-cloud -. - — -. : , -. .
-, , one-cloud.


, .


? - , , , . , - — , .



たずめ


one-cloud:




.



, , , , . — , .


, , — !



Source: https://habr.com/ru/post/J346868/


All Articles