More Related Content
Similar to PHP開発者のためのNoSQL入門 (20)
PHP開発者のためのNoSQL入門
- 3. アジェンダ
①はじめに
②PHP + Cassandra
③PHP + MongoDB
④PHP + Hbase
⑤PHP + Kyoto Cabinet
⑥まとめ
3
Copyright © CA ADvance .inc 2012
- 4. ①はじめに
4
Copyright © CA ADvance .inc 2012
- 8. Cassandra とは
• Cassandraは、オープンソースの分散データベース管
理システムである。元はFacebook社において大規模
データの格納のために、開発されたものである。
• 2008年7月
• Facebook社がCassandraをOSSとして公開
• 2009年3月
• Apache Incubatorプロジェクトへ
• 2010年2月
• トップレベルプロジェクトに引き上げ
出典)Apache Cassandra - Wikipedia
http://ja.wikipedia.org/wiki/Apache_Cassandra 8
Copyright © CA ADvance .inc 2012
- 9. Cassandra の特徴
• 耐障害性
• データが自動的に複数のノードへとレプリケーションされ、
サービス提供不可となったノードが発生しても、システム
を停止することなくノードを入れ替えることが出来る。
• 分散特性
• クラスタ上の全ノードが同一の扱いとなっており、管理
ノードがない。つまり、SPOF(単一障害点)がない!
• 高可用性
• 性能はノード数によってリニアに増えていく!
• お金さえあれば、スケールアウトが容易なのかな?
• スキーマレス等
9
Copyright © CA ADvance .inc 2012
- 11. データ構造
• MySQLで例えると、
KeySpace ≒ Database
ColumnFamily ≒ Table
11
Copyright © CA ADvance .inc 2012
- 14. 使い方(CLI)
# 書き込み
set Users[jsmith][first] = 'John';
set Users[jsmith][last] = 'Smith';
set Users[jsmith][age] = long(42);
# 読み込み
get Users[jsmith];
=> (column=last, value=Smith, timestamp=1287604215498000)
=> (column=first, value=John, timestamp=1287604214111000)
=> (column=age, value=42, timestamp=1287604216661000)
Returned 3 results.
14
Copyright © CA ADvance .inc 2012
- 15. PHPとの連携
• 基本的に、Swift経由でDBにアクセスする
• 現状、phpcassa 使うのが無難かな?
→ググれば、「Apache Thrift」 のライブラリを利用した
サンプルがいくつかでてくるが情報が古い。。。
最新版のApche Thrift v0.8.0で生成したphpライブラリ
ではきちんと動かないので、却下!
『Class‘CassandraClient’not found』 とか出てくる。。。
• CQLが熱いみたいだけど、まだ試してない><
15
Copyright © CA ADvance .inc 2012
- 16. PHPCassa とは
• PHPからCassandraを利用するためのライブラ
リが、Githubに上がっていたのでこれ使ってみま
した!
thobbs/phpcassa
https://github.com/thobbs/phpcassa/
※Thobbs氏について、ネットストーキング調べてみたところ、
CassandraのメンテなであるDataStaxの社員でした
16
Copyright © CA ADvance .inc 2012
- 19. ハマりどころ
• PHPCassa自体かなり高機能なので、リファレンス周
りの読み込みに苦戦するかも、あと英語だるい。。。
• 適宜SuperColumnを使用できるといったが、あれは、
ColumnFamily(以下CF)ごとにON/OFFの設定をす
る必要があるため、事前に設計をきちんとやろう!
20
Copyright © CA ADvance .inc 2012
- 20. ハマりどころ
• ライブラリを使って、CF作成後、
すぐに作成したCFにアクセスすると、
CFないよーという例外で落ちる現象が発生!
→コネクション破棄して、再接続することで回避
21
Copyright © CA ADvance .inc 2012
- 21. まとめ
• 耐障害性が高く(可用性が高い)、システム的
にスケールアウトしやすいので、大容量なデー
タを扱うサービスに向いているかも
• データ階層がMySQLよりも深いため、ロジック
を組み込みやすい
KeySpace→ColumnFamily(→SuperColumn)→Column→Value
• ライブラリ周りは、若干はまりやすいので注
意!
22
Copyright © CA ADvance .inc 2012
- 23. MonoDB とは
• MongoDB は、高パフォーマンス、スキーマレス、オープン
ソースのドキュメント指向データベースである。
• MongoDB は、BSONというJSONのバイナリ版のような
形式でドキュメントを表現し、そのコレクションを管理す
る。この形式は、複雑な階層を持たせることができ、な
おかつクエリやインデックスが容易である。
MongoDB – Wikipedia
http://ja.wikipedia.org/wiki/MongoDB
24
Copyright © CA ADvance .inc 2012
- 24. MonoDB の特徴
• 高可用性
• スレーブが死んでも自動で切り離しできる
• レプリカ機能
• 新しいノード接続時、自動でデータの同期もしてくれる!
• スキーマレス
• あとでカラムが自由に増やせる。つまり、柔軟に対応可!
※バグ出ても気づきにくい
25
Copyright © CA ADvance .inc 2012
- 25. MonoDB の特徴
• インデックスのサポート (複数インデックス可)
• オート・シャーディング(スケールアウト)
• Map Reduce(集計処理)
• GridFS(ファイル格納システム)
26
Copyright © CA ADvance .inc 2012
- 26. データ構造
• データ格納例
DataBase→Collection→Key→Row→Value
※MySQLとほぼ一緒
27
Copyright © CA ADvance .inc 2012
- 27. データ構造
• MySQLで例えると、
Collection ≒ Table
28
Copyright © CA ADvance .inc 2012
- 28. MonoDB のセットアップ(CentOS 6.2 の場合)
•ファイルをダウンロード
# wget "http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.6.tgz"
•ファイルを解凍
# tar xzf mongodb-linux-x86_64-2.0.6.tgz
•シンボリックリンクを貼って
# ln –s ./mongodb-linux-x86_64-2.0.6 /usr/local/mongodb
•あとは、起動するだけ!
# /usr/local/mongodb/mongod --dbpath /tmp
29
Copyright © CA ADvance .inc 2012
- 31. SQL と MongoDB の比較
SQL Mongo クエリ言語
CREATE TABLE USERS (a Number, b Number) 暗黙的に行われます
INSERT INTO USERS VALUES(1,1) db.users.insert({a:1,b:1})
db.users.find({}, {a:1,b:1})
SELECT a,b FROM users
SELECT * FROM users db.users.find()
SELECT * FROM users WHERE age=18 db.users.find({age:18})
SELECT * FROM users WHERE age=18 ORDER BY
db.users.find({age:18}).sort({name:1})
name
SELECT * FROM users WHERE age>18 db.users.find({'age':{$gt:18}})})
32
Copyright © CA ADvance .inc 2012
- 36. PHPとの連携
• Peclにライブラリが公開されているので、インス
トールしましょう
# pecl install mongodb <= これだけ!
• ドライバ周りは込み入ってないので、あまり難しく
ないはず
• MongoDBのデータには型の概念があります。
PHPやってると忘れがちなので注意!
38
Copyright © CA ADvance .inc 2012
- 39. ハマりどころ
• データの検索をする際、数値型のデータを検索したいの
に、 文字リテラルでクエリを作らないこと!
array(id =>”1234”); ← こういうのは避けよう >_<
• PHPでMongoDBに日付を格納する際、
MongoDate型にして、格納する必要があるので注意!
• さらに言えば、MongoDateはグリニッジ標準時が基準に
なっているので、データ格納する際は、日本時間で格納
しないように!!!(-9:00してから格納しよう)
42
Copyright © CA ADvance .inc 2012
- 40. まとめ
• 耐障害性が高く、自動でレプリカへの同期も
やってくれるので、スケールアウトが容易
• スキーマレスでメンテも楽!
• 集計したい時は、MapReduceを使おう
• MongoDBDateハマりやすい
43
Copyright © CA ADvance .inc 2012
- 42. HBaseとは
• Apache HBaseはオープンソースの、列指向、分散
データベースであり、 GoogleのBigTableをモデルとし、
Javaにより書かれている。
• HDFS (Hadoop Distributed File System)の上で実
行され、Hadoopに対しBigTableのような機能を提供
する。
出典)Apache HBase - Wikipedia
http://ja.wikipedia.org/wiki/Apache_HBase 45
Copyright © CA ADvance .inc 2012
- 43. HBaseの特徴
• Hadoop のデータベースとして利用できる
• Hadoop 分散ファイルシステム(HDFS)上に構築
• 負荷に対して非常に高いスケーラビリティと性能を発揮
• (Cassandraよりも)シンプルな一貫性モデルを備えている
• 自動ロードバランス、フェイルオーバー、圧縮機能
• HadoopのMap Reduceにネィティブ対応等
46
Copyright © CA ADvance .inc 2012
- 44. データ構造
• データ格納例
Table→ColumnFamily→Column
47
Copyright © CA ADvance .inc 2012
- 46. 使い方(CLI)
# データ取得
> get ‘users’, ‘john smith;
# 検索
> scan‘users’, {COLUMNS=>’users’};
# データ削除
> deleteall ‘users’, ‘john smith’;
49
Copyright © CA ADvance .inc 2012
- 47. PHPとの連携
• 基本的に、Swift経由でDBにアクセスする
⇨ Cassandraと同等
• Thriftをインストールし、接続用のライブラリを自動生成
することにより連携できるようになります。
// thriftでライブラリを生成
# cd /usr/local/hbase/src/main/resources/org/apache/hadoop/hbase/thrift
# thrift --gen php Hbase.thrift
// php用のライブラリ置き場に移動
# mv gen-php/Hbase /usr/share/php/Thrift/packages/
50
Copyright © CA ADvance .inc 2012
- 52. ⑤PHP + Kyoto Cabinet
56
Copyright © CA ADvance .inc 2012
- 53. KyotoCabinetとは
• Kyoto CabinetはC++言語で実装された、キーバ
リュー型のデータベースライブラリ。
• DBは単純なレコード群を格納した単純なファイルで、
テーブルやデータ型の概念はない。
• Kyoto Cabinet:
• 軽量DBにライブラリ、DBMの実装方法を提供
• Kyoto Tycoon:
• 軽量DBサーバー、Kyoto Cabinetベースの永続化キャッ
シュサーバー
出典)Kyoto Cabinet: DBMの率直な壱実装
http://www.syboos.jp/oss/doc/kyotocabinet.html 57
Copyright © CA ADvance .inc 2012
- 54. KyotoCabinetの特徴
• 他言語によるバインディングが豊富
• C++で開発され, Java, Python, Ruby, Perlなどの言語
のAPIを提供
• ハッシュ系オンメモリーDB
• 高速・軽量
• コンセプト ⇨ 『memcachedの永続版』
• デーモンを再起動しても消えない!
• memcachedプロトコルを装備
• 既存システムへの差し替えが容易
58
Copyright © CA ADvance .inc 2012
- 55. データ構造
• データ格納例
Key→Value
Database
KEY1 Value1
KEY2 Value2
KEY3 Value3
59
Copyright © CA ADvance .inc 2012
- 56. 使い方(CLI)
# データ挿入
> ktremotemgr set key value;
# データ取得
> ktremotemgr get key; => value;
# データ削除
> ktremotemgr remove key;
60
Copyright © CA ADvance .inc 2012
- 58. サンプルプログラム
62
Copyright © CA ADvance .inc 2012
- 59. まとめ
• 基本的に、オンメモリDBなので高速、
しかも不揮発性!
• memcachedプロトコル完備
memcachedの代替として採用しやすい
プログラム改変なしで、システム差し替えできる
のは熱い!!!
63
Copyright © CA ADvance .inc 2012
- 60. ⑥考察・まとめ
64
Copyright © CA ADvance .inc 2012
- 61. 考察・まとめ
• 一言で、NoSQLと言っても、
• 大容量なデータの扱いが得意だったり、
• 一貫性が高かったり、
• 可用性が高かったり、
• (少ないデータだけど)I/Oが高速だったりと
システムごとに、性質の差がある。
必要に応じて、正しいDBを選択しよう!(無難な着地)
65
Copyright © CA ADvance .inc 2012