20140418 info talkセミナー資料

818 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
818
On SlideShare
0
From Embeds
0
Number of Embeds
139
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

20140418 info talkセミナー資料

  1. 1. Kobe Digital Labo, Inc.          岩瀬 高博 Twitter: @okuyamaoo Mail: ta.okuyamaoo@gmail.com FemtoDB On memory document database
  2. 2. 自己紹介 ・岩瀬 高博(@okuyamaoo)  > (株) 神戸デジタル・ラボ所属 業務及び活動 >大規模e-コマースサイトのチューニング、運用 >分散処理、データベースの研究及び適応 >(独)情報通信研究機構 特別研究員      研究領域:大規模Webアーカイブ >分散KVS okuyama、CEP Setsuna の開発   >OSS、Java、DB、車が好き
  3. 3. 1.ドキュメント型データベース? 2.FemtoDBの紹介 今日のお話し
  4. 4. ドキュメント型データベース?
  5. 5. ドキュメント型データベース? ・ドキュメント型データベースとは? ・NOSQLデータベースと総称されるデータベースの中の1種類
  6. 6. NOSQL ・NOSQLデータベース ・NOSQLはSQLをインタフェースとしないデータベース ※wikipediaより
  7. 7. NOSQL ・NOSQLデータベース ・ 用途に特化させることで処理能力、キャパシティー 冗長性などの能力を高めたデータベース
  8. 8. NOSQL ・種類は? ・NOSQLは扱うデータ型に応じて種類分け出来きる
  9. 9. NOSQL ・種類は? Key-Value型 Column型 Document型 Graph型 ・NOSQLは扱うデータ型に応じて種類分け出来る
  10. 10. NOSQL ・種類は? ・NOSQLは扱うデータ型に応じて種類分け出来る Key-Value型 Column型 Document型 Graph型 一意のKeyと値の関係 もっともシンプルなモデル
  11. 11. NOSQL ・種類は? Key-Value型 Column型 Document型 Graph型 データをカラム単位で管理 カラム単位での操作が得意 ・NOSQLは扱うデータ型に応じて種類分け出来る
  12. 12. NOSQL ・種類は? Key-Value型 Column型 Document型 Graph型 グラフ構造データを管理 ファイルツリー、 ソーシャルグラフ ・NOSQLは扱うデータ型に応じて種類分け出来る
  13. 13. NOSQL ・種類は? Key-Value型 Column型 Document型 Graph型 ・NOSQLは扱うデータ型に応じて種類分け出来る
  14. 14. Document型 ・Document型データベースを詳しく ・扱うデータのフォーマットは? 自由なデータフォーマットを扱える 例えばリレーションナルデータベースの場合は? テーブル定義 create table UserMaster ( UserID varchar(10) pkey, Name   varchar(50), Address varchar(100), Birthday date, Tel varchar(15), deleteFlg boolean ) 事前にテーブル定義を作成 ↓ 定義に沿ったデータ構造で登録 定義をデータベースで管理する
  15. 15. Document型 ・Document型データベースを詳しく ・扱うデータのフォーマットは? 自由なデータフォーマットを扱える ではDocument型の場合は? 登録データ {”UserID” :”10001”, “Name” :”名前”, “Address” :”住所”, “Birthday” :”1981/09/08” “Tel” :”090-9999-8888”, “deleteFlg”:false } 登録されるデータ次第 ↓ データ構造に合った構造となる 定義をアプリケーションで管理する
  16. 16. Document型 ・Document型データベース ・どのような特徴なのか? 登録データ {”UserID” : ”10001”, “Name” : ”名前”, “Address” : ”住所”, “Birthday” : ”1981/09/08” “Tel” :”090-9999-8888” “deleteFlg”:false } 登録データ {”UserID” : ”10002”, “Name” : ”名前”, “Address” :”住所”, “Birthday” :”1981/10/12” “Tel” :”080-6666-7777”, “Mail” :”test@abc.co.jp”, “deleteFlg”:false } 上記の2データを[Address=“住所”]の条件のもと扱える データ構造の異なる2データを透過的に扱うことが出来る。 異なる部分の処理をアプリケーションに依存させる。
  17. 17. Document型 ・Document型データベース ・代表的なソフトウェアは? MongoDB 開発元:MongoDB Inc. 開発言語:C++ ライセンス:GNU AGPL v3.0 企業サポートなども展開している。 独自クライアントによる問い合わせが基本となる データはJSONで表現(内部はBSON)
  18. 18. Document型 ・Document型データベース ・代表的なソフトウェアは? CouchDB 開発元:Apache Software Foundation 開発言語:Erlang ライセンス:Apache License 2.0 Map/Reduceによるデータ操作 RestfulAPIによるアクセス (GET,POST,DELETなど) データはJSONとして表現
  19. 19. FemtoDB
  20. 20. FemtoDB? ・FemtoDBって? ・2014年より開発を開始したドキュメント型のデータベース 昨日Version 0.0.3をリリースしました   Apache License, Version 2.0
  21. 21. FemtoDB? ・なぜ開発したか? ・普段業務ではKVSのokuyamaを使ったアプリケーション開発 こういった用途には凄くむいている ・データ構造が単純 ・一意のデータ登録/取得がメイン  アプリケーションのキャッシュにしたり、ファイルサーバの バックエンドストレージなどにつかったり
  22. 22. FemtoDB? ・なぜ開発したか? ・あるときokuyamaを使ってサイト内商品検索エンジンを構築   >これを自社サービス化 顧客ECデータベース MySQLやOracleなど TSV 商品のデータを出力 商品データと 全文検索インデックスなどを 作成し登録 検索エンジンの フロントサーバが参照
  23. 23. FemtoDB? ・なぜ開発したか? ・いろいろ問題が これらのことから検索やソートが得意でトランザクションが使え データ構造が柔軟なデータベースをつくろうと考えた   ・トランザクションがないからデータの一括入れ替えとか出来ない   ・全文検索はokuyamaで、それ以外の検索、ソートは検索アプリ ケーション上で実現しておりロジックが複数箇所に点在 ・okuyama+検索アプリケーションサーバの構成なのでどうしても 構成が大きくなりがち
  24. 24. 特徴は? ・FemtoDBの特徴とは? ・ データ構造 ・ インタフェース ・ データアクセス機能 ・ トランザクション ・ データ管理機能
  25. 25. データ構造 ・FemtoDBのデータ構造 FemtoDB Table JSON
  26. 26. データ構造 ・FemtoDBのデータ構造 FemtoDB Table JSON ・1プロセスでのシングルプロセス構成 ・他プロセスとの連携等なし
  27. 27. データ構造 ・FemtoDBのデータ構造 FemtoDB Table JSON ・データ管理単位テーブル 全てのデータはいずれかのテーブルに属する ・リソースの許す限り作成可能
  28. 28. データ構造 ・FemtoDBのデータ構造 FemtoDB Table JSON ・KeyとValueが文字型である単純な連想配列型 ・ネストした形式は扱えない
  29. 29. データ構造 ・最小単位のJSON部分を詳しく JSON ・ネスト構造を持たない単純な構造のみ管理可能 {”UserID” :”10001”, “Name” :”名前”, “Address”:”住所”, “Birthday”:”1981/09/08”, “Tel” :”090-9999-8888”, “deleteFlg”:false } {”UserID” :”10001”, “Name” :”名前”, “Address” :”住所”, “Birthday” :”1981/09/08” “Tel” :”090-9999-8888”,  “School” :{“小学校”:”XXXX”, “中学校”:”YYYY”, “高校”:”ZZZZZ”} “deleteFlg”:false } 扱える 扱えない
  30. 30. データ構造 ・最小単位のJSON部分を詳しく 異なる構造のJSONを1テーブルで扱える ・以下の2種類のJSONデータを同じ条件で取得可能 {”UserID” :”10001”, “Name” :”名前XX”, “Address” :”住所XX”, “Birthday” :”1981/09/08” “Tel” :”090-9999-8888”, “deleteFlg” :false } {”UserID” :”10002”, “Name” :”名前YY”, “Address” :”住所YY”, “Birthday” :”1985/09/08” “HighSchool”:”YYY高校”, “deleteFlg” :false } ・「deleteFlg = false」の条件で2件とも取得可能 ・「Tel = “090-9999-8888」の条件でUserIDが10001だけ取得
  31. 31. 特徴は? ・FemtoDBの特徴とは? ・ データ構造 ・ インタフェース ・ データアクセス機能 ・ トランザクション ・ データ管理機能
  32. 32. インタフェース ・操作インターフェース ・RestfulAPIで全ての操作を行う 起動と同時にHTTPサーバが起動 ※デフォルトでは8080番ポートで起動
  33. 33. インタフェース FemtoDB HTTP:8080 ・HTTPサーバにはJettyを利用 ・ポートは起動引数で変更可能 ・最大同時接続数は起動引数にて指定可能 ・クエリの同時実行数は接続数とは個別で指定可能 ・HTTPSは未対応 ・RestfulAPIで全ての操作を行う 起動と同時にHTTPサーバが起動 ※デフォルトでは8080番ポートで起動 ・操作インターフェース
  34. 34. インタフェース ・RestfulAPIインタフェース ・リクエスト:パスとメソッドの組み合わせ ・レスポンス:JSON形式による応答 FemtoDB Request: GET : /femtodb/dataaccess {”UserID”:”10001”, “Name”:”名前”, “Address”:”住所”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } Response: text/json
  35. 35. インタフェース ・データローダー ・TSV/CSVファイルを登録するデータローダ FemtoDB ローダー TSV ・1トランザクション処理内で行われる  登録失敗等が起こると自動ロールバック ・カラム情報はヘッダーに定義するか自動作成
  36. 36. 特徴は? ・FemtoDBの特徴とは? ・ データ構造 ・ インタフェース ・ トランザクション ・ データアクセス機能 ・ データ管理機能
  37. 37. トランザクション ・トランザクション機能を搭載している MVCCを参考にしたトランザクション機能 ・MVCC(マルチバージョン コンカレンシー コントロール)  MVCCの動きは書き込みトランザクション中に読み込み  トランザクションが発生すると1つ前のバージョンの情報を返す   そのため読み込みと書き込み処理を同一データに対して  同時に実行可能
  38. 38. トランザクション ・MVCCの挙動 {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } 更新処理 1.トランザクション内で更新処理が始まる
  39. 39. トランザクション ・MVCCの挙動 {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } 更新処理 1.トランザクション内で更新処理が始まる 2.更新前データと更新中データが分離される {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } 更新前 更新中
  40. 40. トランザクション ・MVCCの挙動 {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } 更新前 更新中 更新処理 参照処理 1.トランザクション内で更新処理が始まる 2.更新前データと更新中データが分離される 3.参照処理には更新前データが返される
  41. 41. トランザクション ・MVCCの挙動 {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } {”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } 更新前 更新中 更新処理 参照処理 更新中データを別トランザクションが 更新しようとした場合は、後続処理がエラーとなる 別の更新処理 ☓
  42. 42. トランザクション ・トランザクションの適応範囲 ・全てのデータ操作処理(テーブル操作は対象外)は  トランザクションが適応されて処理される。 ・明示的なトランザクション開始、コミット、ロールバック、終了   トランザクションで隠蔽された範囲内で複数のデータ処理を 行うことができる。 ・開始を宣言しないオートコミットトランザクション 1リクエスト単位でトランザクションを作成し処理  処理失敗時は自動的にロールバック  処理成功時は自動的にコミット
  43. 43. 特徴は? ・FemtoDBの特徴とは? ・ データ構造 ・ インタフェース ・ トランザクション ・ データアクセス機能 ・ データ管理機能
  44. 44. データアクセス機能 ・FemtoDBへのアクセスAPI ・テーブル作成用API ・トランザクション操作用API ・データ操作用API
  45. 45. テーブル操作 ・テーブル操作API ・テーブルの作成 ・テーブル削除 ・インデックスの追加作成 ・テーブル情報の閲覧
  46. 46. テーブル操作 ・テーブル操作API ・テーブルの作成 URLパス:/femtodb/table メソッド:POST  パラメータ:table=usermst :indexcolumns=userid:equal http://localhost:8080/femtodb/table?table=usermst&indexcolumns=userid:equal 実際にURLで指定すると以下のようになる $curl http://localhost:8080/femtodb/table?table=usermst&indexcolumns=userid:equal -X POST
  47. 47. テーブル操作 ・テーブル操作API ・テーブルの作成 ・テーブル削除 ・インデックスの追加作成 ・テーブル情報の閲覧
  48. 48. テーブル操作 ・テーブル操作API ・テーブルの削除 URLパス:/femtodb/table メソッド:DELETE  パラメータ:table=usermst http://localhost:8080/femtodb/table?table=usermst 実際にURLで指定すると以下のようになる $curl “http://localhost:8080/femtodb/table?table=usermst” -X DELETE このようにURLとメソッドの 組み合わせで処理を実行
  49. 49. テーブル操作 ・テーブル操作API ・テーブルの作成 ・テーブル削除 ・インデックスの追加作成 ・テーブル情報の閲覧
  50. 50. テーブル操作 ・テーブル操作API ・インデックスの追加作成
  51. 51. インデックスの説明 ・検索用インデックスを作成可能  検索を高速に行うインデックスを作成可能 インデックスの種類は2種類 ハッシュIndex:完全一致、範囲一致用 テキストIndex:全文検索用のインデックス
  52. 52. インデックスの説明 ・ハッシュIndex データのカラムの値 カラムデータが同じデータ 100000 [{データ1},{データ5}] 100001 [{データ42},{データ452}] 108100 [{データ2},{データ6}, {データ9}] 200000 ・・・ 200100 ・・・ 200200 ・・・ 300009 ・・・ 400000 ・・・{”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } カラムデータの部分が 同じデータが束ねられるて 管理される
  53. 53. インデックスの説明 ・テキストIndex データのカラムの値 カラムデータが同じデータ 名前YY [{データ1},{データ5}] 名前XX [{データ42},{データ452}] 名前ZZ [{データ2},{データ6}, {データ9}] ・・・・・ ・・・ ・・・・・ ・・・ ・・・・・ ・・・ ・・・・・ ・・・ ・・・・・ ・・・{”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } カラム内の文字列を構文解析し 転置インデックスを作成 解析には形態素解析器の kuromojiを利用 m(_ _)m
  54. 54. テーブル操作 ・テーブル操作API ・インデックスの追加作成 URLパス:/femtodb/table メソッド:PUT  パラメータ:table=usermst :indexcolumns=userid:equal  テーブル作成時に指定しなかった場合に  データ登録後に追加作成可能
  55. 55. テーブル操作 ・テーブル操作API ・テーブルの作成 ・テーブル削除 ・インデックスの追加作成 ・テーブル情報の閲覧
  56. 56. テーブル操作 ・テーブル操作API ・テーブル閲覧 URLパス:/femtodb/table メソッド:GET  パラメータ:table=usermst  作成されているテーブルの一覧と  インデックスの一覧情報を取得
  57. 57. データアクセス機能 ・FemtoDBへのアクセスAPI ・テーブル作成用API ・トランザクション操作用API ・データ操作用API
  58. 58. トランザクション操作 ・トランザクション操作API トランザクション操作は大きく以下の4種類 ・トランザクションを開始する ・トランザクションをコミットする ・トランザクションをロールバックする ・トランザクションを終了する これらの命令がそれぞれAPIとして提供されている
  59. 59. トランザクション操作 ・利用イメージ 1.トランザクション開始API呼び出し FemtoDB ユニークなIDが返される 2. データ操作APIを呼び出す その際1で取得したIDをパラメータとして付加 3.コミット/ロールバックAPI呼び出し 1で取得したIDをパラメータとして付加 4.トランザクション終了API呼び出し 1で取得したIDをパラメータとして付加 transactionno=1002
  60. 60. トランザクション操作 ・利用イメージ 1.トランザクション開始API呼び出し FemtoDB ユニークなIDが返される 2. データ操作APIを呼び出す その際1で取得したIDをパラメータとして付加 3.コミット/ロールバックAPI呼び出し 1で取得したIDをパラメータとして付加 4.トランザクション終了API呼び出し 1で取得したIDをパラメータとして付加 ・異なるIDでデータ操作を呼び出し 2の操作中のデータは参照出来ない transactionno=9998
  61. 61. データアクセス機能 ・FemtoDBへのアクセスAPI ・テーブル作成用API ・トランザクション操作用API ・データ操作用API
  62. 62. データ操作 ・データ操作API ・データ登録 ・データ検索 ・データ更新 ・データ削除
  63. 63. データ操作 ・データ操作API ・データ登録 URLパス:/femtodb/dataaccess メソッド:POST  パラメータ:table=usermst :data={JSON形式} 実際にURLで指定すると以下のようになる $curl http://localhost:8080/femtodb/dataaccess -d “table=usermst“ -d “data={‘userid’:’0001’, ‘name’:’名前XXX’, ‘address’:’住所XXX’}” -d “data={‘userid’:’0002’, ‘name’:’名前YYY’, ‘tel’:’090-9999-8888’}” -X POST 主キーの概念はないので同一内容のデータも複数登録される
  64. 64. データ操作 ・データ操作API ・データ登録 ・データ検索 ・データ更新 ・データ削除
  65. 65. データ操作 ・データ操作API ・データ検索 URLパス:/femtodb/dataaccess メソッド:GET  パラメータ:table=usermst :where=条件 :sort=並び替えカラム名 :limit=取得件数 :offset=取得開始位置
  66. 66. データ操作 ・where部分 ・取得条件を指定 指定は カラム名 [条件式] パラメータ  条件式は “=“ , “text” , “<” ,”>” , “in”, “notin” ※ “=“及び、”text”は定義したインデックスカラムの場合      インデックス検索が行われる ※ 全てのデータに含まれないカラムの場合は含まれない データは除外される
  67. 67. データ操作 ・sort部分 ・並び替えを指定 指定は カラム名 順序 [数値ヒント] ・順序はasc/desc ・数値ヒントはデータを数値として並び替える   ※ データによってカラムが存在しない場合は後端へ
  68. 68. データ操作 ・データ操作API ・データ登録 ・データ検索 ・データ更新 ・データ削除
  69. 69. データ操作 ・データ操作API ・データ更新 URLパス:/femtodb/dataaccess メソッド:PUT  パラメータ:table=usermst :where=条件 :data={JSON} where部分は検索と同様の指定方法。インデックスも適応。 更新データはJSONフォーマットで指定 {“deleteflg”:”0”} 、 {“newcolumn”:”newdata”}
  70. 70. データ操作 ・データ操作API ・データ登録 ・データ検索 ・データ更新 ・データ削除
  71. 71. データ操作 ・データ操作API ・データ削除 URLパス:/femtodb/dataaccess メソッド:DELETE  パラメータ:table=usermst :where=条件 where部分は検索と同様の指定方法 インデックスも適応 条件の対象が全て削除される
  72. 72. データ操作 ・データ操作API ・トランザクションIDの付加   全てのデータ操作APIにトランザクションIDを 付加することが出来る 例)更新の場合 $curl http://localhost:8080/femtodb/dataaccess -d “table=usermst“ -d “where=userid = 0001” -d “data={‘deleteflg’:’1’}” -d “transactionno=1002” -X PUT
  73. 73. 特徴は? ・FemtoDBの特徴とは? ・ データ構造 ・ インタフェース ・ トランザクション ・ データアクセス機能 ・ データ管理機能
  74. 74. データ管理機能 ・全てのデータはメモリ上で管理 テーブル定義、データ、インデックス情報の 全てがメモリ上で管理される そのため処理においてディスクアクセスは発生しない FemtoDB テーブル作成、データ登録処理…etc データ検索処理…etc
  75. 75. データ管理機能 ・メモリデータ+ジャーナルファイル メモリ上のデータのため、FemtoDBが停止すると データは全て消失する 使いづらいのでジャーナル機能を搭載 ※デフォルトOff 起動オプションで利用可能 FemtoDB テーブル作成、データ登録処理…etc データ検索処理…etc データは全てメモリへ 参照も全てメモリ ・更新系操作は全てログとして記録 ・起動時にログからデータを復元
  76. 76. データ管理機能 ・スナップショット機能を開発中 ジャーナルファルだけでは操作の蓄積でログが肥大化し 復元が長時間化する  ・ 一定時間毎に全てのデータをストアするスナップショット機能 操作ログ 長時間稼働しデータ更新を 行うとログが肥大化する 最初から最後まで トレースするのに 凄く時間がかかる
  77. 77. データ管理機能 ・スナップショット機能を開発中 ジャーナルファルだけでは操作の蓄積でログが肥大化し 復元が長時間化する  ・ 一定時間毎に全てのデータをストアするスナップショット機能 操作ログ 稼働中にある程度 ログが溜まったタイミング でスナップショットを作成 FemtoDB スナップショット作成
  78. 78. データ管理機能 ・スナップショット機能を開発中 ジャーナルファルだけでは操作の蓄積でログが肥大化し 復元が長時間化する  ・ 一定時間毎に全てのデータをストアするスナップショット機能 操作ログ 稼働中にある程度 ログが溜まったタイミング でスナップショットを作成 FemtoDB スナップショット作成 作成した部分までを削除 操作ログ
  79. 79. 最後に ・Information GitHub   https://github.com/okuyamaoo/femtodb twitter @okuyamaoo
  80. 80. Thank you!

×