ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

第1回HBaseとCassandraの討論会のメモ

2010-11-06 15:15:50 | PG(NoSQL)

HBaseとCassandraの討論会 第1回(Togetter:第1回HBaseとCassandra討論会)に参加したので、そのメモです。
…例によって、聞き逃し・理解不足・誤解誤認はあるとは思いますが(汗)


最初にkimteaさんの2010-02-15の分散データベースのページを見ながら話を聞く。
第1世代…Google BigTable
第2世代…Amazon Dynamo
第3世代…Microsoft SQL Azure(→リレーショナルモデルに変更された。中で使われているAzure TableはKVS)
第4世代…Cassandra

KVSはオブジェクト指向で、業務システムを作るのが難しい。(◆●オブジェクト指向という理由で難しいの?)
GAE/JSlim3はその難しい部分を隠蔽してくれる。(JDOは失敗した(広まらなかった)が、GoogleはJDOを推している。JPAは遅い)

Cassandraの特徴
・O(1) DHT…分散ハッシュテーブル
・Eventual Consistency…BASEに基づく結果整合性
・Consistencyが調整可能
・分散DBでは削除の仕組みが難しい→0.7β2からVersioned Clockが実装される(Vector Clockはつまずいた)(◆●そういえばそんなツイートを見た覚えが)


で、ここから四方山話討論へ。
実際にCassandra・HBaseを使っている人達の苦労話や解決策の会話は非常に興味深い。

・Cassandraのロードバランスは、コマンドを実行すると重くなり、リングから外れてしまう→コマンドは休日に実行すべしw
・大量にデータを入れるとリング内で連鎖してCPUが100%になってしまう→Memスレショルド(◆●RowWarningThresholdInMBのこと?)を1MBにすると軽減される(◆●ちょっと裏技っぽい?)
・Cassandra0.6.6から起動が軽くなった
・Cassandraはローリングアップデートが可能

・HBaseでデータが破損すると復旧は大変(HDFSが落ちてコミットログがおかしくなるようなケース)
・Lunixのfd(ファイルディスクリプター)を増やしておく
・5台以上ほしい→スモールスタートがやりにくい

・Cassandraはキー毎にデータが分散しているから、範囲検索はスケーリングしない
・HBaseは逆の発想で、キーはかたまっているからショートレンジスキャンが得意
HBaseCassandraはキーが偏ると一部のノードだけに負荷がかかる
・HBaseはROW単位でデータを管理しているが、実際はHDFSのリージョンサーバーがデータを持つ。(1~2日くらい経つと)メジャーコンパクションにより配置が最適化されて速度が上がる
・データの移動中は数秒くらいアクセスできなくなる。こういうところが「可用性を犠牲にして一貫性を保つ」部分

・MongoDBはよく固まる。ファイルサイズが倍々になるので、コピーに時間がかかる為
・HBaseもディスクを大量に使う

・Cassandraでデータ(ファイル?)を別マシンに持っていくとキーが見えなくなる(データを読めない)→「このトークンはこのリング」「Ring上で、このTokenはこのノード」という情報をホスト名で管理している為→hostsファイルでホスト名を持てばIPアドレスを変更しても大丈夫
・データの位置情報は、Cassandraはハッシュ関数、HBaseは.META.テーブルで管理している

・CassandraでCQLというSQLっぽいものが開発されているらしい
Clustrix(クラストリックス)…バックグラウンドがKVSで、SQLが使えるらしい(有償)
・VoltDBもSQLが使えると言っているが、色々制限がある

・Cassandraは構築は楽だが、故障時故障後の復旧作業が面倒(復旧方法が色々あるし、リバランスに時間がかかる)
・HBaseはデータは他のリージョンにあるので故障時のデータコピーはマスターによってすぐ行われるHDFS上にリージョン等の実ファイルを保存しており、故障時は“各スレーブノードが担当するリージョンの再割り当て”がマスターノードによってすぐ行われる(HBaseは構築は手間だが、故障時は楽)
(Oracleなら故障したらOracleの人が謝ってくれるが、CassandraやHBaseは自分達が謝るしかない^^;)
(◆●話を聞いていると、思っていたより故障が多い印象。ノード数が少ない為か?Google並にノード数が多ければ故障してもただ放っておけばいいのかもしれないが^^;)
・Cassandraでノードを追加すると、今までは「リングの最後尾に追加されていた」が、「データ量が多いところを分割する」ように変更される(ロードバランスをしなくても済むようになる)
・Cassandraのデータコピーは遅い:ストリーミングが帯域を喰う/HintedHandOffがヒープを喰う→GCが発生してOutOfMemoryになり、ノードが応答しなくて切り離され、別のマシンへデータコピーしようとする→という連鎖が発生して全体が固まる(ノード数が3台とか5台で発生する。ノードが多いと大丈夫かも?)
・Amazon EC2 スモールインスタンスだとメモリーが1.7GBしか無い。専用サーバーの推奨スペックなら、Cassandraは4GB以上、HBaseは8GB(Hadoopを使うなら+4GB)
・Cassandra+Hadoopは遅い。HBase+Hadoopはデータの局所性を認識してくれる(HBaseは物理的にデータファイルのある場所でMapReduceの処理が行われる。Cassandra0.6はデータファイルのある場所とは無関係なので、通信に時間がかかる)

