20140418 info talkセミナー資料
TRANSCRIPT
Kobe Digital Labo, Inc.
岩瀬 高博 Twitter: @okuyamaoo
Mail: [email protected]
FemtoDB On memory document database
自己紹介 ・岩瀬 高博(@okuyamaoo) > (株) 神戸デジタル・ラボ所属
業務及び活動 >大規模e-コマースサイトのチューニング、運用 >分散処理、データベースの研究及び適応 >(独)情報通信研究機構 特別研究員 研究領域:大規模Webアーカイブ
>分散KVS okuyama、CEP Setsuna の開発 >OSS、Java、DB、車が好き
1.ドキュメント型データベース?
2.FemtoDBの紹介
今日のお話し
ドキュメント型データベース?
ドキュメント型データベース? ・ドキュメント型データベースとは?
・NOSQLデータベースと総称されるデータベースの中の1種類
NOSQL ・NOSQLデータベース
・NOSQLはSQLをインタフェースとしないデータベース
※wikipediaより
NOSQL ・NOSQLデータベース
・ 用途に特化させることで処理能力、キャパシティー
冗長性などの能力を高めたデータベース
NOSQL ・種類は?
・NOSQLは扱うデータ型に応じて種類分け出来きる
NOSQL ・種類は?
Key-Value型 Column型
Document型 Graph型
・NOSQLは扱うデータ型に応じて種類分け出来る
NOSQL ・種類は?
・NOSQLは扱うデータ型に応じて種類分け出来る
Key-Value型 Column型
Document型 Graph型
一意のKeyと値の関係
もっともシンプルなモデル
NOSQL ・種類は?
Key-Value型 Column型
Document型 Graph型
データをカラム単位で管理
カラム単位での操作が得意
・NOSQLは扱うデータ型に応じて種類分け出来る
NOSQL ・種類は?
Key-Value型 Column型
Document型 Graph型 グラフ構造データを管理
ファイルツリー、 ソーシャルグラフ
・NOSQLは扱うデータ型に応じて種類分け出来る
NOSQL ・種類は?
Key-Value型 Column型
Document型 Graph型
・NOSQLは扱うデータ型に応じて種類分け出来る
Document型 ・Document型データベースを詳しく
・扱うデータのフォーマットは?
自由なデータフォーマットを扱える
例えばリレーションナルデータベースの場合は?
テーブル定義 create table UserMaster ( UserID varchar(10) pkey, Name varchar(50), Address varchar(100), Birthday date, Tel varchar(15), deleteFlg boolean )
事前にテーブル定義を作成 ↓
定義に沿ったデータ構造で登録
定義をデータベースで管理する
Document型 ・Document型データベースを詳しく
・扱うデータのフォーマットは?
自由なデータフォーマットを扱える
ではDocument型の場合は?
登録データ {”UserID” :”10001”, “Name” :”名前”, “Address” :”住所”, “Birthday” :”1981/09/08” “Tel” :”090-9999-8888”, “deleteFlg”:false }
登録されるデータ次第 ↓
データ構造に合った構造となる
定義をアプリケーションで管理する
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” :”[email protected]”, “deleteFlg”:false }
上記の2データを[Address=“住所”]の条件のもと扱える
データ構造の異なる2データを透過的に扱うことが出来る。 異なる部分の処理をアプリケーションに依存させる。
Document型 ・Document型データベース
・代表的なソフトウェアは?
MongoDB 開発元:MongoDB Inc. 開発言語:C++ ライセンス:GNU AGPL v3.0 企業サポートなども展開している。 独自クライアントによる問い合わせが基本となる データはJSONで表現(内部はBSON)
Document型 ・Document型データベース
・代表的なソフトウェアは?
CouchDB 開発元:Apache Software Foundation 開発言語:Erlang ライセンス:Apache License 2.0 Map/Reduceによるデータ操作 RestfulAPIによるアクセス (GET,POST,DELETなど) データはJSONとして表現
FemtoDB
FemtoDB? ・FemtoDBって?
・2014年より開発を開始したドキュメント型のデータベース
昨日Version 0.0.3をリリースしました
Apache License, Version 2.0
FemtoDB? ・なぜ開発したか?
・普段業務ではKVSのokuyamaを使ったアプリケーション開発
こういった用途には凄くむいている
・データ構造が単純
・一意のデータ登録/取得がメイン
アプリケーションのキャッシュにしたり、ファイルサーバの
バックエンドストレージなどにつかったり
FemtoDB? ・なぜ開発したか?
・あるときokuyamaを使ってサイト内商品検索エンジンを構築
>これを自社サービス化
顧客ECデータベース MySQLやOracleなど
TSV
商品のデータを出力 商品データと 全文検索インデックスなどを
作成し登録
検索エンジンの フロントサーバが参照
FemtoDB? ・なぜ開発したか?
・いろいろ問題が
これらのことから検索やソートが得意でトランザクションが使え
データ構造が柔軟なデータベースをつくろうと考えた
・トランザクションがないからデータの一括入れ替えとか出来ない
・全文検索はokuyamaで、それ以外の検索、ソートは検索アプリ ケーション上で実現しておりロジックが複数箇所に点在 ・okuyama+検索アプリケーションサーバの構成なのでどうしても 構成が大きくなりがち
特徴は? ・FemtoDBの特徴とは?
・ データ構造
・ インタフェース
・ データアクセス機能
・ トランザクション
・ データ管理機能
データ構造 ・FemtoDBのデータ構造
FemtoDB
Table
JSON
データ構造 ・FemtoDBのデータ構造
FemtoDB
Table
JSON
・1プロセスでのシングルプロセス構成 ・他プロセスとの連携等なし
データ構造 ・FemtoDBのデータ構造
FemtoDB
Table
JSON
・データ管理単位テーブル 全てのデータはいずれかのテーブルに属する ・リソースの許す限り作成可能
データ構造 ・FemtoDBのデータ構造
FemtoDB
Table
JSON ・KeyとValueが文字型である単純な連想配列型 ・ネストした形式は扱えない
データ構造 ・ 小単位の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 }
扱える
扱えない
データ構造 ・ 小単位の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だけ取得
特徴は? ・FemtoDBの特徴とは?
・ データ構造
・ インタフェース
・ データアクセス機能
・ トランザクション
・ データ管理機能
インタフェース ・操作インターフェース
・RestfulAPIで全ての操作を行う 起動と同時にHTTPサーバが起動 ※デフォルトでは8080番ポートで起動
インタフェース
FemtoDB
HTTP:8080 ・HTTPサーバにはJettyを利用 ・ポートは起動引数で変更可能 ・ 大同時接続数は起動引数にて指定可能 ・クエリの同時実行数は接続数とは個別で指定可能 ・HTTPSは未対応
・RestfulAPIで全ての操作を行う 起動と同時にHTTPサーバが起動 ※デフォルトでは8080番ポートで起動
・操作インターフェース
インタフェース ・RestfulAPIインタフェース
・リクエスト:パスとメソッドの組み合わせ
・レスポンス:JSON形式による応答
FemtoDB
Request: GET : /femtodb/dataaccess
{”UserID”:”10001”, “Name”:”名前”, “Address”:”住所”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false }
Response: text/json
インタフェース ・データローダー
・TSV/CSVファイルを登録するデータローダ
FemtoDB
ローダー TSV
・1トランザクション処理内で行われる 登録失敗等が起こると自動ロールバック ・カラム情報はヘッダーに定義するか自動作成
特徴は? ・FemtoDBの特徴とは?
・ データ構造
・ インタフェース
・ トランザクション
・ データアクセス機能
・ データ管理機能
トランザクション ・トランザクション機能を搭載している
MVCCを参考にしたトランザクション機能
・MVCC(マルチバージョン コンカレンシー コントロール)
MVCCの動きは書き込みトランザクション中に読み込み
トランザクションが発生すると1つ前のバージョンの情報を返す
そのため読み込みと書き込み処理を同一データに対して
同時に実行可能
トランザクション ・MVCCの挙動
{”UserID”:”10001”, “Name”:”名前XX”, “Address”:”住所XX”, “Birthday”:”1981/09/08” “Tel”:”090-9999-8888” “deleteFlg”:false } 更新処理
1.トランザクション内で更新処理が始まる
トランザクション ・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 }
更新前
更新中
トランザクション ・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.参照処理には更新前データが返される
トランザクション ・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リクエスト単位でトランザクションを作成し処理 処理失敗時は自動的にロールバック 処理成功時は自動的にコミット
特徴は? ・FemtoDBの特徴とは?
・ データ構造
・ インタフェース
・ トランザクション
・ データアクセス機能
・ データ管理機能
データアクセス機能 ・FemtoDBへのアクセスAPI
・テーブル作成用API
・トランザクション操作用API
・データ操作用API
テーブル操作 ・テーブル操作API
・テーブルの作成
・テーブル削除
・インデックスの追加作成
・テーブル情報の閲覧
テーブル操作 ・テーブル操作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
テーブル操作 ・テーブル操作API
・テーブルの作成
・テーブル削除
・インデックスの追加作成
・テーブル情報の閲覧
テーブル操作 ・テーブル操作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とメソッドの
組み合わせで処理を実行
テーブル操作 ・テーブル操作API
・テーブルの作成
・テーブル削除
・インデックスの追加作成
・テーブル情報の閲覧
テーブル操作 ・テーブル操作API
・インデックスの追加作成
インデックスの説明 ・検索用インデックスを作成可能
検索を高速に行うインデックスを作成可能
インデックスの種類は2種類
ハッシュIndex:完全一致、範囲一致用 テキストIndex:全文検索用のインデックス
インデックスの説明 ・ハッシュ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 }
カラムデータの部分が 同じデータが束ねられるて 管理される
インデックスの説明 ・テキスト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
テーブル操作 ・テーブル操作API
・インデックスの追加作成 URLパス:/femtodb/table メソッド:PUT パラメータ:table=usermst :indexcolumns=userid:equal テーブル作成時に指定しなかった場合に データ登録後に追加作成可能
テーブル操作 ・テーブル操作API
・テーブルの作成
・テーブル削除
・インデックスの追加作成
・テーブル情報の閲覧
テーブル操作 ・テーブル操作API
・テーブル閲覧 URLパス:/femtodb/table メソッド:GET パラメータ:table=usermst 作成されているテーブルの一覧と インデックスの一覧情報を取得
データアクセス機能 ・FemtoDBへのアクセスAPI
・テーブル作成用API
・トランザクション操作用API
・データ操作用API
トランザクション操作 ・トランザクション操作API
トランザクション操作は大きく以下の4種類
・トランザクションを開始する
・トランザクションをコミットする
・トランザクションをロールバックする
・トランザクションを終了する
これらの命令がそれぞれAPIとして提供されている
トランザクション操作 ・利用イメージ
1.トランザクション開始API呼び出し
FemtoDB
ユニークなIDが返される
2. データ操作APIを呼び出す その際1で取得したIDをパラメータとして付加
3.コミット/ロールバックAPI呼び出し 1で取得したIDをパラメータとして付加
4.トランザクション終了API呼び出し 1で取得したIDをパラメータとして付加
transactionno=1002
トランザクション操作 ・利用イメージ
1.トランザクション開始API呼び出し
FemtoDB
ユニークなIDが返される
2. データ操作APIを呼び出す その際1で取得したIDをパラメータとして付加
3.コミット/ロールバックAPI呼び出し 1で取得したIDをパラメータとして付加
4.トランザクション終了API呼び出し 1で取得したIDをパラメータとして付加
・異なるIDでデータ操作を呼び出し 2の操作中のデータは参照出来ない
transactionno=9998
データアクセス機能 ・FemtoDBへのアクセスAPI
・テーブル作成用API
・トランザクション操作用API
・データ操作用API
データ操作 ・データ操作API
・データ登録
・データ検索
・データ更新
・データ削除
データ操作 ・データ操作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
主キーの概念はないので同一内容のデータも複数登録される
データ操作 ・データ操作API
・データ登録
・データ検索
・データ更新
・データ削除
データ操作 ・データ操作API
・データ検索 URLパス:/femtodb/dataaccess メソッド:GET パラメータ:table=usermst :where=条件 :sort=並び替えカラム名 :limit=取得件数 :offset=取得開始位置
データ操作 ・where部分
・取得条件を指定
指定は
カラム名 [条件式] パラメータ
条件式は “=“ , “text” , “<” ,”>” , “in”, “notin” ※ “=“及び、”text”は定義したインデックスカラムの場合 インデックス検索が行われる
※ 全てのデータに含まれないカラムの場合は含まれない データは除外される
データ操作 ・sort部分
・並び替えを指定
指定は
カラム名 順序 [数値ヒント]
・順序はasc/desc
・数値ヒントはデータを数値として並び替える
※ データによってカラムが存在しない場合は後端へ
データ操作 ・データ操作API
・データ登録
・データ検索
・データ更新
・データ削除
データ操作 ・データ操作API
・データ更新
URLパス:/femtodb/dataaccess メソッド:PUT パラメータ:table=usermst :where=条件 :data={JSON} where部分は検索と同様の指定方法。インデックスも適応。
更新データはJSONフォーマットで指定 {“deleteflg”:”0”} 、 {“newcolumn”:”newdata”}
データ操作 ・データ操作API
・データ登録
・データ検索
・データ更新
・データ削除
データ操作 ・データ操作API
・データ削除
URLパス:/femtodb/dataaccess メソッド:DELETE パラメータ:table=usermst :where=条件
where部分は検索と同様の指定方法 インデックスも適応
条件の対象が全て削除される
データ操作 ・データ操作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
特徴は? ・FemtoDBの特徴とは?
・ データ構造
・ インタフェース
・ トランザクション
・ データアクセス機能
・ データ管理機能
データ管理機能 ・全てのデータはメモリ上で管理
テーブル定義、データ、インデックス情報の
全てがメモリ上で管理される
そのため処理においてディスクアクセスは発生しない
FemtoDB
テーブル作成、データ登録処理…etc
データ検索処理…etc
データ管理機能 ・メモリデータ+ジャーナルファイル
メモリ上のデータのため、FemtoDBが停止すると
データは全て消失する
使いづらいのでジャーナル機能を搭載 ※デフォルトOff 起動オプションで利用可能
FemtoDB
テーブル作成、データ登録処理…etc
データ検索処理…etc
データは全てメモリへ 参照も全てメモリ
・更新系操作は全てログとして記録 ・起動時にログからデータを復元
データ管理機能 ・スナップショット機能を開発中
ジャーナルファルだけでは操作の蓄積でログが肥大化し
復元が長時間化する
・ 一定時間毎に全てのデータをストアするスナップショット機能
操作ログ
長時間稼働しデータ更新を 行うとログが肥大化する
初から 後まで トレースするのに 凄く時間がかかる
データ管理機能 ・スナップショット機能を開発中
ジャーナルファルだけでは操作の蓄積でログが肥大化し
復元が長時間化する
・ 一定時間毎に全てのデータをストアするスナップショット機能
操作ログ
稼働中にある程度 ログが溜まったタイミングでスナップショットを作成
FemtoDB スナップショット作成
データ管理機能 ・スナップショット機能を開発中
ジャーナルファルだけでは操作の蓄積でログが肥大化し
復元が長時間化する
・ 一定時間毎に全てのデータをストアするスナップショット機能
操作ログ
稼働中にある程度 ログが溜まったタイミングでスナップショットを作成
FemtoDB スナップショット作成
作成した部分までを削除
操作ログ
後に ・Information GitHub https://github.com/okuyamaoo/femtodb
twitter @okuyamaoo
Thank you!