OpenStack Swiftを䜿甚したクラりドストレヌゞ甚のマルチリヌゞョンクラスタヌの構成

著者オレグ・ゲルブフ



昚秋、SwiftStackチヌムは、耇数地域のOpenStack Object Storageクラスタヌプロゞェクトコヌド名はSwiftを䜜成するアプロヌチの興味深い抂芁を投皿したした。 このアプロヌチは、地理的に分散したSwiftクラスタヌレむアりトに適しおいたす。レプリカの数を枛らしたずえば、3 + 3ではなく3 + 1、Webexずほが同時に䜜業したした。 私たちのアプロヌチを簡単に説明し、実装蚈画ずSwiftコヌドの倉曎案に焊点を圓おたいず思いたす。



OpenStack Swiftの珟状



たず、珟圚のSwiftアルゎリズムの簡単な抂芁から始めお、地理的に離れた耇数の地域からクラスタヌを䜜成するために正確に実行する必芁があるこずを説明したす。



指茪


Swiftクラスタヌの暙準リングリングたたはハッシュリングは、ストレヌゞデバむスをゟヌンに分離できるデヌタ構造です。 Essexリリヌスに含たれるswift-ring-builderスクリプトは、オブゞェクトのレプリカが同じゟヌンに萜ちないようにしたす。



リング構造には、次のコンポヌネントが含たれたす。

- デバむスリスト リングが認識しおいるすべおのストレヌゞデバむスディスクが含たれたす。 このリストの各芁玠は、デバむス識別子、そのシンボル名、ゟヌン識別子、ストレヌゞデバむスがむンストヌルされおいるデヌタストレヌゞノヌドのIPアドレス、ネットワヌクポヌト、重み、メタデヌタを含む蟞曞です。

- パヌティション分散テヌブル レプリカの数ず同じ行数を持぀2次元配列。 配列の各セルには、列むンデックスに察応するセクションのレプリカが配眮されおいるデバむスのリストデバむスのリストからが含たれおいたす...

- パヌティション領域番号オブゞェクト/ account / container / objecぞのパスからのMD5チェックサムのビット数。MD5ハッシュのスペヌス党䜓をパヌティションに分割するこずを決定したす。



フォルサムバヌゞョンでは、リングファむル圢匏が倉曎されたした。 これらの倉曎により、凊理効率が倧幅に向䞊し、リングバランシングアルゎリズムが再定矩されたす。 異なるゟヌン間でレプリカを配垃する必芁がある厳密な条件は、ゟヌン、ノヌド、およびデバむスをレむダヌに線成するはるかに柔軟なアルゎリズムに眮き換えられたした。



リングバランサヌは、レプリカをできるだけ遠くに配眮しようずしたす。 できれば異なるゟヌンで䜿甚しおください。ただし、1぀のゟヌンしか䜿甚できない堎合は、異なるノヌドで䜿甚しおください。 たた、䜿甚可胜なノヌドが1぀だけの堎合は、ノヌド䞊のさたざたなデバむスに察しお䜿甚できたす。 「最倧分散」の原理で動䜜するこのアルゎリズムは、地理的に分散したクラスタヌをサポヌトする可胜性がありたす。 これは、地域レベルの図を䞊郚に远加するこずで実珟できたす。 リヌゞョンは、ラックたたはデヌタセンタヌ党䜓のいずれかである、1぀の堎所を持぀ゟヌンのグルヌプです。



私たちの提案では、地域はdevsデバむス蟞曞の同じフィヌルド地域で定矩されおいたす。



プロキシサヌバヌ


プロキシサヌバヌは、クラむアントにパブリックSwift APIを提䟛し、PUT芁求での曞き蟌みやGET芁求での読み取りなど、オブゞェクト、コンテナヌ、およびアカりントで基本的な操䜜を実行したす。

PUT芁求を凊理する堎合、プロキシサヌバヌは次のアルゎリズムに埓いたす。



1.オブゞェクトぞのパスのMD5チェックサムを、圢匏/アカりント[/コンテナ[/オブゞェクト]]で蚈算したす。



2. MD5チェックサムの最初のNビットずしおパヌティション番号を蚈算したす。



3.蚈算されたパヌティションのレプリカが保存されおいるパヌティション配垃テヌブルからデバむスを遞択したす。



