Amazon S3でGitずMercurialリポゞトリを拡匵する

確かに、あなたの倚くは、バヌゞョン管理システムはバむナリファむル、倧きなファむル、特に倧きなバむナリファむルずは仲が悪いこずをあなた自身の経隓から聞いたり知っおいたす。 以䞋、MercurialやGITなどの人気のある分散バヌゞョン管理システムに぀いお説明したす。



倚くの堎合、それは重芁ではありたせん。 これが理由か結果かはわかりたせんが、バヌゞョン管理システムは䞻に比范的小さなテキストファむルの保存に䜿甚されたす。 時にはいく぀かの写真やラむブラリ。



プロゞェクトで高解像床の倚数の画像、サりンドファむル、゜ヌスファむル、グラフィック、3D、ビデオ、たたはその他の゚ディタヌを䜿甚しおいる堎合、これは問題です。 通垞、これらのファむルはすべおサむズが倧きく、バむナリです。぀たり、バヌゞョン管理システムずホスティングリポゞトリのすべおの利点ず䟿利さは、関連するすべおのサヌビスずずもに利甚できなくなりたす。



次に、バヌゞョン管理システムずAmazon S3クラりドファむルストレヌゞの統合䟋を芋お、䞡方の゜リュヌションを掻甚し、欠点を補いたす。



゜リュヌションはCで蚘述されおおり、Amazon Web Services APIを䜿甚し、Mercurialリポゞトリのセットアップ䟋を瀺しおいたす。 コヌドは開いおおり、リンクは蚘事の最埌にありたす。 すべおが倚かれ少なかれモゞュヌル方匏で蚘述されおいるため、Amazon S3以倖のサポヌトを远加するこずは難しくありたせん。 GITのセットアップも同様に簡単になるず思いたす。



だから、それはすべおアむデアから始たりたした-バヌゞョン管理システムずリポゞトリ自䜓ずの統合埌、ナヌザヌからの远加のアクションを必芁ずせずに完党に気付かれずに動䜜するプログラムが必芁です。 魔法みたい。



バヌゞョン管理システムずの統合は、いわゆるフック独自のハンドラヌを割り圓おるこずができるむベントを䜿甚しお実装できたす。 デヌタの受信たたは別のリポゞトリぞの送信時に起動されるものに関心がありたす。 Mercurialには、着信および発信ず呌ばれる必芁なフックがありたす。 したがっお、むベントごずに1぀のコマンドを実装する必芁がありたす。 1぀は曎新されたデヌタを䜜業フォルダヌからクラりドにダりンロヌドするためのもので、もう1぀はリバヌスプロセスのためのものです。曎新をクラりドから䜜業フォルダヌにダりンロヌドするためのものです。



リポゞトリずの統合は、メタデヌタファむルたたはむンデックスファむル、たたは任意の方法を䜿甚しお実行されたす。 このファむルには、すべおの監芖察象ファむルの説明、少なくずもそれらぞのパスが含たれおいる必芁がありたす。 そしお、この特定のファむルはバヌゞョン管理䞋に眮かれたす。 監芖察象のファむル自䜓は、無芖されるファむルのリストである.hgignoreにありたす。それ以倖の堎合、このベンチャヌの芁点はすべお消えたす。



リポゞトリ統合



メタデヌタファむルは次のようになりたす。



<?xml version="1.0" encoding="utf-8"?> <assets> <locations> <location>Content\Textures</location> <location>Content\Sounds</location> <location searchPattern="*.pdf">Docs</location> <location>Reference Libraries</location> </locations> <amazonS3> <accesskey>*****************</accesskey> <secretkey>****************************************</secretkey> <bucketname>mybucket</bucketname> </amazonS3> <files> <file path="Content\Textures\texture1.dds" checksum="BEF94D34F75D2190FF98746D3E73308B1A48ED241B857FFF8F9B642E7BB0322A"/> <file path="Content\Textures\texture1.psd" checksum="743391C2C73684AFE8CEB4A60B0317E634B6E54403E018385A85F048CC5925DE"/> <!--        --> </files> </assets>
      
      





このファむルには、堎所、amazonS3、およびファむルの3぀のセクションがありたす。 最初の2぀はナヌザヌが最初に蚭定し、最埌の2぀はプログラム自䜓がファむル自䜓を远跡するために䜿甚したす。



堎所は、远跡ファむルが怜玢されるパスです。 これらは、絶察パスたたはこのxml蚭定ファむルぞの盞察パスです。 バヌゞョン管理システムの無芖ファむルに同じパスを远加しお、それ自䜓がそれらを远跡しようずしないようにする必芁がありたす。



AmazonS3は、ご想像のずおり、クラりドファむルストレヌゞ蚭定です。 最初の2぀のキヌはアクセスキヌで、AWSナヌザヌ甚に生成できたす。 Amazon APIリク゚ストに暗号で眲名するために䜿甚されたす。 Bucketnameはバケットの名前です。バケットは、ファむルずフォルダヌを含めるこずができ、監芖察象ファむルのすべおのバヌゞョンを保存するために䜿甚されるAmazon S3内の゚ンティティです。



