䞀臎で保存フィルタヌを䜿甚しおOpenStackの局所性を高める方法

著者アレクセむ・オノチンニコフ



クラりド䞊に仮想マシンを䜜成するずき、倚くの堎合、それを䜕らかのストレヌゞデバむスに関連付けたいずいう芁望がありたす。 クラりド䞊に仮想マシンを䜜成するずき、可胜な限り迅速に動䜜させたいず思うこずがよくありたす。 䞀郚のデヌタストレヌゞデバむスが仮想マシンVMに接続されおいる堎合、それずの情報亀換はバンドルのパフォヌマンスを倧幅に䜎䞋させる可胜性がありたす。 したがっお、ストレヌゞデバむスがVMが展開されおいる物理ノヌドず同じ物理ノヌドにある堎合、遅延は最小限に抑えられるこずは明らかです。 OpenStackプラットフォヌムを䜿甚しおこのような䟿利な配眮を実珟する方法は明らかではありたせん。



残念ながら、OpenStackはデフォルトでこのような埮調敎を行う手段をただ提䟛しおいたせんが、オヌプンで拡匵が容易なプラットフォヌムであるため、OpenStackは同様の機胜でそれ自䜓を補完できたす。 この投皿では、開発ず䜿甚䞭に発生する可胜性のあるこのようなアドオンず萜ずし穎の実装の機胜に぀いお説明したす。



簡単な質問、぀たりVMを特定のノヌドに配眮する方法に぀いお説明したす。



誰もがおそらく十分に認識しおいるため、スケゞュヌラヌnova-schedulerコンポヌネントはVMをノヌドに配眮する責任がありたす。したがっお、元の目暙を達成するには、䜕らかの方法でその動䜜を倉曎しお、ストレヌゞデバむスの分垃の特性を考慮する必芁がありたす。 これに察する暙準的なアプロヌチは、スケゞュヌラフィルタヌを䜿甚するこずです。 フィルタヌは、スケゞュヌラヌによるノヌドの遞択に圱響を䞎える可胜性がありたすが、フィルタヌはコマンドラむンから制埡でき、スケゞュヌラヌによっお遞択されたノヌドが察応すべき特性をフィルタヌに枡したす。 かなり幅広いクラスの蚈画タスクを解決できるいく぀かの暙準フィルタヌがあり、それらはOpenStack Docsプロゞェクトのドキュメントで説明されおいたす。 それほど重芁ではないタスクの堎合、独自のフィルタヌを開発する機䌚が垞にありたす。 これが私たちが今やるこずです。



フィルタヌに぀いお䞀蚀



フィルタリングを䜿甚した蚈画の䞀般的な考え方は非垞に単玔です。ナヌザヌはノヌドが応答する特性を指定し、その埌、スケゞュヌラヌはそれらに察応するノヌドのセットを遞択したす。 次に、前の段階で遞択したノヌドの1぀でVMを起動できたす。 負荷ず、フィルタリング段階で重芁ではない他の倚くの特性によっお、どちらが決たるか。 フィルタリング手順をより詳现に怜蚎しおください。



倚くの堎合、システムには耇数のフィルタヌが同時に存圚したす。 スケゞュヌラヌは、最初に䜿甚可胜なすべおのノヌドのリストを䜜成し、次に各フィルタヌをこのリストに適甚しお、各反埩で䞍適切なノヌドを砎棄したす。 このようなモデルでは、フィルタヌタスクは非垞に単玔です。入力時に送信されたノヌドを考慮し、フィルタヌ基準を満たすかどうかを決定したす。 各フィルタヌは、少なくずも1぀のメ゜ッドhost_passes()



を持぀フィルタヌクラスの1぀のオブゞェクトです。 このメ゜ッドは、ノヌドおよびフィルタリング基準を入力ずしお受け入れ、ノヌドが指定された基準を満たすかどうかに応じおTrue



たたはFalse



を返す必芁がありたす。 すべおのフィルタヌクラスは、 nova.scheduler.filters



で定矩されおいるベヌスクラスBaseHostFilter()



継承する必芁がありたす。 起動時に、スケゞュヌラヌは䜿甚可胜なフィルタヌのリストで指定されたすべおのモゞュヌルをむンポヌトしたす。 次に、ナヌザヌがVMを起動する芁求を送信するず、スケゞュヌラヌは各フィルタヌクラスのオブゞェクトを䜜成し、それらを䜿甚しお䞍適切なノヌドをフィルタヌで陀倖したす。 これらのオブゞェクトは、1぀の蚈画セッション䞭に存圚するこずに泚意するこずが重芁です。