4.手順3で芋぀かったすべおのデバむスのデバむスのリストから、デヌタストレヌゞノヌドのIPアドレスずポヌトを遞択したす。



5.察応するポヌト䞊のすべおのノヌドぞの接続を確立しようずしたす。少なくずも半分のノヌドに接続できない堎合、PUT芁求を拒吊したす。



6.接続が確立されたすべおのノヌドでオブゞェクトのダりンロヌドたたはアカりントたたはコンテナの䜜成を詊みたす。 少なくずも半分のダりンロヌドがキャンセルされた堎合、PUTリク゚ストは拒吊されたす。



7.デヌタがN / 2 + 1ノヌドNはステップ4で芋぀かったノヌドの数にアップロヌドされるず、PUTリク゚ストが成功したこずの確認をクラむアントに送信したす。



GET芁求を凊理する堎合、プロキシサヌバヌは䞀般に次のアルゎリズムを実行したす。



1. PUT芁求凊理アルゎリズムのステップ1〜4を繰り返し、オブゞェクトのレプリカを保存するノヌドのリストを決定したす。



2.シャッフル機胜を䜿甚しおノヌドのリストをシャッフルし、結果のリストの最初に接続したす。



3.接続を確立できない堎合は、リストから次のノヌドに進みたす。



4.接続が確立されるず、芁求ぞの応答ずしおクラむアントぞのデヌタ送信が開始されたす。



耇補


Swiftのレプリケヌションは、個々のオブゞェクトではなくパヌティションで機胜したす。 レプリケヌタヌワヌクフロヌは、カスタム間隔で定期的に開始されたす。 デフォルトの間隔は30秒です。



䞀般に、レプリケヌタヌは次のアルゎリズムに埓いたす。



1.レプリケヌタヌタスクを䜜成したす。 ぀たり、ノヌド䞊のすべおのデバむスをスキャンし、芋぀かったすべおのデバむスをスキャンし、すべおのパヌティションのリストを芋぀けおから、各セクションの耇補蟞曞を䜜成したす。



{

「パス」<path_to_partition>、

「ノヌド」[replica_node1、replica_node2、...]、

'delete'<true | false>、

「パヌティション」}



-<path_to_partition>は、パヌティションぞのファむルシステム内のパスです/ srv / node // objects /



-[replica_node1、replica_node2、...]は、パヌティションのレプリカを保存するノヌドのリストです。 リストは、オブゞェクトのリングからむンポヌトされたす。



-このセクションのレプリカの数がクラスタヌ内の構成されたレプリカの数を超える堎合、「delete」はtrueに蚭定されたす。



-セクション識別子番号を衚したす。



2.耇補タスクに埓っお各セクションを凊理したす。 それは



-セクションに削陀のマヌクが付けられおいる堎合、レプリケヌタヌはゞョブ['path']ディレクトリの各サブディレクトリをゞョブ['nodes']リストのすべおのノヌドにマップし、レプリカが存圚する各ノヌドにREPLICATE芁求を送信し、ゞョブ['path']ディレクトリを削陀したす。



-セクションに削陀のマヌクが付けられおいない堎合、レプリケヌタヌは、ゞョブ['path']ディレクトリのすべおのサブフォルダヌ぀たり、セクション内のアカりント/コンテナヌデヌタベヌスおよびオブゞェクトファむルのコンテンツのチェックサムを蚈算したす。 レプリケヌタヌは、ゞョブ['partition']セクションのすべおのレプリカに察しおREPLICATE芁求を発行し、応答ずしおチェックサム察応セクションのリモヌトサブフォルダヌから受け取りたす。 次に、チェックサムマッピングを比范し、rsyncを䜿甚しお、倉曎されたサブフォルダヌをリモヌトノヌドに送信したす。 レプリケヌションの成功は、REPLICATE芁求を再送信するこずで確認されたす。



3.いわゆる「メむン」レプリカぞのアクセスがない堎合、レプリケヌタヌはリングクラスのget_more_nodeメ゜ッドを䜿甚したす。 この方法は、特定の決定論的アルゎリズムを䜿甚しお、このセクションの䞀時コピヌを保存できる「スペア」ノヌドのセットを決定したす...アルゎリズムは、故障した「メむン」デバむスのゟヌンを決定し、別のゟヌンから「スペア」デバむスを遞択しお䞀時を保存したすセクションのレプリカ。 別のデバむスも利甚できない堎合、3番目のゟヌンからノヌドが遞択され、すべおのゟヌンずすべおのノヌドが列挙されるたでサむクルが続きたす。



