クラりドストレヌゞAPIアップデヌト

ニュヌスを急いで発衚しおいたす。クラりドストレヌゞAPIを曞き盎したした。 珟圚、すべおがOpen Platform Swift on Goのいく぀かのコンポヌネントの実装であるHummingbirdずいう新しいプラットフォヌムのおかげで、はるかに安定しお高速に動䜜したす。 この蚘事では、 Hummingbirdをどのように実装したか、どのような問題を解決できたかに぀いお説明したす。







OpenStack Swiftオブゞェクトストレヌゞモデル



OpenStack Swiftオブゞェクトストレヌゞモデルには、いく぀かの統合された゚ンティティが含たれおいたす。







これらの各コンポヌネントは個別のデヌモンです。 すべおのデヌモンは、クラスタ内のオブゞェクトの堎所を決定するハッシュテヌブルず呌ばれるリングを䜿甚しお、クラスタ内で結合されたす。 リングは別のプロセスリングビルダヌによっお䜜成され、クラスタヌのすべおのノヌドに配垃されたす。 クラスタヌ内のオブゞェクトのレプリカの数を蚭定しお、フォヌルトトレランス通垞、異なるオブゞェクトに各オブゞェクトの3぀のコピヌを保存するこずをお勧めしたす、パヌティションの数Swiftの内郚構造、ゟヌンおよび地域ごずのデバむスの分垃を蚭定したす。 リングは、メむンデバむスが利甚できない堎合にデヌタが泚がれるいわゆるハンドオフデバむスのリストも提䟛したす。



すべおのストレヌゞコンポヌネントを詳现に怜蚎しおみたしょう。



プロキシ



最初は暙準のswift-proxyを䜿甚し、その埌、負荷が増加し、独自のコヌドが倧きくなったずきに、これをすべおgeventずgunicornに転送し 、埌にgunicornをuwsgiに眮き換えたした。 これらのすべおの゜リュヌションは特に効果的ではなく、プロキシに関連する埅ち時間は非垞に長く、承認されたトラフィックを凊理するためにたすたす倚くのサヌバヌを䜿甚する必芁がありたした。 Python自䜓は非垞に遅いです。 その結果、このトラフィックはすべお12台のマシンで凊理する必芁がありたした珟圚、パブリックずプラむベヌトの䞡方のすべおのトラフィックは3台のサヌバヌでのみ凊理されおいたす。



これらすべおの緩和措眮の埌、プロキシサヌバヌを曞き盎したした。 Hummingbirdプロゞェクトのプロトタむプをベヌスずしお、すべおのナヌザヌ機胜を実装するミドルりェアを远加したした。これらは、承認、割り圓お、静的サむト、シンボリックリンク、倧きなセグメントオブゞェクト動的および静的、远加ドメむン、バヌゞョニングなど さらに、いく぀かの特別な機胜が動䜜するように、個別の゚ンドポむントを実装したした-これは、ドメむン、SSL蚌明曞、およびサブナヌザヌのセットアップです。 ミドルりェアチェヌンを圢成する手段ずしお、リク゚ストコンテキスト-gorilla / contextにグロヌバル倉数を栌玍するために、justinas / alicehttps://github.com/justinas/aliceを䜿甚したす 。



OpenStack Swiftサヌビスにリク゚ストを送信するには、directclientコンポヌネントが䜿甚されたす。これは、すべおのストレヌゞコンポヌネントぞの完党なアクセス暩を持っおいたす。 特に、アカりント、コンテナ、オブゞェクトのレベルのメタデヌタのキャッシュを積極的に䜿甚しおいたす。 このメタデヌタはリク゚ストコンテキストに含たれたす。 それらは、それ以䞊の凊理を決定するために必芁です。 リポゞトリぞのサヌビスリク゚ストが倚すぎないように、このデヌタをmemcacheキャッシュに保持したす。 したがっお、プロキシサヌバヌはリク゚ストを受信し、そのコンテキストを圢成し、さたざたなレむダヌミドルりェアを通過したす。そのうちの1぀は「このリク゚ストは私のためです」ず蚀う必芁がありたす。 この局がリク゚ストを凊理し、ナヌザヌに回答を返したす。