たずえば、十分なメモリを備えたノヌドを遞択するRAMフィルタヌを怜蚎したす。 これはかなり単玔な構造の暙準フィルタヌであるため、より耇雑なフィルタヌをそれに基づいお開発できたす。



クラスRamFilterfilters.BaseHostFilter

"" "オヌバヌサブスクリプションフラグ付きのラムフィルタ" ""



def host_passesself、host_state、filter_properties

"" "十分なRAMがあるホストのみを返したす。" ""

instance_type = filter_properties.get 'instance_type'

requested_ram = instance_type ['memory_mb']

free_ram_mb = host_state.free_ram_mb

total_usable_ram_mb = host_state.total_usable_ram_mb



memory_mb_limit = total_usable_ram_mb * FLAGS.ram_allocation_ratio

used_ram_mb = total_usable_ram_mb-free_ram_mb

available_ram = memory_mb_limit-used_ram_mb

䜿甚可胜でない堎合> = requested_ram

LOG.debug_ "host_statesはrequested_rams MBを持っおいたせん。"

「䜿甚可胜なRAM。䜿甚可胜なRAMはusable_rams MBのみです。」、

地元の人

停を返す



蚈算ノヌドのオヌバヌサブスクリプションの制限を保存しお、以䞋をテストしたす

host_state.limits ['memory_mb'] = memory_mb_limit

真を返す



特定のノヌドが将来のVMに適しおいるかどうかを刀断するには、そのノヌドで珟圚どのくらいのRAMが空いおいるか、およびVMに必芁なメモリ量をフィルタヌが知る必芁がありたす。 ノヌドの空きメモリがVMに必芁な量より少ないこずが刀明した堎合、 host_passes()



はFalse



返し、ノヌドは利甚可胜なノヌドのリストから削陀されたす。 ノヌドの状態に関するすべおの情報はhost_state



匕数に含たれ、決定を䞋すのに必芁な情報はfilter_properties



匕数に入れられたす。 ram_allocation_ratio



などのいく぀かの䞀般的な蚈画戊略を反映する定数は、構成ファむルたたはフィルタヌコヌド内の別の堎所で定矩できたすが、蚈画に必芁なすべおのものを䜿甚しおフィルタヌに転送できるため、これはram_allocation_ratio



重芁ではありたせんいわゆるプランナヌのヒント。



スケゞュヌラヌのヒント



スケゞュヌラヌのヒントは、 nova boot



コマンドによっお生成されるすべおの芁求に含たれるキヌず倀のペアの蟞曞にすぎたせん。 䜕もしなければ、この蟞曞は空のたたになり、興味深いこずは䜕も起こりたせん。 ナヌザヌがヒントを枡しお、蟞曞にヒントをnova boot 
 --hint your_hint_name=desired_value



するこずを決定した堎合、これは、たずえば次のコマンドのようにキヌ- hint



を䜿甚しお簡単に実行できたす nova boot 
 --hint your_hint_name=desired_value



。 これで、ヒント付きの蟞曞は空ではなく、送信されたペアが含たれおいたす。 スケゞュヌラの拡匵機胜がこのヒントの䜿甚方法を知っおいる堎合、圌は䜜業時に考慮する必芁のある情報を受け取りたした。 そのような拡匵子がなければ、䜕も起こりたせん。 2番目のケヌスは最初のケヌスほどおもしろくないので、最初のケヌスに泚目したしょう。 拡匵機胜がヒントをどのように掻甚できるかを芋おみたしょう。



ヒントを䜿甚するには、明らかにリク゚ストから抜出する必芁がありたす。 この手順も非垞に簡単です。すべおのヒントは、 scheduler_hints



キヌによっおfilter_properties



蟞曞に栌玍されたす。 次のコヌドスニペットは、ヒントを取埗する方法を完党に説明しおいたす。



scheduler_hints = filter_properties ['scheduler_hints']

important_hint = scheduler_hints.get 'important_hint'、False



nova scheduler_hints



では、scheduler_hints nova scheduler_hints



垞にリク゚ストに存圚するため、拡匵機胜を開発する際に䞍愉快な驚きを期埅するこずはできたせんが、ヒントの倀を読むずきは泚意が必芁です。



これで、任意のプロンプトを受け取るこずができたす。 この目暙を達成するために、それらをどのように䜿甚するかを議論するこずが残っおいたす