・HBaseの構築には色々な設定が必要(Linuxのファイルディスクリプターを増やす、ZooKeeperを設定する、HDFSを構築する)
・Puppetもユーザーキーは扱いづらい。設定を書く(設定内の定義を共有する)のが大変。拡張ドキュメントも足りない
・Puppetと同様なツールで「シェフ」というのがあるらしい
(◆●Puppetは象本NTTデータの報告書でも紹介されていて良さそうな印象だったが、やはり実際は面倒な面もあるんだなぁ)

・RDBMSと比べると、KVSはキーをスケールするように設計するのが重要→(キーによってはデータが一部のノードに偏るので)1ノードにデータが集中してしまうとRDBの方がスループットが良いかもしれない
・CassandraはMySQLよりメモリーを喰う(MySQLは500MBくらいでいい)
・RDBとNoSQLの連携に関しては、RDBからデータをコピーして処理し、RDBに戻すのがいいかも(クリティカルなデータをNoSQLだけで保持するのはまだ怖い)
(元となるデータは別(RDBやファイル)にあり、NoSQLにロードできる状況が向いていそう。あるいは更新が頻繁に行われるデータはNoSQLに向いていない)
・RDBでも、データのバックアップはとるよね?(Amazon EC2も定期的にスナップショットは取れる)
・HBaseのデータのレプリケーション(複製):規模が大きければクリティカルなデータもいけるかも
・Adobeでは、HBaseからMySQLへリストアする仕組みを作った→Adobe の HBase 事例

・Cassandraでトランザクションってどうするの?→キューに入れて、1つのスレッドが書き続ける
・Cassandraではカウント処理が出来ないので、ZooKeeperでやってる(HBaseにはカウント機能はある(ただし遅い))


実際に使っている人の“感想”を聞けたのは貴重でした。
宣伝文句や想像している理想通りには動作しないってことですね、やはり^^;

討論会の次回のネタは未定とのことですが、聞きたいことを事前に募っておいて、答えられそう・面白そうなところから議論していくのもいいかも?



最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
HBaseとCassandra討論会のつっこみー。 (豊月)
2010-11-08 10:51:55
>HBaseはキーが偏ると一部のノードだけに負荷がかかる
これは「Cassandraは、キーが偏ると一部のノードだけに負荷が掛かる」です。
HBaseの場合は、リージョンファイル毎に分散させているので、リージョンファイルの指定サイズを越えてまで大きくなったら自動で分割されて、別のノードへ移ります。
Cassandraの場合、キーのハッシュを元に担当を決めるので巧くキーの生成ルールを考えないと特定ノードに負荷が集中する事になります。

>「このトークンはこのリング」
「Ring上で、このTokenはこのノード」という情報を管理している、が正しいです。

>Cassandraは構築は楽だが、故障時が面倒(リバランスに時間がかかる)
Cassandraに於いて面倒なのは、故障時じゃないです。
故障後の復旧が作業です。
復旧の方法も多数ありますし、Rebalanceを選択した場合、時間を喰います。

>HBaseはデータは他のリージョンにあるので故障時のデータコピーはマスターによってすぐ行われる(HBaseは構築は手間だが、故障時は楽)
HBaseはHDFS上にリージョン等の実フェアうを保存しています。
なのでHBaseのノードが落ちても、別のノードがHDFSからファイルを持ってくる仕組みです。
HBaseで障害発生した際に起きるのは、「HBaseのマスターノードによるデータのコピー」ではなく、「HBaseのマスターノードによる、各スレイブノードの担当するRegionの最割り当て」です。

>Cassandra+Hadoopは遅い。HBase+Hadoopはデータの局所性を認識してくれる
HBaseの場合は、物理的にそのデータファイルがあるノード上でMRの処理をしてくれます。所がCassandraでMRをやった場合、自分の所にないデータに対してMRを実行してしまう事がある為、通信に時間がかかり処理速度が遅くなります。

>HBaseにはカウント機能はある
出来ますが、かなり遅い処理です。

>Amazon EC2 スモールインスタンスだとメモリーが1.7GBしか無い。専用サーバーなら、Cassandraは4GB以上、HBaseは8GB(Hadoopを使うなら+4GB)
これは専用サーバではなく、推奨サーバのスペックです。Cassandra、HBaseの公式wikiに記載されています。
返信する
本文を修正しました (ひしだま)
2010-11-11 01:50:25
つっこみありがとうございます。ブログ本文を修正しました。
討論会の中心人物の一人につっこんでいただけて、ありがたいです!
返信する

コメントを投稿