riak 2.0 pre5 @ riak meetup #3
DESCRIPTION
Riak 2.0 pre5 新機能紹介 @ Riak Meetup #3, 2013-11-06TRANSCRIPT
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
Shunichi Shinohara Basho Japan KK
2013-11-06 Riak Meetup Tokyo #3
@ Yahoo!JAPAN セミナールーム
2.0 pre5
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
2.0 = Riak 1.x + アプリ向け機能強化 + さらなる運用の容易さ
pre5
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
• 運用の容易さ • 高可用性 • 水平拡張性
設計ポリシー
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
Riak 1.x • Riak 1.0 クラスタ管理 Bitcask / LevelDB 2i / MapReduce
• Riak 1.x クラスタ操作の改善 各種バックプレッシャー Capability ネゴシエーション
node
node node
node node
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
Riak 2.0 アプリ向け 機能強化 全文検索
データ型 (CRDT)
強い整合性
・・・
さらなる 運用の容易さ バケットタイプ
セキュリティ
設定ファイル刷新
・・・
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
注意 • Tech Preview (2.0pre5) をベースにしています
• 2.0 正式リリース時には色々変わるかも
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
バケットタイプ • 動機
• キーの名前空間としてのバケット • カスタム設定が個別のバケットごとに必要 • O(1000)のバケットのカスタム設定はネットワークを圧迫
• 解決策 • 同種のバケットをまとめて管理 • 効率的なクラスタ内情報共有
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
バケットタイプ
$ riak-admin bucket-type <sub-command>
list status <type> activate <type> create <type> <json> update <type> <json>
• 明示的に作成し、有効化する
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
バケットタイプ
# 設定を取得$ curl http://127.0.0.1:8098/types/my-type/props
# タイプ/バケット/キーの3段階でアクセス$ curl http://127.0.0.1:10018/types/my-type/ buckets/my-bucket/keys/my-key
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
データ型 (CRDT) • 動機
• 並列アクセス、並列更新をアプリで考慮、対処する必要があった • 単純な後勝ち または Vector Clocks 以外の対処はアプリの責任
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
データ型 (CRDT) • 例: フォローしている人
• ユーザーの集合、(簡単のため) 追加しかできない
• フォローの追加で並列更新が発生
太郎
太郎, 花子 三郎
太郎, 花子 次郎
太郎, 花子 ???? 更新の衝突 太郎, 花子
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
データ型 (CRDT) • 例: フォローしている人
• ユーザーの集合、(簡単のため) 追加しかできない
• フォローの追加で並列更新が発生
• 衝突の解決はほぼ自明
太郎
太郎, 花子 三郎
太郎, 花子 次郎
太郎, 花子 次郎, 三郎 更新の衝突 太郎, 花子
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
アプリの擬似コード class User def initialize(following=Set.new): @following = following
def follow(user): @following.add(user)
def self.resolve(user1, user2): merged = user1.following.union(user2.following) User.new(merged)
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
データ型 (CRDT) • 解決策
• データ型を指定するだけで自動的に衝突解決 カウンター、フラグ(Boolean)、セット、レジスター、 およびそれらの入れ子 (マップ)
• アプリの設計+開発を簡単にする
• 設計で考慮すること: ライフサイクル、データの肥大化、効率
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
アプリの擬似コード CRDT class User def initialize(following=Set.new): @following = following
def follow(user): @following.add(user)
def self.resolve(user1, user2): merged = user1.following.union(user2.following) User.new(merged)
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
Set データ型を使う # バケットタイプの設定$ riak-admin bucket-type create bt-sets '{"props": {"datatype": "set"}}'$ riak-admin bucket-type activate bt-sets
# コード (Eralng)riakc_pb_socket:modify_type(Riakc, fun(Set) -> riakc_set:add_element(NewElement, Set) end, {<<"bt-sets">>, <<"b">>}, <<"k">>, []);
サンプルコード: hKps://gist.github.com/shino/a8da9791926976122b8a
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
セキュリティ: 認証/認可 • 動機
• セキュリティでは「穴」がひとつでもあると全体が弱くなる
• Riak でしか対応出来ないことは Riak で対応する • 解決策
• AuthenScate: 誰がアクセスしてきたか (ユーザ名のみ、ユーザ名+パスワード、ユーザ名+証明書、PAM)
• Authorize: なににアクセスできるのか • Audit: だれがどうアクセスしたか (pre5 には入っていない) • EncrypSon: MITM 排除 (PKI, TLS)
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
セキュリティ: 認証/認可 # 設定$ riak attach> application:set_env(riak_core, security, true).
# ユーザ追加$ riak-admin security add-user andrew
# 経路の追加$ riak-admin security add-source all 127.0.0.1/32 trust
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
セキュリティ: 認証/認可 # GET => エラー "401 Unauthorized"$ curl -k -i --user andrew:foo https://127.0.0.1:11018/buckets/b/keys/k
# 権限追加 GET+PUT$ riak-admin security grant riak_kv.get ON ANY TO andrew$ riak-admin security grant riak_kv.put ON ANY TO andrew
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
セキュリティ: 認証/認可 # PUT, GET => 成功$ curl -X PUT --data 'val' -k -i --user andrew:foo https://127.0.0.1:11018/buckets/b/keys/k$ curl -k -i --user andrew:foo https://127.0.0.1:11018/buckets/b/keys/k
# PUT 権限取り消し$ riak-admin security revoke riak_kv.put ON ANY FROM andrew
# GET => 成功, PUT => エラー [コマンド省略]
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
強い整合性 • 動機
• これまでは結果整合性の参照+更新のみ、可用性が第一
• 強い整合性が欲しいデータもあり得る (在庫数の管理)
• 解決策 • レプリカごとにリーダーを選出、整合性を課す
• 条件付き更新(CAS)、単一レコード、アトミック • 並列更新は失敗する、部分更新は発生しない
• 参照では最新が見えることを保証 (ダーティーリードがない)
• 「強い」≠「良い」、Riak 内で結果整合性とトレードオフ可能になった
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
強い整合性 1. 設定: riak.conf
enable_consensus = true
2. 設定: bucket type '{"props": {"consistent": true}}'
3. PUT => 成功
4. GET せずにもう一度 PUT => エラー
5. GET してから PUT => 成功
6. 古い GET を元に PUT する => エラー
4. PUTエラー
3. PUT成功
キーなし (最初の状態)
5. PUT成功
6. PUTエラー
Read-Modify-Put
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
設定ファイル刷新 • 動機
• あまり一般的ではない設定ファイル書式
• 複数に分かれていた
• 解決策 • 1ファイルに統合
• 1行に1項目
• grep, sed などとの親和性が高い
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
設定ファイル刷新 {riak_kv, [ {anti_entropy, {on, []}}, {anti_entropy_build_limit, {1, 3600000}}, {anti_entropy_expire, 604800000}]},
anti_entropy = onanti_entropy.build_limit.number = 1anti_entropy.build_limit.per_timespan = 1hanti_entropy.expire = 1w
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
参考 • 全般
• ブログ [日本語] hKp://basho.co.jp/introducing-‐riak-‐2-‐0-‐data-‐types-‐strong-‐consistency-‐full-‐text-‐search-‐and-‐much-‐more/
• ブログ [英語] hKp://basho.com/introducing-‐riak-‐2-‐0/
• RICON West 2013 ビデオ hKp://ricon.io/west2013.html
• ビルド済みパッケージ: hKp://docs.basho.com/riak/2.0.0pre5/downloads/
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
参考 • バケットタイプ
• RICON スライド: hKps://speakerdeck.com/jrwest/controlled-‐epidemics-‐riaks-‐new-‐gossip-‐protocol-‐and-‐metadata-‐store
• 提案+議論: hKps://github.com/basho/riak/issues/362
• データ型 (CRDT) • RICON スライド: hKps://speakerdeck.com/lenary/crdts-‐an-‐update-‐or-‐just-‐a-‐put
• いろいろな型: hKps://gist.github.com/russelldb/7316f83ddd38965d9f76
• さらに詳細: hKps://gist.github.com/russelldb/f92f44bdg619e089a4d
©2013 BASHO TECHNOLOGIES INC. ALL RIGHTS RESERVED.
参考 • セキュリティ: 認証/認可
• 提案+議論: hKps://github.com/basho/riak/issues/355
• HTTP の例: hKps://gist.github.com/Vagabond/05b7dc8ae6d3ca4af6c2
• PB の例: hKps://gist.github.com/Vagabond/6222793a1d352f1ccdd2
• 強い整合性
• RICON スライド: hKps://speakerdeck.com/jtuple/ricon-‐west-‐2012-‐bringing-‐consistency-‐to-‐riak-‐part-‐2
• 開発ブランチ: hKps://github.com/basho/riak_ensemble/tree/jdb-‐wip-‐2.0
• 設定ファイル刷新
• Wiki: hKps://github.com/basho/cuKlefish/wiki
• hKps://github.com/joedevivo/ricon/blob/master/cuKlefish.md
Basho Technologies
2013-11-06 Riak Meetup #3