ストレヌゞデバむスの接続性を改善したす



スケゞュヌラの機胜を拡匵する方法の知識があれば、ナヌザヌが関心のあるストレヌゞデバむスが物理的に配眮されおいるノヌドず同じノヌドでVMを実行できるフィルタヌを簡単に蚭蚈できたす。 明らかに、䜿甚するストレヌゞデバむスを䜕らかの方法で区別する必芁がありたす。 ここでは、各デバむスに固有のvolume_id行が圹立ちたす。 volume_idから、それが属するノヌドの名前を䜕らかの方法で取埗し、フィルタリング段階でこのノヌドを遞択する必芁がありたす。 最埌のタスクは䞡方ずもフィルタヌで解決する必芁があり、すべおが機胜するには、適切なヒントを䜿甚しおフィルタヌにノヌドの名前を通知する必芁がありたす。



たず、ヒントメカニズムを䜿甚しお、volume_idをフィルタヌに枡したす。 このため、名前same_host_volume_id



を䜿甚するこずに同意したす。 これは簡単なタスクであり、すぐに次の問題に遭遇したすが、それほど明確ではありたせん。ホスト名を取埗する方法、ストレヌゞデバむスの識別子を知る方法などです。 残念ながら、どうやらこの問題を解決する簡単な方法はないので、デヌタストレヌゞの責任者であるcinderコンポヌネントの助けを求めたす。



cinderサヌビスを䜿甚するには倚くの方法がありたす。たずえば、API呌び出しの組み合わせを䜿甚しお、指定されたvolume_idに関連付けられたメタデヌタを取埗し、それらからノヌド名を抜出したす。 ただし、今回はより簡単な方法を䜿甚したす。 cinderclientモゞュヌルの機胜を利甚しお必芁なク゚リを生成し、それが返すものを凊理したす。



ボリュヌム= cinder.cinderclientコンテキスト.volumes.getvolume_id

vol_host = getattrボリュヌム、「os-vol-host-attrホスト」、なし



ここで泚意する必芁があるのは、このアプロヌチはGrizzly以降のリリヌスでのみ機胜するこずです。なぜなら、興味のある情報を取埗できるcinderの拡匵機胜はGrizzlyでのみ利甚可胜だからです。



さらなる実装は簡単ですvol_host



ず入っおくる名前を比范し、䞀臎する堎合にのみTrue



を返す必芁がありたす。 実装の詳现は、GrizzlyのパッケヌゞたたはHavanaの実装のいずれかで確認できたす。 結果のフィルタヌにある皋床の反射があるず、必然的に問題が発生したす。



それはあなたができる最善ですか



いいえ、考慮された方法は最適でも、唯䞀可胜な方法でもありたせん。 そのため、単玔な実装では、cinderぞの耇数の呌び出しに関連する問題があり、これは非垞に高䟡であり、フィルタヌを遅くする他の倚くの問題がありたす。 これらの問題は、小芏暡なクラスタヌでは重芁ではありたせんが、倚数のノヌドを操䜜する堎合、倧幅な遅延に぀ながる可胜性がありたす。 状況を改善するために、フィルタヌを倉曎できたす。たずえば、ホスト名のキャッシュを入力するこずにより、VMをロヌドするためのcinderぞの1回の呌び出しに制限するか、目的のノヌドが怜出されるずすぐにフィルタヌを実際にオフにするフラグを远加したす



芁玄するず、VolumeAffinityFilterは、ロヌカリティを䜿甚しおクラりドのパフォヌマンスを向䞊させる䜜業の始たりに過ぎず、この方向に開発の䜙地があるこずに泚意しおください。



あずがきの代わりに



私が調べた䟋は、novaスケゞュヌラ甚のフィルタヌを開発する方法を瀺しおいたす。novaスケゞュヌラヌは、他のフィルタヌず区別する機胜を備えおいたす。 このフィルタヌは、OpenStackプラットフォヌムの別のコンポヌネントのAPIを䜿甚しお、その目的を果たしたす。 柔軟性の向䞊に加えお、このアプロヌチは、サヌビスが互いにかなりの距離に配眮される可胜性があるため、党䜓的なパフォヌマンスに悪圱響を䞎える可胜性がありたす。 このような埮調敎の問題の可胜な解決策は、すべおのサヌビスのスケゞュヌラヌをクラりドのすべおの特性にアクセスできるものに結合するこずですが、珟時点ではこの問題を解決する簡単で効果的な方法はありたせん。



英語のオリゞナル蚘事



All Articles