前回は、Twitterを構成するサービスやソフトウエアのインフラ部分の多くが外部サービスに依存していることを解き明かした。NTTコミュニケーションズの米国子会社であるNTTアメリカのデータセンターに配置した米ツイッターの自社サーバーと、米アマゾン・ウェブ・サービシズのオンライン・ストレージ・サービス「Amazon S3」などを組み合わせているのだ。

 今回は、Twitterを稼働させるサーバー群などの機器構成を手始めに、データセンターの“中身”を詳しく見ていく。さらに、Twitterの機能を外部から呼び出すAPI(application programming interface)の公開の仕方も解剖する。そこには、ユーザーにとって便利なクライアントソフトの登場を促す仕掛けがある。

データセンターの“中身”は自家製

 Twitterは、主に2008年に実施されたインフラ部分の刷新によって、「頻繁に落ちる新興サービス」から「たまに落ちる旬のWebサービス」に生まれ変わった。ユーザー数の急激な増加にインフラが追いついたといえるだろう。

 実際、Webサイト監視サービスを手掛けるスウェーデンのピングダムの観測によると、Twitterの年間稼働率は2007年の98.08%に対し、2009年は99.76%と2%近く改善。“スリーナイン”に近づくところまできた。

 まずデータセンターと通信回線は、2007年にNTTアメリカの企業向けサービスを契約。サーバー機は米サン・マイクロシステムズのラックマウント型サーバー「Sun Fire X4100」を8台、データベース用に8CPUコアのサーバー機を利用中であることを2007年の開発者向け会議で明らかにしている。

 その後CPUコア数の増強などを実施し、データセンターにおける電力利用効率向上や占有面積の削減を実現したという。現在の具体的な構成は非公開だが、Webサーバーに安価な汎用サーバーを多数並べ、データベースの運用には比較的高性能なサーバー機を使うという、Webサービスのバックエンドとしては一般的な構成を採っている。

データベースに分散キャッシュを多用

 ユーザー数の増加に伴ってデータセンターやネットワークを強化する一方、膨大なユーザーのつぶやきを読み書きするための基盤ソフトウエアの新規開発を並行して進めてきた。

 Twitterの仕組みでは、あるユーザーの記事投稿が数百、数千のユーザーのタイムラインの更新を伴う(図1)。

図1●Twitterでは投稿のたびに購読者(フォロワー)のホーム画面(タイムライン)が書き換わる
図1●Twitterでは投稿のたびに購読者(フォロワー)のホーム画面(タイムライン)が書き換わる
[画像のクリックで拡大表示]

 単純なブログであれば、ユーザーが記事を追加したとしても、書き換えるのはそのユーザーのページだけだ。ところがTwitterでは、購読関係にあるユーザーすべてのホーム画面を更新する必要がある。

 Twitterの最初のシステムは、まつもとゆきひろ氏が開発したプログラミング言語「Ruby」をベースとするWebアプリケーションフレームワーク「Ruby on Rails」(RoR)を使って開発された。RoRは、開発環境を含めた総合的な生産性の高さが売り。しかしRoRは、大規模サービスを支えられるパフォーマンスを狙ったフレームワークではない。そこでTwitterでは、データベースの負荷を軽減するキャッシュ機構に改善を加えた。

 RoRを基盤にTwitterを立ち上げた当初は、Twitter向けサービスの開発者向けに公開したAPIからの呼び出し手順(API)のみをキャッシュしていた(図2左)。データベースは比較的性能が高いサーバー機1台で運用し、データベースの内容を取り出したい形にしてサーバー機のメモリー上に置く分散型キャッシュ・サーバー・ソフト「Memcached」で高速化していた。データベースから取り出すデータをあらかじめ読み出しが高速なメモリーに置いておき、さらに複数のキャッシュサーバーで並列処理することで応答速度を高めるわけだ。

図2●Twitterのキャッシュ構造の推移<br>入出力の対象はキャッシュサーバー上のメモリーが基本。米ツイッターのEvan Weaver氏の講演を基に作成した。URLは、<a href="http://blog.evanweaver.com/" target="_blank">http://blog.evanweaver.com/</a> である。
図2●Twitterのキャッシュ構造の推移
入出力の対象はキャッシュサーバー上のメモリーが基本。米ツイッターのEvan Weaver氏の講演を基に作成した。URLは、http://blog.evanweaver.com/ である。
[画像のクリックで拡大表示]

 一方、APIのアクセスとは異なり、Webブラウザーからの利用はその都度データベースから読み出していた(図2左)。そこですべてのアクセスを、複数のMemcachedサーバーでさばく構成に変更(図2右)。またTwitterのWebページやTwitterクライアントがよく利用するデータに合わせて、データベースの構成や索引付けの方法を見直した。

 キャッシュ機構は、MemcachedやRoR用に自社開発した「cache-money」といった複数のキャッシュ用ソフトウエアを組み合わせ、基本的にすべての入出力をメモリー上で実施する構成に変えている。アクセスを受け付ける部分については、メッセージキューイングのソフトウエアを自社開発して対処した。

 その後ツイッターは、RoRで構築していた部分の多くを「Scala」というプログラミング言語で書き換えた。ScalaはJava仮想マシンを実行環境とする。並列処理に向くプログラミング言語としての特性と、大規模システムで実績のあるJava仮想マシンの信頼性を同時にシステムに取り入れられる。