KVS再考
前日の日記に続き、KVSについて、もう少し考えてみることにしました。
KVSは、これまで登場したDBMSと比べると管理システム(Management System)を持たない分、機能縮退しています。では、なぜ機能縮退したKVSが価値を持ちはじめたのか?
これについては次の2点が考えられます。
- KVSには暗黙の了解として、高速処理に加え、高いスケーラビリティと可用性を持つシステムが想定される。
- DBのように固定したスキーマを持たない。key-valueのvalue部にはアプリケーションが自由にスキーマを設定できる。
後者から、KVSは機能縮退したのではなく、DBMSが2層に分割され、下層が独立したものと見ることができます。下層は、型(スキーマ)付けされる前のバイナリー値を扱うためのシステムで、これはユーザが自由に型付け可能であることを示しています。しかし、これだけではKVSの説明として不十分です。スタンドアローンなシステムでは、スキーマ設定はDBMSがやってくれていたからです。
これについては利用要件の変化が考えられます。以下が新しく出てきた利用要件です。
- KVSを占有するが複雑なスキーマ設定が不要な場合。
- KVSを占有し、scale outが求められる場合。この場合、scale outを阻害するDBMSは選択から外れる。1のような利用形態が多い。
- KVSを大多数のユーザで共有する場合。大多数のユーザに提供するKVSには、scale outと高可能性が求められる。また、KVSの各key-valueを再利用させるためにはスキーマを固定的に割り付けることはできない。
1だけのケースは例外と考えて、KVSがDBMSのManagement Systemをはずした状態で価値を持つためには、scale outと高可能性は必須の条件になると考えられます。
先にも書きましたが、KVS(key-value store)という言葉には、key-valueの組を格納する入れ物としての意味しかありません。拡大解釈すると、アドレスを使って値の読み書きができるメモリやディスク装置などもKVSと呼ぶことができます。このままだと、KVSという言葉が必要以上に広く使われてしまう恐れがあります。上での考察を元にすると、KVSは以下の文脈で使用されるべきと言えそうです。
KVSについてTwitterで盛り上がった後、日経BP社の中田さんから、Cassandraは、"A highly scalable, eventually consistent, distributed, structured key-value store" だよ、と教えていただきました。修辞句はいろいろつくとして(私には冗長に見えますがw)、こういう使われ方が一般的なんでしょうね。
Bigtableの場合
Bigtableの場合ですが、これは、提供される表に対して、ユーザがスキーマを設定してアクセスできる、という機能が用意されています。次の2点が純粋なKVSと異なるところで、KVSの発展形と見ることができます。
Google Bigtableに限らず、Amazon SimpleDB, Windows Azure Tableも同様な形態になっています。クラウドの商用サービスはこの形態に固まるのではないかと考えています。これをKVSと呼ぶかどうかは、まだ?ですが。。
関連資料
KVSについて理解を深めるためには、次の資料も参考にされるとよいと思います。
- 早稲田大 丸山先生 「Cloud上の分散データベース」, マルレクにて(2009/1/12)
- BigTable, SimpleDB, Azure SDS(その後、Azure Tableに名称変更)についての詳細な説明があります。
- 東工大 首藤先生「NoSQL データストアのデータモデル」, グリッド協議会 第28回ワークショップにて(2009/12/17)
KVSの定義とDBMSの再レイアリング
気がついたら、KVSの定義から始まって、NoSQLの自然なニーズ、そして、DBMSの再レイアリングの必要性についてつぶやいてました。
-
- -
- 某所で、 BigTableはKVSか議論勃発なう。私個人はvalueを入れる箱があって、それに対してkeyを介したアクセスが可能ならKVSでいいと思っている。箱を2次元に構成できるのがBigTableで、key指定に範囲が使えるのがSkip Graphを応用したもの。
- valueを入れる箱同士の関係を定義したり、整合性を保証したりするのはKVSの上位概念かと。箱を表形式に編成し、関係を決めているのがRDBで、それに従い整合性を保証するための手段としてトランザクションがある。
- SQLを使ってて困るのは、DB層より上のデザイン(通常はオブジェクト指向デザイン)とDBそのもののデザイン(ERD)のギャップ(セマンティックギャップと呼んでました)。トランザクションを必要としないケースでもRDBを使っていた。
- 情報システムには護りのシステムと攻めのシステムの2種類がある。顧客や商品データを扱うような基幹業務システムが前者で、Webを活用し、サービスを多方面に展開するシステムが後者。SQLは前者に向いたが、後者には向かない。
- システムにおける一貫性および耐障害性の保証はシステム実装者にとってとても頭の痛い課題。RDBMSはこの部分を担うことで価値を高めてきた。(2フェーズコミット、リプリケーション管理、バッチ処理を運用中に行うなど)
- RDBMSが維持してきたこの付加価値を脅かすものとして出てきたのがscale outという概念。実用的なKVSの登場により、DBMSが内包していた一貫性と耐障害性について、scale out前提の基盤の上で捉え直す必要が出てきた。
-
- -
(追記) KVSの定義について
その後、kazunori_279さんより、Google App Engine - How Entities and Indexes are Stored に "Bigtable, a large, distributed key-value store" の記載があることを教えてもらいました。でも、Bigtableの持つ表としてスキーマはKVSをやっている人達には受け入れにくいようにも感じます。例によって用語の定義は定まらない予感が...
スキーマレスかどうかは意見の分かれるところではありますが、KVSが技術用語として生まれた背景を考えると、分散形態であること、それによるscale out、冗長構成を使った高可用性の3つはKVSを特徴付ける性質であると思います。けれど、KVS(key-value store)という用語からは、分散もスケーラビリティも可用性も読み取れません。用語が一人歩きすると、そのままの意味で使われることになるだろうとも思います。(うーん)
あと、KVSがKVDBやKVDBMSと呼ばれなかったことも用語の定義を探る鍵になると考えています。
これ以上は偉い人に...
Windows Azureの本気
クラウド研究会(プライベート研究会なので公開URLはありません。m(__)m)で、Windows Azureの動向について勉強してきました。以下はAzureについてのつぶやきです。
- 社内システムをプライベートクラウドから、さらにはパブリッククラウドへとdeployできるだけでなく、相互連携が可能なので、SQLとNoSQLの良いところ取りをしたシステム構築も可能。しかも運用は一元的。
- Googleの形がインフラと一体化したクラウドで、thinクライアント(ブラウザ)からアクセスする形態を前提にしているのに対して、MSのAzureはエンドユーザのシステムが対等にクラウドサービスと連携することが前提になっている。つまり、インタークラウドを想定したシステム
- Azureはまた分散形態のシステム構築のためのフレームワークや部品も豊富。ID管理、認証、queue、workflow、data/DB のsync、稼働中のバージョンアップ、SSO、deploy管理、cache、RESTful、メタデータ、F#など関数プログラミングのサポート..
- これだけやってもMSは勝ちを手中にできたと思っていないだろうね。後から追いかける者のつらいところ。逆にそれだから本気が見える。水面下では耐障害性の問題や手続き型から関数型への移行パスやエンジンの置き換えとかやっかいな問題と戦わないといけない。
Go
GoogleのGo言語についてつぶやいてみました。
本家:The Go Programming Language
@IT:グーグル、C/C++に代わる新言語「Go」をOSSで公開
-
- -
- 軽くGo言語のspecをなめてみた。なんでもアリアリのD言語と比べるとだいぶスリム。配列の扱いに工夫があって、D言語同様にstringを組み込み型に入れている。
- 面白いのは並行処理。たぶん実装はthread じゃなくてcoroutine。goroutineなんて呼んでいる。threadよりはスタック消費の面で軽量。plan9のCコンパイラでは、 segmented stackが扱えるそうで、plan9との親和性は高そう。
- 一応、オブジェクト指向。でもinterfaceしかない。抽象型だけ入れてある感じ。coroutineといい、私にはModula-2に見える。
- 関数が複数の値を返せるのにびっくり。これほしかった。func f() (i int, j int); v1, v2 = f();
- generic typesもないし、exceptionも扱えません。性能上の理由があるらしい。性能命のGoogleの姿勢が見える。
- operator overloadingがないのは当然として、method overloadingもありません。
- Go言語、do/while文もない。どうしてるかは、ドキュメント参照。
- Windowsに載っける気はさらさらないらしい。LLVMで動かす気もないみたい。遅くなるのがいやだと。さすがGoogleさま。"it was too large and slow to meet our performance goals."
- -
Mac OS X Java6 の src.jar のありか
Leopard の初期インストール状態で、Java5が使えるようになっていて、Eclipse から Javaクラスライブラリのソースコードも確認できるのですが、Java6(64bit)に切り替えるとソースコードの確認ができなくなります。
これは、/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home 配下にはsrc.jarが置かれているのに対し、/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home 配下にsrc.jarが置かれていないことが原因です。
解決方法は2つあります。
後者の手順は次のようになります。ADC Member Site に会員登録している必要があります。
- ADC Member Site に入る。
Mac Dev Center のページから、"Mac Developer Program"の下に見える"Member Site"をクリックし、loginする。 - Downloads > Java とクリックを進め、Java関係資料のダウンロードページに入る。
- Java for Mac OS X 10.5 Update 4 Developer Documentation (dmgファイル)をダウンロードし、インストールする。
現時点で、Update 5 が最新なのですが、インストールに失敗しました。含まれるファイル構成は Update 4 と同じなので、これで十分と思います。このインストールによって、1.4.2, 1.5.0, 1.6.0 のJavaの各バージョンのdocs.jar, appledocs.jar, src.jar がそれぞれのJavaVMのHome配下に置かれます。尚、Update 2, Update 4, Update 5 は、1.4.2, 1.5.0, 1.6.0 のjarを含んでいるのに対し、Update 1 は、1.6.0 のみとなっています。
せっかく、docs.jar も入手できたので、Eclipseに外部Javadocとしてセットする方法も書いておきます。SunのJava APIサイトを外部Javadocとして利用する場合は必要ありません。
- Preference > Java > Installed JREs で、"JVM1.6.0" の行をダブルクリック。
- 該当するライブラリのリストをすべて選択して、Javadoc Location ボタンを押す。
- Javadoc in archive をチェックして、External file がチェックされている状態で、以下を入力
- Archive path:に /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/docs.jar をセット
- Path within archive: に docs/api をセット
- 参照する場合は、参照したいクラス名やメソッド名にカーソルを置き shift-F2 を押す。
ところで、ADC Member Site に置かれている Java for Mac OS X 10.5 Documentation の方には次の3つのドキュメントが含まれています。Xcodeを使う場合はこちらもインストールしておくとよいでしょう。
-
- -
(09/09/28記)せっかく探した src.jarですが、Snow Leopard だと最初から入っているとのことです。ということで、一番簡単な方法は、Snow Leopard にアップグレードする、でした。orz
Mac miniを8GBにする
river24さんから情報いただいたのがきっかけで調べてみました。元情報はこちら(Mac mini でメモリ8GB)。
まとめるとこんな感じ:
- Mac mini EFI ファームウェア・アップデート 1.2をかけると、8GBまで使用可能となる。但し、Appleのページには詳細は書かれていない。
- OSは、 Mac OS X 10.5.7 以降であればよい。(Snow Leopardでなくてもよい)
- Intel ベースの Mac の EFI および SMC ファームウェアアップデートをみると、対応機種の一覧が見れる。Mac miniについては、Early 2009版のみが1.2の対象。
この際ちょっと古い Mac mini(Mid 2007版)も、と思ったのですが関係なさそう。でも、この機種はファームウェア・アップデートと関係なく増設可能のようです。
Mac全機種の最大メモリについてはこちら(デスクトップ、ノートブック)によくまとめられていまして、Mac mini (Mid 2007) は3GBまでいけるみたいです。Mac mini (Early 2009) で余るだろうメモリ(DDR3 SODIMM)が使えないのは残念ですが。
実行は、落ち着いてからにしようと思います。