すこし前にはてなスターのリリースがされたのですが、サービス開始直後にありがちなことに、時々負荷で遅くなったり、アクセスしにくくなったりしてしまいました*1。これではいけない、ということで、すぐ次の日に、バックエンドのサーバを一気に10台近くまで増やして、おおむね快適に使える状態になっていると思います。この時に、新しいサーバをまっさらな状態から、だいたい30分程度で本番投入することができていました。これを、どのように実現したのかを軽く紹介したいと思います。
ちなみに、サービスの重さは、サーバ増強だけで済むものではなく、それ以降も、Javascriptが重い!とか、アプリケーションロジックで重いSQL を走らせてしまって遅いという問題は何回かありました。が、そこはインフラではなく、アプリケーションの問題で、アプリケーションの改善は、継続的に進んでいると思います。ので、今回は、インフラの話に限定しています。
当時、サーバを増強しようという決定をした時点では、半分ぐらいのサーバは、まだOSもインストールしていないか、していても、インストールしただけのまっさらな状態、残り半分は、ハードもできていない状態でした。
はてなのインフラは、基本的に、プロキシ、バックエンド、データベースの三層で構成されており、今回増強したのは、バックエンドが主でした。バックエンドというのは、アプリケーションが実際に動作する層で、Apache +mod_perlで駆動しています。
サーバをバックエンドの本番に投入するまでには、おおまかに以下のことが必要です。
- ハードの組み立て・設置
- OSのインストール
- アプリケーションの動作に必要なライブラリ等のインストール・設定
- 監視などインフラの一部として動作するための設定
- アプリケーションのデプロイ
- ロードバランサの設定への追加
今回のサーバ増設では、ハードの設置終了から、本番に投入されるまで、だいたい30分程度、OSインストールの終了後からは、だいたい10分程度で終えることができました。
バックエンドのサーバは、基本的にパーツから自製しており、ここは純粋に人海戦術となっており、さすがにある程度の時間がかかります。
OSのインストールは、キックスタートで、BIOS設定と最初のトリガーさえ与えれた後は、全てネットワーク経由で済むように自動化されています。ここも大量のパッケージをインストールするので、それなりに時間がかかります。
アプリケーションのデプロイは、ずいぶん前から、switchtower(現capistrano)で、ほぼコマンド一発で済んでおり、これはすぐに終わります。
残りの「アプリケーションの動作に必要なライブラリ等のインストール・設定」と「監視などインフラの一部として動作するための設定」の部分は、以前は相当の時間と人手がかかっていた部分なのでした。が、「なんでもrpmパッケージ化 & yum で一発インストール」と最近、話題に登っていた「設定自動化ツールpuppet」を導入することで、ほぼ自動化されるようになり、大幅な時間短縮ができるようになりました。
「なんでもrpmパッケージ化 & yum で一発インストール」では、MySQLはApacheで特定のバージョンを使いたいとか、標準ではないライブラリを使いたい、という時も、全てrpm化してから、自前yumリポジトリ経由でインストールする、ということです。一番大変なのは、大量のCPANモジュールなのですが、CPANの依存関係を解析してrpm化する手製スクリプトで、CPANモジュールのrpm化が、ほぼ自動化されています。おかげで、200以上にのぼるはてなのアプリケーションが依存しているCPANモジュールも、簡単にインストールができるようになっています。(また、rpm化のおかげで、CPANモジュールのアップデートを適用するのも簡単になっています。)
puppetは、最近、あちこちで紹介されているのですが、徐々に運用ノウハウを蓄積しながら、今回の増強では、サーバに必要とされる初期設定が自動化されるところまで達することができました。
これで、サーバの設定が済んだら、軽く動作確認をして、ロードバランサの設定(今は、プロキシで動作しているApacheのmod_proxy_balancerの設定)を更新して、本番投入終了となります。
このように本番投入までを、ハード完成から30分、OSインストール後から10分というのは、なかなかのスピードだと思うのですが、どうでしょうか。ちなみに、30分ずっと一台にかかりきりなのではなく、時々コマンドを投入するだけなので、数台程度なら、一人で並行作業することも十分可能でした。また、ハードが自製ということもあり、究極的には電器店からパーツを買ってくるところから、数時間以内には、何台もの増設ができる状態になっているのは、けっこうな強みだと思います。
CPANモジュールのrpm化や、puppetの運用ノウハウは、需要があるところにはあるかもしれないので、徐々に紹介していきたいと思います。(けっこう苦労していることですし)
*1:http://d.hatena.ne.jp/hatenastar/20070711/1184155985など