ポータブルなwebアプリケーションとそのインフラの未来の一考

naoyaさんのポータブルなWebアプリケーションを受けて最近思ってることをば。140文字で時々書いてるんだけど、まとまりがないので一回まとめておきます。

12-factor app

ステートフルなアプリケーションについては、Herokuの人が提唱してる12-factor appというのが現在の状況をよく表してます。

Herokuや他のPaaSによってもたらされたこうした一種の”制約”によって、アプリケーションの新しいカタチが生まれてきています。引き算によって新しい価値が生まれてきているわけですね。

とはいえ、PaaSはPaaSでそれぞれに独自の仕様を持っているわけですが、Herokuのbuildpackという仕組みを使って、Herokuとインタフェース仕様を揃えたdokkuFlynnみたいなのも出てきました。まるでWSGI/Rack/PSGIがHTTPサーバに対してそうした様に、アプリケーションサーバもそれ自身が一定のインタフェース仕様によって共通化されていくことに対して、僕は興奮を抑えられません、PSGIを初めて知った時と同じ様に。

Docker

dokkuは裏でDockerを使っています。PaaSの一つであるdotcloudが彼らがサービスの中で使っている仕組みをOSSとして公開したものですが、これが本当に爆発的に普及したのが2013年でした。あまりの普及により、dotcloudは社名がdockerに変わってしまう程でした。

Dockerの素晴らしいところはnaoyaさんも書かれている通り、イメージさえデプロイできれば、どんな環境(Linuxには限りますが)の上でも動くというところです。コンテナ型の強みとしてXenやKVMと比べて大変軽量なので、上げたり下げたりが簡単なところがImmutable Infrastructureと呼ばれる使い捨ての仕組みと相性が良いわけです。

Dockerコンテナをホスティングするようなサービスも当然出てきていて、そういうサービスを使えば、手元のMac上のVMのLinuxで動いたDockerアプリが、全く同じファイル資源を使って本番環境でも動かせるわけです。もちろんCIもDocker使って本番と全く同じものがテストができます。

Mesos+Docker

ここまではnaoyaさんのエントリとかぶってるわけですが、僕が最近ずっと気になってるのはMesosとの組み合わせです。Dockerによってアプリケーションがポータブルになってきても、それを動かす計算機資源はいずれにせよ必要になります。それをPaaSの様にお金と引き換えに全て誰かにお任せしてもいいですが、計算機資源を自分たちで持ってかつその上でDockerを効率よく動かすことができたら素敵です。Mesosならできます。

Mesosは簡単に言えば、たくさんある計算機を束ねて、合計でcpuが何個メモリが何GBある一つの仮想計算機の様なもので、何かプロセスを実行したい時にはMesosから必要な計算機資源(cpuを1個、メモリを1GB等)配給してもらって、実行するということができるフレームワークです。

これをDockerと組み合わせると、rubyのアプリケーションAとpythonのアプリケーションBとnodeのアプリケーションCがあって、Aを10プロセスBを5プロセスCを20プロセス稼働させることが、1つのクラスタで実現できます。なぜなら、ファイル資源は全てDockerのイメージが持っているのでパッケージの衝突とかを考える必要ないですし、クラスタのマシンが1つ死んだら、足りなくなったプロセスを残りの空いてるマシンで動かすというのも容易です(そういうのを管理するMarathonというフレームワークが既にあります)。

これによって、例えば以下の様なよくある悲しい状況も改善します。個人的には大規模本番サービスよりもむしろこういう用途の方が最初はMesosのコストパフォーマンス高いかなと思います。

  • ちょっと試しに捗る系のwebアプリを動かしてみたいけど、そのためのサーバをインフラからもらうには手間が掛かり過ぎるので、既存の別用途のサーバ使おう
  • 依存関係が複雑で、ググりながらいろんなパッケージとかを入れまくって、なんとか動かす
  • 意外といいツールだったのでみんな使いはじめる
  • 導入した人が辞める
  • そのサーバが老朽化したので別のサーバに移管しようとしたら、本来の用途と違うものが動いていて、しかも誰もセットアップ方法が分からない
  • いつまでもそのサーバを使い続ける or 職人技で新しいサーバをセットアップする

Dockerによってアプリケーションはイメージで全て表現されているので、例え再現方法は不明であったとしても別のマシンで動かすだけであればアホでもできます。

Mesosでは、ざっくり大きな目線でのキャパシティプランニングしかしないので、その範囲であればチームや部署で自由に資源を活用してもらうことができます。これは実際の業務と近くて、資産やコストを管理したい人は毎月の状況をざっくり捉えられていればいい一方で、現場の要求は毎日の様に変化するわけです。Mesosであれば、資産として常識的に必要十分な量さえ把握できていればコストの予測が容易ですし管理も簡単です。実際に利用する側はMesosによってその枠を目一杯一つの計算機の様に扱うことができます。

もし予定よりもキャパシティが過不足になった場合も、Mesosのslaveを必要に応じて足し引きするだけで資産の流動ができます。これはデータセンタであろうとクラウドであろうとかなり嬉しいと思います。特に、AWSを使ってハードウェアのキャパシティプランニングから解放されたとおもったら、結局インスタンスの細かいキャパシティプランニングすることになって悲しい思いをしてる人にとっては、Mesos上でのざっくりしたプランニングだけしてReservedやSpotを組み合わせて運用しながら最適なインスタンスをどんどん組み替えていくことができるので、今までと全くちがうキャパプラができるようになって大変うれしいと思います。

ちなみにMesosについてですが、UC Berkeleyの研究から始まり、Twitterでの本格導入、Airbnbでの導入に続いていろんな企業が利用を始めているようで、最近AWS/OSS界隈では目立っているNetflixも導入を始めているようですので、これから盛り上がっていく可能性はかなり高いと思います。今のうちにキャッチアップしておくと、先行者メリットを享受できるかも知れないのでオススメです。

新しい計算機

よく言われてることですが、Mesos, Docker, Marathon, あとChronosというcronみたいなツールによって、今OSによって実現されている、Kernel, Process, Process manager, Schedulerが同じアナロジーによって複数計算機上に実現されるわけです。もう、実際の計算機一つ一つに気を払う必要はほとんどの人にとってはなくなり、代わりに1つの大きい計算機資源を扱うスキルが要求される様になる世界がくるかもしれません。

そして、きっとそのうちそれをXaaSとして提供するサービスが出てきて、さらに抽象化され、みたいな繰り返しが予想できますね。起こるかどうかは置いといて。

まとめ

  • 12-factor app超重要
  • Dockerは神
  • Mesos+Dockerで次世代へ?

3500文字くらいになった。何かのきっかけになってもらえれば幸いです。

おまけ

で、お前はやってんのかよと言うと諸々の理由により実は全然手は動かしてないです。。。もし本気でMesos+Dockerの導入を考えてるけど英語しか情報ないのがなーって人がいれば全力で協力させて頂きますのでお声がけ下さいませ。