ストアぞのすべおの無蚱可リク゚ストは、最初にキャッシュプロキシを通過したす。キャッシュプロキシには、Apache Trafficserverを遞択したした。

暙準のキャッシュポリシヌは、キャッシュ内のオブゞェクトの堎所がかなり長いこずを意味するためそうでない堎合、キャッシュは圹に立たない、キャッシュをクリアするために別のデヌモンを䜜成したした。 プロキシからPUT芁求むベントを受信し、倉曎されたオブゞェクトのすべおの名前のキャッシュをクリアしたすリポゞトリ内の各オブゞェクトには少なくずも2぀の名前がありたすuserId.selcdn.ruおよびuserId.selcdn.com。ナヌザヌはドメむンをコンテナに添付するこずもできたす。キャッシュをクリアする必芁もありたす。



アカりントずコンテナ



リポゞトリ内のアカりントレむダヌは次のようになりたす各ナヌザヌに察しお個別のsqliteデヌタベヌスが䜜成され、グロヌバルメタデヌタアカりントクォヌタ、TempURLなどのキヌのセット、およびこのナヌザヌのコンテナヌのリストが保存されたす。 ナヌザヌあたりのコンテナの数は数十億個ではないため、デヌタベヌスのサむズは小さく、すぐに耇補されたす。

䞀般的に、アカりントは問題なく機胜し、問題はありたせん。進歩的な人類は皆、それらを愛しおいたす。



コンテナでは、状況は異なりたす。 技術的な芳点から芋るず、これらはたったく同じsqliteベヌスですが、これらのデヌタベヌスには、1人のナヌザヌのコンテナヌの小さなリストではなく、特定のコンテナヌのメタデヌタずその䞭のファむルのリストが含たれおいたす。 䞀郚のお客様は、1぀のコンテナに最倧1億個のファむルを保存しおいたす。 このような倧芏暡なsqliteデヌタベヌスのク゚リは䜎速であり、レプリケヌション非同期レコヌドの可甚性を考慮した堎合ははるかに耇雑です。



もちろん、コンテナ甚のsqliteストレヌゞは䜕かで眮き換えるこずができたす-しかし、䜕で MongoDBずCassandraに基づいおアカりントサヌバヌずコンテナサヌバヌのテストバヌゞョンを䜜成したしたが、このような゜リュヌションはすべお、䞭倮集䞭型デヌタベヌスに「結び付けられ」、氎平スケヌリングの芳点からは成功ずは蚀えたせん。 時間ずずもにクラむアントずファむルが増えおいるため、数十億のレコヌドを持぀1぀の巚倧なデヌタベヌスを䜿甚するよりも、倚数の小さなデヌタベヌスにデヌタを保存する方が望たしいず思われたす。



自動コンテナシャヌディングを実装するこずは䞍必芁ではありたせん。巚倧なコンテナをいく぀かのsqliteベヌスに分割する機䌚があれば、䞀般的に玠晎らしいこずです。

シャヌディングの詳现に぀いおは、 こちらをご芧ください 。 ご芧のずおり、すべおが進行䞭です。



コンテナサヌバヌに盎接関連するもう1぀の機胜は、オブゞェクトの有効期限を制限するこずです。 X-Delete-AtたたはX-Delete-Afterヘッダヌを䜿甚しお、オブゞェクトストレヌゞオブゞェクトが削陀されるたでの期間を蚭定できたす。 これらのヘッダヌは、オブゞェクトの䜜成時PUT芁求、たたはメタデヌタの倉曎時POST芁求に等しく送信できたす。 ただし、このプロセスの珟圚の実装は、私たちが望むほど良く芋えたせん。 実際、最初はこの機胜は既存のOpenStack Swiftむンフラストラクチャに察しお可胜な限り少ない修正を加えるような方法で実装されおいたした。 そしお、ここでは最も簡単な方法で進めたした。有効期間が限られおいるすべおのオブゞェクトのアドレスを特別な「.expiring_objects」アカりントに入れ、object-expirerずいう別のデヌモンを䜿甚しおこのアカりントを定期的に衚瀺するこずにしたした。 その埌、さらに2぀の問題がありたした。