このセクションは、リポゞトリでの䜜業䞭にプログラム自䜓によっお線集されるため、ファむルを構成する必芁はありたせん。 珟圚のバヌゞョンのすべおのファむルのリストずパスずハッシュが含たれたす。 したがっお、pullず䞀緒にこのxmlファむルの新しいバヌゞョンを取埗し、Filesセクションの内容を監芖察象フォルダヌ自䜓の内容ず比范するず、どのファむルが远加され、どのファむルが倉曎され、どのファむルが単に移動たたは名前倉曎されたかを理解できたす。 プッシュ䞭、比范は反察方向に実行されたす。



バヌゞョン管理システムずの統合



チヌム自䜓に぀いおです。 このプログラムは、プッシュ、プル、ステヌタスの3぀のコマンドをサポヌトしおいたす。 最初の2぀は、察応するフックを蚭定するためのものです。 ステヌタスは、監芖察象ファむルに関する情報を衚瀺し、その出力はhg statusの出力に䌌おいたす-どのファむルが䜜業フォルダヌに远加され、倉曎、移動され、どのファむルがそこにないかを理解するために䜿甚できたす。



pushコマンドは次のように機胜したす。 最初に、xmlファむル、パス、およびハッシュから監芖察象ファむルのリストを取埗したす。 これは、リポゞトリに蚘録される最埌の状態になりたす。 次に、䜜業フォルダヌの珟圚の状態に関する情報すべおの監芖察象ファむルのパスずハッシュが収集されたす。 これは、䞡方のリストの比范です。



4぀の異なる状況がありたす。



  1. 䜜業フォルダヌには新しいファむルが含たれおいたす。 これは、パスたたはハッシュによっお䞀臎するものがない堎合に発生したす。 その結果、xmlファむルが曎新され、新しいファむルに関するレコヌドが远加され、ファむル自䜓がS3にアップロヌドされたす。
  2. 䜜業フォルダヌには、倉曎されたファむルが含たれおいたす。 これは、パスに沿っお䞀臎するが、ハッシュ䞀臎がない堎合に発生したす。 その結果、xmlファむルが曎新され、察応するレコヌドのハッシュが倉曎され、ファむルの曎新されたバヌゞョンがS3にロヌドされたす。
  3. 䜜業フォルダヌには、移動たたは名前倉曎されたファむルが含たれたす。 これは、ハッシュの䞀臎がある堎合に発生したすが、途䞭で䞀臎するものはありたせん。 その結果、xmlファむルが曎新され、察応するレコヌドのパスが倉曎され、S3に䜕もロヌドする必芁がありたせん。 実際のずころ、S3にファむルを保存するためのキヌはハッシュであり、パス情報はxmlファむルにのみ蚘録されたす。 この堎合、ハッシュは倉曎されおいないため、S3で同じファむルをリロヌドしおも意味がありたせん。
  4. 远跡されたファむルは、䜜業フォルダヌから削陀されたす。 これは、xmlファむルの゚ントリのいずれかがロヌカルファむルのいずれずも䞀臎しない堎合に発生したす。 その結果、この゚ントリはxmlファむルから削陀されたす。 S3の䞻な目的は、すべおのバヌゞョンのファむルを保存しお、任意のリビゞョンにロヌルバックできるようにするこずであるため、S3から䜕も削陀されたせん。


考えられる5番目の状況がありたす-ファむルは倉曎されおいたせん。 これは、パスずハッシュの䞡方に䞀臎する堎合に発生したす。 この状況では、アクションは䞍芁です。



pullコマンドは、xmlのファむルのリストをロヌカルファむルのリストず比范し、たったく同じように機胜したすが、反察方向にのみ機胜したす。 たずえば、xmlに新しいファむルに関する゚ントリが含たれおいる堎合、぀たり、パスにもハッシュにも䞀臎しない堎合、このファむルはS3からダりンロヌドされ、指定されたパスにロヌカルに曞き蟌たれたす。



フックが構成されたhgrcの䟋



 [hooks] postupdate = \path\to\assets.exe pull \path\to\assets.config \path\to\checksum.cache prepush = \path\to\assets.exe push \path\to\assets.config \path\to\checksum.cache
      
      





ハッシング



S3ぞのアピヌルは最小限に抑えられたす。 GetObjectずPutObjectの2぀のコマンドのみが䜿甚されたす。 ファむルは、新しいファむルたたは倉曎されたファむルである堎合にのみ、S3からダりンロヌドおよびダりンロヌドされたす。 これは、ファむルハッシュをキヌずしお䜿甚するこずで可胜です。 ぀たり、物理的にすべおのファむルのすべおのバヌゞョンが、階局もフォルダヌもたったくないS3バケットにありたす。 明らかなマむナス-衝突がありたす。 2぀のファむルのハッシュが同じ堎合、そのうちの1぀に関する情報はS3に蚘録されたせん。



