世界中で使われているGitHub。そのリポジトリの総数は3800万、Gistの総数は3600万を超えている。このような大規模システムはどのような仕組みで構築されているのだろうか。Githubが9月13日から15日にかけて開催した年次イベント「GitHub Universe 2016」で、同社のGitインフラストラクチャエンジニアリングマネージャであるPatrick Reynolds氏が発表した内容からその仕組みを解いてみる。
データ複製の仕組みを変更
GitHubは最近、インフラストラクチャの構造を変更したそうだ。これまで、ファイルサーバに配信されたデータはいわゆるRAIDのような技術を使って複製が行われていた。これをアプリケーションレベルでのレプリケーションとなる分散型「Git」、または「DGit」と呼ばれる仕組みに変更したのだ。この仕組みは、「Spokes」という名称に変更され、GitHub Universe 2016では「Spokes」の名称で説明が行われた。
Spokesの仕組みは簡単だ。リポジトリ、Wiki、Gistはそれぞれ3つのコピーを持つ。1つはリードオンリー、もう2つはフル機能が提供される。プッシュ要求が来ると、プロクシを通じてこの3つのリポジトリに対してデータが流れていく。常に3つのコピーが存在するという状況を作っているわけだ。リポジトリはそれぞれ別のマシンに存在している。どのサーバに配置されるかはバランスをとるように調整され、あらかじめ決まっているわけではないという。隣のマシンかもしれないし、物理的に数百キロ離れたところのサーバかもしれない。
3つのコピーのうち、どれか1つが壊れた、つまりそのリポジトリが保持されているサーバが壊れたと判断されると、ほかのサーバからリポジトリのコピーが別のサーバに送られることになる。このように、故障が発生してもすぐに別のサーバにコピーが実施され、常に動作可能な状態を保ちながら安全性も担保している。
さらに、リポジトリはプロセッサの処理負担およびディスクの使用量が全体でバランスが取れるように配置される点も注目される。特定のサーバに負荷が偏らないように、必要に応じてリポジトリがほかのサーバへ再配置される。この機能によって、常に全体でバランスのとれた状況を作り出し、遊んでいるサーバがないような状況を作っている。
サーバを追加するだけでスケールアップ
Spokesでは、個々のデータに対して3つのコピーが作成されるところがポイントとなるが、データセンターも3カ所に分散しているところも興味深い。データセンター1カ所当たりに数千台のサーバが配置され、それが米国に3カ所存在している。レポジトリのコピーがどのデータセンターのどのサーバに配置されるのかは、その時のバランスので決まり、必ずしもすべてが違うデータセンターに配置されるというわけではないという。
サーバにはLinuxがインストールされ、そこでMySQLやgitが使われている。ディスクは高速性を実現するためにSSDが採用されているほか、さらに動作の高速性を実現するためにmemcachedが導入されている。こうしたサーバ数千台が3カ所のデータセンターで動作している。
「Spokes」の仕組みがすでにそうであるように、プロセッサやディスク容量が理由でサーバを追加する必要が生じたら、サーバを追加するだけでよい。サーバに配置されるリポジトリは全体でバランスが取れるように再配置が行われるため、追加したサーバには自動的にリポジトリが増えていくことになる。その分、他のサーバの負荷が軽くなるというわけだ。
GitHubはRuby on Railsでサービスを開発しているということもあり、日本のRubyのコミュニティともつながりがあるそうだ(インフラ担当のエンジニアの方が、今年のRubyKaigiにも行ってきたとおっしゃっていた)。
「Spokes」はアプリケーションレベルでレプリケーションを実現しつつ、サーバを追加するだけという利便性の高いスケーラビリティを持つ。加えて、可用性が高く、マシンの稼働効率も優れ、動作も高速という優れたパフォーマンスを発揮している。
通常、冗長性を確保するという話になると、単純にマシンを複数台用意してスタンバイ状態で待機させるとか、ディスクはRAIDで重複化するといったことを考えるが、構築するシステムの動きに合わせればもっとシンプルで効率のよい方法は実現できる。GitHubの場合、それがSpokesということになるだろう。
Spokesの興味深い点は、この構造や仕組みをほかのシステムにおいても参考にできることだ。プラットフォームの構築に使われているソフトウェアはオープンソース・ソフトウェアなので、まねて同じシステムを開発することもできるだろう。システムの概要は「Building resilience in Spokes|GitHub Engineering」、「Introducing DGit|GitHub Engineering」にまとまっているので、興味がある方はぜひ1度目を通していただければと思う。