PHP開発者のためのNoSQL入門

5,941 views

Published on

NoSQLを触ってみたいPHP開発者向けに、資料を作ってみました。

沖縄PHP&MySQL勉強会 | イベントアテンド [ATND] でイベント作成・チケット販売・参加者の出欠管理
http://atnd.org/event/E0008436

PHP開発者のためのNoSQL入門

  1. 1. PHP開発者のためのNoSQL入門 株式会社シーエー・アドバンス 技術推進グループ 仲里 淳矢 Copyright © CA ADvance .inc 2012
  2. 2. 自己紹介•株式会社シーエー・アドバンスの仲里です。(エンジニア歴3年)•技術推進グループに所属してます。•沖縄高専卒です。•開発環境は主にvim使ってます。•主な業務内容 • PHPによる社内管理画面開発(SEM系、GoogleAdwords等) • 社内のインフラ整備 •CentOS上で動く、ApacheとかMySQLの保守 • NoSQL推進 •MongoDB導入 •社内の既存システムのNoSQL対応(パフォーマンスUpのため) •KyotoCabinet導入したり、、、 2 Copyright © CA ADvance .inc 2012
  3. 3. アジェンダ ①はじめに ②PHP + Cassandra ③PHP + MongoDB ④PHP + Hbase ⑤PHP + Kyoto Cabinet ⑥まとめ 3 Copyright © CA ADvance .inc 2012
  4. 4. ①はじめに 4Copyright © CA ADvance .inc 2012
  5. 5. はじめに•このテーマを選んだ目的として、 •NoSQLがどういったものなのか •PHPと連携するにはどうすればいいのか というのを知っていただきたく、 本テーマを選ばせていただきました。 テーマ欲張りすぎたかも>_< 5 Copyright © CA ADvance .inc 2012
  6. 6. 社内の背景として•社内で扱うデータ量が膨大になってきており、MySQLだと、手に負えなくなってくる可能性が浮上してきた。•それを打破すべく、NoSQLの調査・検証を進めています。 6 Copyright © CA ADvance .inc 2012
  7. 7. ②PHP + Cassandra 7 Copyright © CA ADvance .inc 2012
  8. 8. Cassandra とは• Cassandraは、オープンソースの分散データベース管 理システムである。元はFacebook社において大規模 データの格納のために、開発されたものである。• 2008年7月 • Facebook社がCassandraをOSSとして公開• 2009年3月 • Apache Incubatorプロジェクトへ• 2010年2月 • トップレベルプロジェクトに引き上げ出典)Apache Cassandra - Wikipediahttp://ja.wikipedia.org/wiki/Apache_Cassandra 8 Copyright © CA ADvance .inc 2012
  9. 9. Cassandra の特徴• 耐障害性 • データが自動的に複数のノードへとレプリケーションされ、 サービス提供不可となったノードが発生しても、システム を停止することなくノードを入れ替えることが出来る。• 分散特性 • クラスタ上の全ノードが同一の扱いとなっており、管理 ノードがない。つまり、SPOF(単一障害点)がない!• 高可用性 • 性能はノード数によってリニアに増えていく! • お金さえあれば、スケールアウトが容易なのかな?• スキーマレス等 9 Copyright © CA ADvance .inc 2012
  10. 10. データ構造• データ格納例 KeySpace→ColumnFamily→Column→Value または、 KeySpace→ColumnFamily(→SuperColumn)→Column→Value ※SuperColumnは任意でつけれる 10 Copyright © CA ADvance .inc 2012
  11. 11. データ構造• MySQLで例えると、 KeySpace ≒ Database ColumnFamily ≒ Table 11 Copyright © CA ADvance .inc 2012
  12. 12. データ構造 データアクセスについて、プログラムで書くと、 こんな感じ。 $target_column = $cf[super_column][column]; 12 Copyright © CA ADvance .inc 2012
  13. 13. 使い方(CLI)# キースペースの作成create keyspace Keyspace1;# 使用するキースペース宣言use Keyspace;# カラムファミリ作成create column family Users; 13 Copyright © CA ADvance .inc 2012
  14. 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. 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. 16. PHPCassa とは• PHPからCassandraを利用するためのライブラ リが、Githubに上がっていたのでこれ使ってみま した! thobbs/phpcassa https://github.com/thobbs/phpcassa/※Thobbs氏について、ネットストーキング調べてみたところ、CassandraのメンテなであるDataStaxの社員でした 16 Copyright © CA ADvance .inc 2012
  17. 17. サンプルプログラム 1/2 18 Copyright © CA ADvance .inc 2012
  18. 18. サンプルプログラム 2/2 19 Copyright © CA ADvance .inc 2012
  19. 19. ハマりどころ• PHPCassa自体かなり高機能なので、リファレンス周 りの読み込みに苦戦するかも、あと英語だるい。。。• 適宜SuperColumnを使用できるといったが、あれは、 ColumnFamily(以下CF)ごとにON/OFFの設定をす る必要があるため、事前に設計をきちんとやろう! 20 Copyright © CA ADvance .inc 2012
  20. 20. ハマりどころ• ライブラリを使って、CF作成後、 すぐに作成したCFにアクセスすると、 CFないよーという例外で落ちる現象が発生! →コネクション破棄して、再接続することで回避 21 Copyright © CA ADvance .inc 2012
  21. 21. まとめ• 耐障害性が高く(可用性が高い)、システム的 にスケールアウトしやすいので、大容量なデー タを扱うサービスに向いているかも• データ階層がMySQLよりも深いため、ロジック を組み込みやすい KeySpace→ColumnFamily(→SuperColumn)→Column→Value• ライブラリ周りは、若干はまりやすいので注 意! 22 Copyright © CA ADvance .inc 2012
  22. 22. ③PHP + MongoDB 23 Copyright © CA ADvance .inc 2012
  23. 23. MonoDB とは• MongoDB は、高パフォーマンス、スキーマレス、オープン ソースのドキュメント指向データベースである。• MongoDB は、BSONというJSONのバイナリ版のような 形式でドキュメントを表現し、そのコレクションを管理す る。この形式は、複雑な階層を持たせることができ、な おかつクエリやインデックスが容易である。MongoDB – Wikipediahttp://ja.wikipedia.org/wiki/MongoDB 24 Copyright © CA ADvance .inc 2012
  24. 24. MonoDB の特徴• 高可用性 • スレーブが死んでも自動で切り離しできる• レプリカ機能 • 新しいノード接続時、自動でデータの同期もしてくれる!• スキーマレス • あとでカラムが自由に増やせる。つまり、柔軟に対応可! ※バグ出ても気づきにくい 25 Copyright © CA ADvance .inc 2012
  25. 25. MonoDB の特徴• インデックスのサポート (複数インデックス可)• オート・シャーディング(スケールアウト)• Map Reduce(集計処理)• GridFS(ファイル格納システム) 26 Copyright © CA ADvance .inc 2012
  26. 26. データ構造• データ格納例 DataBase→Collection→Key→Row→Value ※MySQLとほぼ一緒 27 Copyright © CA ADvance .inc 2012
  27. 27. データ構造• MySQLで例えると、 Collection ≒ Table 28 Copyright © CA ADvance .inc 2012
  28. 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
  29. 29. 使い方(CLI)#Shellの起動 ./bin/mongo# DB表示 > show dbs# DB選択 > use db_name 30 Copyright © CA ADvance .inc 2012
  30. 30. 使い方(CLI)#データ検索 > db.users.find({}, {a:1,b:1})#データ登録 > db.users.insert({a:1,b:1})#データ削除 > db.things.remove({_id: myobject._id}); 31 Copyright © CA ADvance .inc 2012
  31. 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 usersSELECT * 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})nameSELECT * FROM users WHERE age>18 db.users.find({age:{$gt:18}})}) 32 Copyright © CA ADvance .inc 2012
  32. 32. クエリ発行•インデックスの作成や、コレクションのtruncateもできます! db.users.ensureIndex({user_id:1}); db.users.remove();•Upsertと機能があって、これが地味に便利そう •データがあれば、アップデート、なければインサートしてく れるみたい 33 Copyright © CA ADvance .inc 2012
  33. 33. MapReduce• バッチでのデータ処理や集計処理で利用します。• 基本、入力値として、コレクションを投入し、 出力値として、コレクションへデータを流します。• 使いドコロとしては、細かいデータをデイリー・マンスリー でまとめたい時、効力を発揮するかも!• Javascriptで組んでMongoDB に流しこむイメージです。 34 Copyright © CA ADvance .inc 2012
  34. 34. サンプルプログラム(Map Reduce) 1/2 36 Copyright © CA ADvance .inc 2012
  35. 35. サンプルプログラム(Map Reduce) 2/2 37 Copyright © CA ADvance .inc 2012
  36. 36. PHPとの連携• Peclにライブラリが公開されているので、インス トールしましょう # pecl install mongodb <= これだけ!• ドライバ周りは込み入ってないので、あまり難しく ないはず• MongoDBのデータには型の概念があります。 PHPやってると忘れがちなので注意! 38 Copyright © CA ADvance .inc 2012
  37. 37. サンプルプログラム 1/2 40 Copyright © CA ADvance .inc 2012
  38. 38. サンプルプログラム 2/2 41 Copyright © CA ADvance .inc 2012
  39. 39. ハマりどころ• データの検索をする際、数値型のデータを検索したいの に、 文字リテラルでクエリを作らないこと! array(id =>”1234”); ← こういうのは避けよう >_<• PHPでMongoDBに日付を格納する際、 MongoDate型にして、格納する必要があるので注意!• さらに言えば、MongoDateはグリニッジ標準時が基準に なっているので、データ格納する際は、日本時間で格納 しないように!!!(-9:00してから格納しよう) 42 Copyright © CA ADvance .inc 2012
  40. 40. まとめ• 耐障害性が高く、自動でレプリカへの同期も やってくれるので、スケールアウトが容易• スキーマレスでメンテも楽!• 集計したい時は、MapReduceを使おう• MongoDBDateハマりやすい 43 Copyright © CA ADvance .inc 2012
  41. 41. ④PHP + HBase 44 Copyright © CA ADvance .inc 2012
  42. 42. HBaseとは• Apache HBaseはオープンソースの、列指向、分散 データベースであり、 GoogleのBigTableをモデルとし、 Javaにより書かれている。• HDFS (Hadoop Distributed File System)の上で実 行され、Hadoopに対しBigTableのような機能を提供 する。出典)Apache HBase - Wikipediahttp://ja.wikipedia.org/wiki/Apache_HBase 45 Copyright © CA ADvance .inc 2012
  43. 43. HBaseの特徴• Hadoop のデータベースとして利用できる• Hadoop 分散ファイルシステム(HDFS)上に構築• 負荷に対して非常に高いスケーラビリティと性能を発揮• (Cassandraよりも)シンプルな一貫性モデルを備えている• 自動ロードバランス、フェイルオーバー、圧縮機能• HadoopのMap Reduceにネィティブ対応等 46 Copyright © CA ADvance .inc 2012
  44. 44. データ構造• データ格納例 Table→ColumnFamily→Column 47 Copyright © CA ADvance .inc 2012
  45. 45. 使い方(CLI)# シェルを起動> hbase-0.92.0/bin/hbase shell# テーブル作成> create ‘users’, ‘name’, ‘age’;# データ挿入> put ‘users’, ‘john smith’, ‘21’; 48 Copyright © CA ADvance .inc 2012
  46. 46. 使い方(CLI)# データ取得> get ‘users’, ‘john smith;# 検索> scan‘users’, {COLUMNS=>’users’};# データ削除> deleteall ‘users’, ‘john smith’; 49 Copyright © CA ADvance .inc 2012
  47. 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
  48. 48. サンプルプログラム 1/2 52 Copyright © CA ADvance .inc 2012
  49. 49. サンプルプログラム 2/2 53 Copyright © CA ADvance .inc 2012
  50. 50. 使用感• ベンチーマークって見ると多少重い。。。• 一貫性の高いシステムなので、速度に関しては致し方 ない?(トレードオフの観点で)• なので、バックエンドで使おう! • 大容量データの操作、バッチ系の処理に向いている • フロントエンドに持ってくるのはちょっと怖い 54 Copyright © CA ADvance .inc 2012
  51. 51. まとめ• 基本、Swift経由でDBにアクセス• 重い処理が得意なのでバックエンドで使おう!• Hadoop, HDFS, MapReduce等いろいろ視野に 入ってくるため、難易度は高めかも 55 Copyright © CA ADvance .inc 2012
  52. 52. ⑤PHP + Kyoto Cabinet 56 Copyright © CA ADvance .inc 2012
  53. 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. 54. KyotoCabinetの特徴• 他言語によるバインディングが豊富 • C++で開発され, Java, Python, Ruby, Perlなどの言語 のAPIを提供• ハッシュ系オンメモリーDB • 高速・軽量• コンセプト ⇨ 『memcachedの永続版』 • デーモンを再起動しても消えない!• memcachedプロトコルを装備 • 既存システムへの差し替えが容易 58 Copyright © CA ADvance .inc 2012
  55. 55. データ構造• データ格納例 Key→Value Database KEY1 Value1 KEY2 Value2 KEY3 Value3 59 Copyright © CA ADvance .inc 2012
  56. 56. 使い方(CLI)# データ挿入> ktremotemgr set key value;# データ取得> ktremotemgr get key; => value;# データ削除> ktremotemgr remove key; 60 Copyright © CA ADvance .inc 2012
  57. 57. PHPとの連携• Memcachedプロトコルを使って接続する • pecl install libmemcached # これ叩けば準備OKというか、、、これ以上いうことがない。。。 61 Copyright © CA ADvance .inc 2012
  58. 58. サンプルプログラム 62 Copyright © CA ADvance .inc 2012
  59. 59. まとめ• 基本的に、オンメモリDBなので高速、 しかも不揮発性!• memcachedプロトコル完備 memcachedの代替として採用しやすい プログラム改変なしで、システム差し替えできる のは熱い!!! 63 Copyright © CA ADvance .inc 2012
  60. 60. ⑥考察・まとめ 64Copyright © CA ADvance .inc 2012
  61. 61. 考察・まとめ• 一言で、NoSQLと言っても、 • 大容量なデータの扱いが得意だったり、 • 一貫性が高かったり、 • 可用性が高かったり、 • (少ないデータだけど)I/Oが高速だったりと システムごとに、性質の差がある。 必要に応じて、正しいDBを選択しよう!(無難な着地) 65 Copyright © CA ADvance .inc 2012
  62. 62. 考察・まとめ• コーディングに関して、難易度はドライバによりけり。。。• 基本枯れたシステムではないため、システム自体のリ リース頻度はかなり高め!• 物によっては、新機能がでたり、ドライバがどんどん新 しくなったり、廃れちゃったり、DBの下位互換が消えた りとインフラ担当への負担が高めになる傾向があるの で、そのへん気をつけよう! 66 Copyright © CA ADvance .inc 2012
  63. 63. 社内でのNoSQL導入への動き• 現状、社内では、Kyoto Cabinetがサービスとして、 稼働しています。[Kyoto Cabinet]• Memcachedと違って不揮発性なため、 サーバーが落ちても、復旧が容易で管理も楽に! 67 Copyright © CA ADvance .inc 2012
  64. 64. 社内でのNoSQL導入への動き• 今後の動きとして、 MongoDB、HBaseの導入を検討中! 68 Copyright © CA ADvance .inc 2012
  65. 65. 社内でのNoSQL導入への動き[MongoDB]• 社内システムのログの吐き出し先として、利用を検討中 ⇨Fluentd+MongoDB構成で考えてる ⇨目視ログチェックをシステム化したいという目論見[HBase]• テキストマイニングでの利用を検討中 69 Copyright © CA ADvance .inc 2012
  66. 66. ご清聴ありがとうございました。 70 Copyright © CA ADvance .inc 2012

×