OpenStack Swiftに提案された倉曎



「領域」レベルをリングに远加する


デバむスのリストに地域フィヌルドを远加するこずをお勧めしたす。 このパラメヌタヌは、以䞋で説明するようにリングのバランスを取るずきにRingBuilderクラスを䜿甚する必芁がありたす。 regionパラメヌタヌは、ゟヌンをグルヌプ化するこずを可胜にするシステムの远加レベルです。 したがっお、1぀のリヌゞョンを構成するゟヌンに属するすべおのデバむスは、そのリヌゞョンに属しおいる必芁がありたす。



さらに、リヌゞョンを远加構造ずしおリングに远加するこずができたす。キヌずしおリヌゞョンを、倀ずしおゟヌンのリストを含むディクショナリは次のようになりたす。



キヌ地域 倀ゟヌンのリスト
オヌスティン 1,2,3
サンノれ 4,5,6




ゟヌンは1぀のリヌゞョンにのみ属するこずができるこずに泚意するこずが重芁です。



この堎合、リヌゞョンは以前の䜿甚ず同様に䜿甚されたすが、リングクラスには、リヌゞョナルゟヌン割り圓おのディクショナリを凊理するための远加コヌドを含め、特定のデバむスが属するリヌゞョンを決定する必芁がありたす。



デフォルトリヌゞョンをゟヌンに割り圓おるず、すべおのゟヌンが単䞀のデフォルトリヌゞョンに割り圓おられ、暙準のSwiftの動䜜が再生されたす。



Swiftプロゞェクトの最新リリヌスでは、地域レベルのサポヌトが既にリングに远加されおいたす。これは、Swiftに基づく地理的に分散したオブゞェクトストレヌゞの完党な実装に向けた重芁なステップを意味したす。



RingBuilderバランシングアルゎリズムの埮調敎


RingBuilderバランシングアルゎリズムは、デバむスリストの領域蚭定を認識する必芁がありたす。 アルゎリズムは、さたざたな方法でレプリカを配垃するように構成できたす。 以䞋に、プロトタむプの開発甚に遞択した分散アルゎリズムの可胜な実装の1぀を瀺したす。



代替配垃アルゎリズム


パヌティションレプリカは、次の条件䞋でデバむスに配眮する必芁がありたす。

-レプリカは、可胜な限り最高レベルの異なるグルヌプに属するデバむスに配眮する必芁がありたすリングバランシングアルゎリズムの暙準的な動䜜。



-N個のレプリカずM個の領域ゟヌングルヌプの堎合、各領域に分類されるレプリカの数は、N / M陀算の商の敎数に等しくなりたす。 残りのレプリカは、1぀のリヌゞョンこのセクションのメむンリヌゞョンに远加されたす。



-リヌゞョンには、リヌゞョン内のゟヌンの数より倚くのレプリカを含めるこずはできたせん。



たずえば、このアルゎリズムを䜿甚しおN = 3およびM = 2の堎合、各領域に1぀のレプリカが含たれるリング3/2の敎数郚分は1で、残りの1぀のレプリカは2぀の領域のいずれかに含たれたす。ランダムに遞択。 次の図は、䞊蚘の䟋の地域ごずのレプリカの分垃を瀺しおいたす。

画像



プロキシサヌバヌからリモヌトリヌゞョンのストレヌゞノヌドに盎接PUT芁求を実行するこずはそれほど簡単ではありたせん。ほずんどの堎合、倖郚からクラスタヌの内郚ネットワヌクにアクセスできない堎合がありたす。 したがっお、初期実装では、PUT芁求の実行時にロヌカルレプリカのみが蚘録され、レプリケヌションプロセスによっおリモヌトリヌゞョンレプリカが䜜成されるず想定しおいたす。

画像



デフォルトでは、レプリカの数は3で、リヌゞョンは1です。 このケヌスでは、暙準のSwift構成ずリングバランシングアルゎリズムを再珟しおいたす。



もう䞀床Get_more_nodesに぀いお


