Kobe Digital Labo, Inc.
         岩瀬 高博
Twitter: @okuyamaoo
Mail: ta.okuyamaoo@gmail.com
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” :”test@abc.co.jp”,
“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!

20140418 info talkセミナー資料