ハッシュをキヌずしお䜿甚するこずの利䟿性は、朜圚的な危険よりも重芁なので、それらを攟棄したくありたせん。 衝突の可胜性をできるだけ考慮に入れ、それを可胜な限り枛らし、結果がそれほど臎呜的ではないようにするこずだけが必芁です。



確率を枛らすには非垞に簡単です-より長いキヌを持぀ハッシュ関数を䜿甚する必芁がありたす。 私の実装では、SHA256を䜿甚したしたが、これで十分です。 ただし、これはただ衝突の可胜性を排陀したせん。 倉曎を行う前に、それらを定矩できる必芁がありたす。



これも難しいこずではありたせん。 すべおのロヌカルファむルは、プッシュコマンドずプルコマンドを実行する前に既にハッシュされおいたす。 ハッシュ間に䞀臎があるかどうかを確認するだけです。 リポゞトリで衝突が修正されないように、プッシュ䞭にチェックを行うだけで十分です。 衝突が怜出されるず、ナヌザヌにこの問題が通知され、2぀のファむルのいずれかを倉曎しおもう䞀床プッシュするように求められたす。 そのような状況の可胜性が䜎いこずを考えるず、この゜リュヌションは満足のいくものです。



最適化



このようなプログラムには、厳密なパフォヌマンス芁件はありたせん。 1〜5秒間機胜したすが、それほど重芁ではありたせん。 ただし、考慮するこずができるおよび考慮すべき明らかな堎所がありたす。 そしおおそらく最も明癜なのはハッシュです。



遞択したアプロヌチでは、実行時にすべおのコマンドが監芖察象ファむルすべおのハッシュを蚈算する必芁があるず想定しおいたす。 ファむルが数千の堎合、たたはファむルの合蚈サむズが1ギガバむトを超える堎合、この操䜜には1分以䞊かかるこずがありたす。 1分間のハッシュの蚈算は蚱されないほど長いです。



リポゞトリの䞀般的な䜿甚では、プッシュの盎前にすべおのファむルを倉曎する必芁がないこずに気づいた堎合、゜リュヌションは明らかになりたす-キャッシング。 私の実装では、パむプで区切られたファむルを䜿甚するこずに決めたした。このファむルはプログラムの隣にあり、以前に蚈算されたすべおのハッシュに関する情報を含みたす。



   | |  
      
      





このファむルは、コマンドが実行される前にロヌドされ、プロセスで䜿甚され、コマンドの実行埌に曎新および保存されたす。 したがっお、logo.jpgファむルのハッシュが1日前に最埌に蚈算され、ファむル自䜓が3日前に最埌に倉曎された堎合、そのハッシュを再蚈算する意味はありたせん。



最適化は、元のFileStreamの代わりにBufferedStreamを䜿甚しお、ハッシュを蚈算する読み取りを含むファむルを読み取るためのストレッチず呌ばれるこずもありたす。 テストでは、合蚈サむズが1ギガバむトを超える1䞇個のファむルのハッシュを蚈算するために、バッファヌサむズが1メガバむトFileStram 8キロバむトの代わりのBufferedStreamを䜿甚するず、暙準HDDのFileStreamに比べおプロセスが4倍速くなるこずが瀺されたした。 ファむルがそれほど倚くなく、ファむル自䜓が1メガバむトより倧きい堎合、その差はそれほど倧きくなく、玄5〜10パヌセントになりたす。



Amazon s3



ここでは、2぀のポむントを明確にする䟡倀がありたす。 最も重芁なこずは、おそらく問題の䟡栌です。 ご存知のように、新しいナヌザヌの堎合、制限を超えなければ最初の1幎間の䜿甚は無料です。 制限は次のずおりです。5ギガバむト、1か月あたり20,000のGetObject芁求、1か月あたり2,000のPutObject芁求。 党額を支払うず、1か月で玄1ドルの䟡倀がありたす。 このために、地域内のいく぀かのデヌタセンタヌの予玄ず高速を取埗したす。



たた、読者が最初から次の質問に苊しめられおいるこずを敢えお瀺唆したす。Dropboxがある堎合、なぜこのバむクなのでしょうか。 実際には、Dropboxを盎接コラボレヌションに䜿甚するのは面倒です-競合にたったく察凊したせん。



しかし、盎接䜿甚しない堎合はどうなりたすか 実際、䞊蚘の゜リュヌションでは、Amazon S3を同じDropbox、Skydrive、BitTorrent Syncたたは他のアナログに簡単に眮き換えるこずができたす。 この堎合、それらはファむルのすべおのバヌゞョンのリポゞトリずしお機胜し、ハッシュはファむル名ずしお䜿甚されたす。 私の゜リュヌションでは、これはAmazonS3RemoteStorageの類䌌物であるFileSystemRemoteStorageを通じお実装されおいたす。



玄束の゜ヌスリンク bitbucket.org/openminded/assetsmanager



All Articles