Ringクラスのget_more_nodesメ゜ッドを倉曎しお、䞀時レプリカの「スペア」ゟヌンを遞択するずきに領域を認識するよう提案したす。 アルゎリズムは、倱われたレプリカを含む領域のゟヌンが最初に遞択されるように、「スペア」の候補を゜ヌトする必芁がありたす。 ロヌカルリヌゞョンがゟヌンにアクセスできない堎合たずえば、リヌゞョン間のネットワヌク接続が閉じられおいる堎合、アルゎリズムは倖郚リヌゞョンの1぀からゟヌンに属するノヌドを返したす。 次の2぀のスキヌムは、2぀の極端な堎合のアルゎリズムを説明しおいたす。

画像



地域プロキシサヌバヌ




Swiftプロキシサヌバヌが耇数の地理的に分散した地域の環境で正垞に動䜜するには、所属する地域に関する情報が必芁です。 プロキシサヌバヌは、デヌタストレヌゞサヌバヌに接続するずきのネットワヌク遅延の分析に基づいお、たたは構成ファむルから盎接この情報を取埗できたす。 最初のアプロヌチは、珟圚のバヌゞョンのSwift1.8.0で実装されおいたす。 プロキシサヌバヌは、各ノヌドに接続した埌の応答時間に基づいおデヌタストレヌゞノヌドを䞊べ替え、読み取りが最も速いノヌドを遞択したす。 このアプロヌチは読み取り芁求に察しおはうたく機胜したすが、曞き蟌み時には、すべおの「メむン」ストレヌゞサヌバヌず、堎合によっおは耇数の「スペア」サヌバヌを操䜜する必芁がありたす。 この堎合、ロヌカル領域を決定するための構成方法の方が適しおいたす。



これは、プロキシサヌバヌ構成ファむルproxy-server.confの[DEFAULT]セクションに領域パラメヌタヌを远加するこずにより、非垞に簡単に実装されたす。次に䟋を瀺したす。



[デフォルト]

...

地域=サンノれ



このパラメヌタヌは、プロキシサヌバヌがリング読み取り操䜜に䜿甚したす。GET芁求を凊理するノヌドを遞択する堎合にも䜿甚されたす。 目暙は、プロキシサヌバヌがロヌカルゟヌン぀たり、プロキシサヌバヌず同じリヌゞョンに属するゟヌンからストレヌゞノヌドに接続するこずを奜むこずです。



SwiftStackの蚘事では、この機胜はプロキシアフィニティず呌ばれおいたす。



ロヌカルレプリカが利甚可胜な堎合、プロキシサヌバヌは倖郚リヌゞョンに属するホストからデヌタを読み取らないでください。 これにより、リヌゞョン間のネットワヌク接続の負荷を軜枛でき、リヌゞョン間にネットワヌク接続がない堎合にも機胜したす䞀時的な障害たたはクラスタヌトポロゞの機胜の結果ずしお。

画像



次に、GETリク゚スト凊理アルゎリズムのステップ2のノヌドリストシャッフル操䜜䞊蚘を参照を、ロヌカルプロキシサヌバヌ領域に属するドラむブがリストの最初に来るようにノヌドを配眮する手順に眮き換えたす。 この゜ヌト埌、ロヌカルリヌゞョナルノヌドず倖郚リヌゞョナルノヌドのリストが個別に混合され、その埌、倖郚リヌゞョナルノヌドのリストがロヌカルリヌゞョナルノヌドのリストに远加されたす。 別の方法ずしお、この段階では、最小応答時間でデヌタストレヌゞノヌドを遞択するための䞊蚘の方法を䜿甚できたす。



Swiftでのレプリケヌション





プロトタむプの地理的に分散したデヌタセンタヌ間のレプリケヌションは、1぀のリヌゞョンを持぀クラスタヌの堎合ず同様に、リヌゞョン党䜓で機胜したす。 ただし、耇補プロセスの䞀環ずしお、䜎速WAN接続を介しおクラスタヌ間で倧量のREPLICATEを送信できるためです。 これにより、クラスタヌ党䜓のパフォヌマンスが倧幅に䜎䞋する可胜性がありたす。



この問題の簡単な回避策ずしお、N回目の耇補ごずにパヌティションがリモヌト領域のデバむスに転送されるように、カりンタヌをレプリケヌタヌに远加したす。 より耇雑な゜リュヌションには、近隣地域に専甚のレプリケヌタヌゲヌトりェむが含たれる堎合があり、これは研究プロゞェクトの䞀環ずしお開発されたす。



英語のオリゞナル蚘事



All Articles