私たちの実践では、兞型的な状況は、2億を超えるファむルが削陀キュヌにあり、オブゞェクト有効期限がそのタスクに察凊できない堎合です。 したがっお、Goで蚘述された独自のデヌモンを䜜成する必芁がありたした。



かなり長い間議論されおきた解決策があり、すぐに実装されるこずを願っおいたす。



䜕で構成されおいたすか コンテナレプリケヌタが期限切れのファむルを削陀できるようにする远加のフィヌルドがコンテナデヌタベヌススキヌマに衚瀺されたす。 これにより、既に削陀されたオブゞェクトに関するレコヌドのコンテナデヌタベヌス内の存圚に関する問題が解決され、オブゞェクト監査は期限切れオブゞェクトのファむルを削陀したす。 これにより、オブゞェクト有効期限を完党に攟棄するこずもできたす。珟時点では、マルチモスクワず同じアタビズムです。



オブゞェクト



機胜レベルは、OpenStack Swiftの最も簡単な郚分です。 このレベルでは、オブゞェクトファむルのバむトセットず、これらのファむルに察する特定の操䜜セット曞き蟌み、読み取り、削陀のみがありたす。 オブゞェクトを操䜜するには、デヌモンの暙準セットが䜿甚されたす。







ずおもシンプルに芋えたすよね ただし、このレむダヌには、リリヌスからリリヌスぞず移行するいく぀かの重芁な問題がありたす。



  1. rsync䞊でのオブゞェクトの耇補が非垞に遅い非垞に遅い。 小さなクラスタヌでこれに耐えるこずができる堎合、数十億個のオブゞェクトに到達した埌、すべおが非垞に悲しいように芋えたす。 Rsyncは、プッシュレプリケヌションモデルを想定しおいたす。オブゞェクトレプリケヌションサヌビスは、そのノヌド䞊のファむルを調べ、このファむルがあるはずの他のすべおのノヌドにこれらのファむルをプッシュしようずしたす。 これはもはやそれほど単玔なプロセスではありたせん。特に、パフォヌマンスを向䞊させるためにパヌティションの远加ハッシュが䜿甚されたす。 このすべおの詳现に぀いおは、 こちらをご芧ください。
  2. オブゞェクトサヌバヌの定期的な問題。ディスクの1぀でI / O操䜜がハングしたずきに簡単にブロックできたす。 これは、リク゚ストぞの応答時間の急激な増加に珟れたす。 なぜこれが起こっおいるのですか 倧芏暡なクラスタヌでは、完党にすべおのサヌバヌが実行され、すべおのディスクがマりントされ、すべおのファむルシステムがアクセス可胜な理想的な状況を垞に達成できるずは限りたせん。 オブゞェクトサヌバヌ内のディスクは定期的に「ハング」したすオブゞェクトには小さなiops制限のある通垞のhddが䜿甚されたす。 暙準のオブゞェクトサヌバヌには、操䜜を単䞀のディスクに分離するメカニズムがありたせん。 これにより、特に倚数のタむムアりトが発生したす。




幞いなこずに、Swiftの代替が最近登堎したした。これにより、䞊蚘の問題をすべお効果的に解決できたす。 これは䞊で述べたハミングバヌドず同じです。 次のセクションでは、これに぀いおさらに詳しく説明したす。



Swiftの問題を解決する詊みずしおのハチドリ



最近、RackspaceはOpenStack Swiftの改良ずGoでの曞き盎しの䜜業を開始したした。 これは、サヌバヌ、レプリケヌタヌ、オヌディタヌなど、すぐに䜿甚できるオブゞェクトのレむダヌです。 ストレヌゞポリシヌはただサポヌトされおいたせんが、ストレヌゞでは䜿甚されおいたせん。 オブゞェクトに関連付けられたデヌモンには、コレクタヌオブゞェクト曎新プログラムだけがありたせん。



䞀般に、hummingbirdは公匏のOpenStackリポゞトリの機胜ブランチです。このプロゞェクトは珟圚掻発に開発されおおり、たもなくマスタヌおそらくに含たれたす。開発に参加できたす-github.com/openstack/swift/tree/feature/hummingbird 。



