サーバーとネットワークの動的な構築について
次期RUNESのために思いついたこと。
背景として、今IT業界で「動的」が流行っている。ここで言う「動的である」ということは、あらかじめ設計や仕様を固めたりせずに、そもそも変化があることを前提とし、作っているプログラムやサービスもどんどん変化させていくこと。
たとえばシステム開発手法の1つであるウォーターフォール型は、かなり昔に無理があることが分かってきた(無理が出てきた)らしく、XPとかAgileという話を良く見る。(良く見るということは、世の中がそっちに向かっているということだと思う)
Webサービスのベンチャーでは特に激しくて、Web2.0と言うのは、とりあえずBeta版のままでリリースしてしまって、その後ユーザーからのフィードバックを得ながらどんどん変化させていく方法で成功しているように思える。あらかじめ固まった設計なんて無い。永遠のBetaだったりもする。ずっと変化する。
Ruby on Railsは、既に数多とあるJava系のフレームワークと比べて、動的型付け言語を使っているから、この激しいウェブサービスの競争の中で選ばれるのだと思う。Rubyはあらゆるオブジェクトが多様性を持っていて、後から後から設計を変更しても、非常に柔軟に対応できる。もちろん変更すればバグが出るけど、それは許容する。バグをつぶすのに時間をかけるより、Betaのままでもリリースした方がいい。静的型付け言語では、そもそも言語が変更に対応できない。
はてなやmixiやフォト蔵などの新鋭のウェブサービスで、Javaを使っているという話は聞かない。
JavaScriptも動的型付け言語。SVGやApolloなどの技術の成熟を待たずにAjaxを使ってしまうというAdHocさも、動的と言える。
なぜ動的になっているかということはどうでも良くて、Webサービスのレイヤーが動的になっているなら、その下のレイヤーも今後動的さが求められてくるのではないかということ。
開発合宿で2,3日で(Beta版の)ウェブサービスができあがってくるような中で、サーバーやネットワークを設計からガッチリ作っていて間に合うわけがない。今の設計では拡張できないからと言って、もう一回設計からやり直すなんてこともできるわけがない。
では、動的なサーバーの構築とは、どのような方法か。
変化に対応できなければならないから、ディスク容量(HDD)や演算性能(CPUとメモリ)、ネットワーク性能(NICとスイッチ)が簡単に拡張(あるいは縮小)可能でなければならない。また、入念な設計なしでこのような拡張性が得られなければならない。
そして当然サーバーであるから、落ちてはならない。落ちたとしてもその時間は最小限に抑えなければならないし、自発的に落とすときはすぐに復旧できるという確証が必要である。
資金があるならば、とんでもなく高いサーバーを買えば実現できる。だがうまくいく保証もない(設計がない)のに、そこまでの資金が出せるわけでもない。エントリーか中堅レベルのサーバーしか買えないし、買わない。
ハードウェアの機能が望めなければ、ソフトウェアでなんとかするしかない。もちろんOracle RACを買えばいいなんて話ではなくて、フリー/オープンソースソフトウェアでなんとかする。
さて、ここまでの要求を実現できる方法があるのだろうか?
実際、無いと思う。
では今はどう対処しているのかというと、無ければ作るという精神で、スターエンジニアががんばっている、というのが現実ではなかろうか。スターがいない企業は、やっぱり成功できないんじゃないか。
でもそれでいいのか。本当に動的にサーバーを構築する手法は無いのか、確立できないのか。
しかし1つの回答は、DSAS開発者の部屋にあると思う。Linuxで多重化/負荷分散構成を作ることで、安価なサーバーで、高い可用性を持ち、リソースの追加=サーバーを買ってくる&ネットワークブートという非常に高い拡張性を持ったサーバーシステムを構築できる。
ただDSASのようなシステムを自社で構築できるかと言えば、それはとんでもない技術力が必要になる。仮に構築できたとしても、「スターエンジニアががんばる」と変わらない。というわけで回答の一つは、DSASを構築してもらうという方法。KLabという実績もある。これがどのくらいの費用になるのかというのが1つの焦点。
発想を転換する方法として、さくらインターネットなどでサーバーを借りる方法がある。実績もあるし隙が無い。でも多少費用がかかる。もっと削りたい。それに「すぐそこで動いている」という実感も、クリエイターとしては重要だと思う。
そこで、VIVERを使えばできる、と言いたいところではある。実際、VIVERの目標の一つは、動的なサーバー構築手法を確立することである。そして、その手法をオープンな場で共有できるようにすることである。(他の目標は、サーバー用途に限らずあらゆるLANを動的に構築すること)
しかし今のVIVERでは、足りないものがたくさんある。足りないものがたくさんというより、足りているものを挙げた方が早い。
今のVIVERには、ネットワークブートを行う基盤しかない。ブートするだけであれば、事前の計画なしで突然展開することもできるし、新しいマシンは買ってきて電源を入れるだけである。冗長性もあるし、負荷分散もする。HDDの内容を壊さずに利用できるという、一種の互換性もある。
でもブートするだけでは、ちょっと面白いだけでしかない。この上にApacheとかLighttpdとか、MySQL、PostgreSQL、Postfix、qmail、NSDなどのソフトウェアを、多重化して、負荷分散して、かつ拡張できるように動かさないと、使えない。(冗長性や拡張性が無ければ静的にサーバーを組めば良いだけの話)
現状、DHCPサーバーとTFTPサーバーの多重化と、Webサーバーの多重化は、ちょっとしたHackでできるようになっている。しかし負荷分散しない、ファイルを(多重化された方法では)共有できない、Webサーバーのセッションは多重化されない(RDBMSを多重化できない)と、使える状況では無い。
というわけで、次の開発目標が定まる。
- 多重化され、負荷分散され、そして拡張性を持つようにソフトウェアを動すための、支援基盤(API)を作るか、探してきて拡張する。
- 1.の支援基盤を使って作ったソフトウェアを、共有できるようにする
そしてもう一つ、ファイルを多重化して共有するソフトウェアの開発。実は現状、これを完全に行うソフトウェアが存在しない。ファイルを多重化できないと、ほとんどのソフトウェアは多重化できない(逆にファイルさえ多重化できれば多くのソフトウェアを多重化できる)。ハードウェアの支援があれば(SANを使えば)できるが、それでは動的に構築できない。
ここまでを、これからの1年で開発する予定。
しかしこれでも問題が1つ残ってしまう。それは、実績が無いという問題。実績まで揃わないと使えないけど、使えないと実績にならない。
そこで、今のVIVERでも使っていただけたら、ぜひコメントを下さい。そのコメントの積み重なりが実績になっていくと思いますし、コメントによってVIVER自体も変化していきます。