pyvortex

23
Tornado ででで KVS ででででででで PyCon2012 でででででで URL https://github.com/kishimotosc/vortex

Upload: kishimotosc

Post on 09-Dec-2014

1.353 views

Category:

Documents


5 download

DESCRIPTION

PyCon JP 2012 での発表スライドです。 PythonのTornadoを使って分散KVSのフレームワークとして仕上げてみました。

TRANSCRIPT

Page 1: PyVortex

Tornado で分散 KVS フレームワーク

PyCon2012

【ダウンロード URL 】https://github.com/kishimotosc/vortex

Page 2: PyVortex

誰?誰?

■ 株式会社エスキュービズム    岸本 康二

■ 大学の研究室時代に Python1 系に出会う

■WEB サービスの構築案件から  大規模系の技術開発、  センサーデータの取得・解析など  普段から Python を使っています。

Page 3: PyVortex

本日のメニュー本日のメニュー

Tornado の分散 KVS  フレームワーク風

Vortex   

Tornado の分散 KVS  フレームワーク風

Vortex   

Page 4: PyVortex

ノード 1 台辺り

約 1,000 write/sec

複数台なら基本的に掛け算

結果から結果から

Page 5: PyVortex

Apache Cassandra を使用した案件

約 3,500 write/sec(分間 20 万書き込み)

開発経緯開発経緯

Page 6: PyVortex

■ クラウド環境の抱える問題

  ・大規模 HD 障害

  ・大規模電源障害

→単一系統 /DC 構成は厳しい

開発経緯開発経緯

Page 7: PyVortex

■Cassandra を使ってみて    ※それでも Cassandra 自体は素晴らしいです

  ・動作と構造が複雑で見えにくい  ・ Thrift(RPC) は美しいが面倒  ・タイムスタンプの扱いに難あり  ・各ノード上で計算できない  ・ LB 等を通せない

開発経緯開発経緯

Page 8: PyVortex

■Vortex で目指したもの

  ・分散 KVS フレームワークの構築  ・ HTTP ベースの IF  ・シンプルな設計(容易な変更)  ・操作関数の導入  ・マルチ DC を想定( LB 経由可能)  ・バージョンによる一貫性管理  ・エラーの検知

設計方針設計方針

Page 9: PyVortex

Python 製 WEB フレームワークNon-Blocking でマルチコアを活かしやすい

シンプルかつ速い!

→分散 KVS ロジックを Tornado で実装

分散 KVS フレームワーク分散 KVS フレームワーク

Page 10: PyVortex

ベースが Tornado というWEB フレームワーク

↓HTTP ( S )で簡単に通信できる

また、データは JSON 形式

→ブラウザ上の JavaScript から 分散 KVS を操作できたり・・・

HTTP ベースの IFHTTP ベースの IF

Page 11: PyVortex

基本的にデータ受信 /転送

書き込み /読み込みの 2 系統に収めた

↓主要ロジック部分は 300 行程度

シンプルな設計シンプルな設計

Page 12: PyVortex

× データを送って書き込む↓

○パラメータを送って関数を実行し、その結果を書き込む

(ストアドプロシージャ的な)↓

操作関数の導入操作関数の導入

Page 13: PyVortex

↓現在書き込まれている値とパラメータを使って

書き込む値を決定できる。↓

データの読み出しが減り、高速化可能。

パラメータとして関数表現を送り、動的に実行させることも

簡単なカスタマイズで可能

操作関数の導入操作関数の導入

Page 14: PyVortex

ノードに直接転送せずにLB 等の後ろにいることを想定

↓HTTP(S) での接続なので、

LB によるラウンドロビンやポート変換、SSL アクセラレータ、振り分けなどの

恩恵をそのまま受けられる。↓

マルチ DC でのレプリケーションを簡単に安く!

マルチ DC を想定マルチ DC を想定

Page 15: PyVortex

×Cassandra では異なるデータでも同じバージョン指定だと何度でも

上書きができてしまう。↓

○あるバージョンで一度書き込むとそれより大きなバージョン指定でないと

上書きできない。↓

バージョンによる一貫性管理バージョンによる一貫性管理

Page 16: PyVortex

↓データのロックや CAS 操作などの

機能開発に向いている↓

従来、分散 KVS が苦手とされた強い一貫性の維持に使える

CAP 定理で言えば、 A と Pを選択しつつ、C はバージョンを意識することで克服する形

バージョンによる一貫性管理バージョンによる一貫性管理

Page 17: PyVortex

データ一貫性のある操作ができたかどうか+

どの DC のどのノードに書き込めなかったのか戻り値として返してくる。

↓瞬間的なノードの性能低下なのか、

DC内での障害なのかは DB を利用する側が「外部」から判断して個別処理するポリシー

例) DC 間の分断ではお互いを障害中と「勝手に」判断してしまう

エラーの検知エラーの検知

Page 18: PyVortex

データの流れデータの流れ

LB

Node2

自分?転送?

ラウンドロビン Node1

転送

書き込み

Page 19: PyVortex

分散保存分散保存

Page 20: PyVortex

まとめまとめ

①サーバやレプリケーション方法に依るが   毎秒約 1,000 書き込み /読み込み

  が 1 ノード当たりで捌ける目安ノードを増やせばさらに性能も向上

主にファイルシステムとネットワークが速度を決める重要な部分

Page 21: PyVortex

まとめまとめ

②マルチ DC なので、 fsync を外せる (?)→ 高速化

また、 DC1 つが丸ごと障害でも書き込みも含めてサービス継続が可能

(もちろん、シングル DC でも動作します)

Page 22: PyVortex

まとめまとめ

③何より作りがシンプルなので

簡単にオリジナル分散 KVS を作れます!

独自アルゴリズムや新しい一貫性確保の仕組み、

データストアと解析の同時実装などちょっとしたアイディアをすぐに試せます。

Page 23: PyVortex

まとめまとめ

github に公開しています↓

https://github.com/kishimotosc/vortex

優秀な Pythonista を求めています!ぜひ一度お声がけください。