5. ● Cassandra って? What is Cassandra?
分散KVS(Key-Value Store)
distributed key-value store
ApacheのTop Level Projectの1つ
Facebook社がOSS化した物が基に
6. ● とってもスケーラブル! Scalable!
ノードを追加するだけで
処理性能がリニアにUP↑
Simply, add nodes and you'll get more power!
分散KVS RDB
↑
パフォーマンス
performance
ノード数 →
# of nodes
7. ● Cassandra + トランザクション
Cassandra + Transaction
分散KVSでトランザクション
が出来たら最高!
It is desirable for distributed KVS to have the transation function!
↓
もう高価な有償RDBは不要にな(ry
A Farewell To RDBs
8. ● Cassandra + トランザクション
Cassandra + Transaction
でも、往々にして
「分散KVSでトランザクション?(笑)」
???となるのがオチ
transaction on distributed KVS? ha ha ha!
↑
CAP定理と通説が原因
CAP theorem and common belief
10. ● CAP定理での誤解 Misunderstanding about CAP theorem
× 3つの保証を提供できない
It is impossible to provide all three
○ 3つの保証を「同時に」提供できない
It is impossible to simultaneously provide all three
「同時」ではなかったら?
What will happen if the system does not simultaneously provide all three?
11. ● Cassandraの場合 In the case of Cassandra
C A P 定理
two of "C", "A" and "P"
Solution: write & read pair
書き込み時のみではなく、
"結果整合性"と関係
"eventual consistency" 読み込み時にも処理を行う
( = "Read Repair")
→ 強一貫性も実現
realization of "Consistency"
12. ● トランザクション Transaction on Cassandra
書き込み時のみではなく、
読み込み時にも処理を行う
( = "Read Repair")
というアイディアを
トランザクションに応用したら?!
The same idea is availabe for the transaction!
Isn't it?
13. ● 「NanaHoshi」を開発 We've developed "NanaHoshi"
実際に実装してみて振り返ると
"BASE"型トランザクション
のコンセプトと似てました
NanaHoshi has "BASE" type transaction mechanism
BA: Basically Available
S : Soft-state ← Important!
E : Eventual consistency
14. ● 結論 Conclusion
分散KVSでトランザクションできます
We can use the transaction on distributed KVS.
業務システム構築に利用できます
しかも
スケーラブルに
More info →
http://ec-cube.ec-orange.jp/lp/nanahoshi/
http://ec-cube.ec-orange.jp/lp/nanahoshi/
15. ● NanaHoshiの構造 Structure of "NanaHoshi"
Object mapper
Transaction logic
Abstract access layer
Thrift IF
Cassandra
16. ● NanaHoshiの構造 Structure of "NanaHoshi"
ここが全部Python。
Cassandra,Thrift関係以外は
全て標準機能?モジュールで構成
Object mapper
Transaction logic
Abstract access layer
Thrift IF
Cassandra
17. ● 簡単サンプルコード Simple sample code
### Initialization
connection = CassandraConnection()
connection.open()
connection.set_keyspace('TEST')
### Preparation
lockable = ModelLockable(connection, 'key')
lockable.load()
???(etc.)
### Transaction
transaction = ModelTransaction(connection)
try:
transaction.start()
if not lockable.join(transaction):
raise Exception()
lockable.load()
lockable.data += 10
lockable.save()
Web server:
if not transaction.end():
Tornado
raise Exception()
except:
transaction.forget()
18. ● NanaHoshiの構造 Structure of "NanaHoshi"
実は、
Cassandra以外
でも動かせる設計です。
Object mapper
Transaction logic
Abstract access layer
Thrift IF ( → another access IF)
Cassandra → another DB