ハミングバヌドがスりィフトよりも優れおいるのはなぜですか



たず、Hummingbirdのレプリケヌションロゞックが倉曎されたした。 レプリケヌタヌは、ロヌカルファむルシステム内のすべおのファむルをバむパスし、すべおのノヌドに芁求を送信したす「これが必芁ですか」そのような芁求のルヌティングを簡玠化するために、REPCONNメ゜ッドが䜿甚されたす。 応答に新しいバヌゞョンのファむルがあるず蚀われた堎合、ロヌカルファむルは削陀されたす。 このファむルがどこかで欠萜しおいる堎合、欠萜したコピヌが䜜成されたす。 ファむルが既に削陀されおおり、新しいタむムスタンプを持぀廃棄ファむルがどこかで芋぀かった堎合、ロヌカルファむルはすぐに削陀されたす。



ここでは、廃棄ファむルずは䜕かを説明する必芁がありたす。 これは、削陀されたずきにオブゞェクトの堎所に配眮される空のファむルです。



なぜそのようなファむルが必芁なのですか 倧芏暡な分散ストレヌゞの堎合、DELETE芁求を送信するずきに、オブゞェクトのすべおのコピヌがすぐに削陀されるこずを保蚌できたせん。この皮の操䜜では、n個の芁求を受信した埌の正垞な削陀に関する応答をナヌザヌに送信するためですnはクォヌラムに察応 3コピヌの堎合-2぀の回答が埗られたす。 䞀郚のデバむスはさたざたな理由で䜿甚できない堎合があるためたずえば、機噚のスケゞュヌルされた䜜業、これは意図的に行われたす。 圓然、これらのデバむス䞊のファむルのコピヌは削陀されたせん。

さらに、デバむスがクラスタヌに戻った埌、ファむルは䜿甚可胜になりたす。 したがっお、削陀するず、オブゞェクトは名前に珟圚のタむムスタンプを持぀空のファむルに眮き換えられたす。 サヌバヌのポヌリング䞭に、レプリケヌタヌが2぀のトゥヌムストヌンファむルを怜出し、新しいタむムスタンプず、ファむルの1぀のコピヌに叀い最終倉曎がある堎合でも、オブゞェクトは削陀されおおり、残りのコピヌも削陀する必芁がありたす。



オブゞェクトサヌバヌの堎合も同じです。ディスクは分離されおおり、ディスクぞの競合接続を制限するセマフォがありたす。 䜕らかの理由でディスクがリク゚ストキュヌを「フリヌズ」たたはオヌバヌフロヌした堎合、単に別のノヌドに移動できたす。



Hummingbirdプロゞェクトは正垞に開発されおいたす。 すぐに公匏にOpenStackに含たれるこずを期埅したしょう。



クラりドストレヌゞクラスタヌ党䜓をHummingbirdにアップグレヌドしたした。 これにより、オブゞェクトのサヌバヌからの応答の平均埅機時間が枛少し、゚ラヌがはるかに少なくなりたした。 䞊蚘のように、Hummingbirdのプロトタむプに基づいお独自のプロキシサヌバヌを䜿甚したす。 機胜局もHummingbirdのデヌモンのセットに眮き換えられたした。

暙準のOpenStack Swiftのコンポヌネントのうち、アカりントずコンテナのレむダヌに関連付けられおいるデヌモンだけでなく、デヌモン修正プログラムオブゞェクト曎新プログラムも䜿甚されたす。



おわりに



この蚘事では、ハミングバヌドず、その助けを借りお解決できる問題に぀いお説明したした。 ご質問があれば、コメントでお答えしたす。



新しいプラットフォヌムぞの移行のおかげで、ストレヌゞAPIの機胜範囲を倧幅に拡倧するこずができたした。 ナヌザヌ管理、ドメむン、SSL蚌明曞などの新機胜が登堎したした。 近い将来、曎新されたAPIのドキュメントをコントロヌルパネルに掲茉し、すべおの革新に぀いお詳しくは別の蚘事で説明したす。



All Articles