ConsistencyLevel
株式会社ムロドー
とみたかずたか
全回アジェンダ
• cassandra を複数で立ち上げる
• コンシステンシーレベルとは
• ゴシッププロトコル?
• 複数ノードで異なる設定
• 巨大なデータを入れてみる
• ノードのスプリットブレイン
アジェンダ
• ConsistencyLevel とは?
▫データは何処にあるのか?
▫データは何処まで書き込まれるのか?
▫データは何時書き込まれるのか?
▫データを読み込む
データは何処にあるのか? ( Partition)
• 複数ノードを立ち上げた時に実際データは何処にあるのか
storage-conf.xmlの Partitioner が org.apache.cassandra.dht.RandomPartitioner の場合
(デフォルト)、キーを MD5 で Hash 値化した値を整数とみなし、 0 から 2^127 の間の 各ノードが持つレンジに割り当てる。
例 )
KS「 TimeStampSimpleTrees 」、 CF 「 SimpleTrees 」、 key「 3 」、 Column 「 id 」データの場合
TimeStampSimpleTrees.SimpleTrees['3']['id']
keyを md5 でハッシュ化→「 314755909755515592000481005244904880883 」 Nodetoolより
pompadour@zaku2-F-1:~$ nodetool --host 192.168.1.104 ring
Address Status Load Range Ring
123621947362397555094783433836216926846 192.168.1.106 Up 21.53 MB 4368941974377008489670679703283346037 |
<--|
192.168.1.6 Up 11.01 MB 53716703941129153059732412441632990819 | |
192.168.1.104 Up 4.37 MB 72360816833403413813516172818645147903 | |
192.168.1.109 Up 10.95 MB 123621947362397555094783433836216926846
|-->|
192.168.1.109のキー「 123621947362397555094783433836216926846 」より大きい よってプライマリレプリカは「 192.168.1.106 」
データは何処まで書き込まれるのか?
• 複数ノードを立ち上げた時にデータはどのノードに書き込まれるのか?
storage-conf.xmlの ReplicaPlacementStrategy が RackUnawareStrategy の場合
(デフォルト)、 ring 上で隣り合う n-1 分、右のノードまで書き込む。 (next 2-1 nodes) N = ReplicationFactor
例 )key「 3 」のハッシュ化→「 314755909755515592000481005244904880883 」 ReplicationFactor = 2
192.168.1.106
436894197437700848967067970328334 6037
192.168.1.6
537167039411291530597324124416329 90819
192.168.1.104
723608168334034138135161728186451 47903
192.168.1.109
123621947362397555094783433836216 926846
2-1 ノード右まで
thriftAPIの describe_ring を使用してリング情報を取得する。 例 )
KS「 TimeStampSimpleTrees 」の ring を取得 ReplicationFactor = 2
結果を成形 [
TokenRange(
end_token='123621947362397555094783433836216926846', start_token='72360816833403413813516172818645147903', endpoints=['192.168.1.109', '192.168.1.106']), TokenRange(
end_token='72360816833403413813516172818645147903', start_token='53716703941129153059732412441632990819', endpoints=['192.168.1.104', '192.168.1.109']), TokenRange(
end_token='4368941974377008489670679703283346037', start_token='123621947362397555094783433836216926846', endpoints=['192.168.1.106', '192.168.1.6']),
TokenRange(
end_token='53716703941129153059732412441632990819', start_token='4368941974377008489670679703283346037', endpoints=['192.168.1.6', '192.168.1.104']) ]
「 3 」の hash 値「 314755909755515592000481005244904880883 」は
「 192.168.1.109 」 , 「 192.168.1.6 」に格納される。
thriftAPI で見てみる
データは何時書き込まれるのか?
• 複数ノードを立ち上げた時に実際データは何時書き込まれるのか?
memtable
Memory
Disk
Commit Log
Write
OP
Flush
SSTabl
e
SSTabl
e
SSTabl
e
ConsistencyLevel ZERO
For
local
YES
No
With
hints
YES
No
Write
Hints
Message Sent to other node
Read OP
データは何時書き込まれるのか?
• 複数ノードを立ち上げた時に実際データは何時書き込まれるのか?
Commit Log
Write
OP
ConsistencyLevel その他
For
local
YES
No
With
hints
YES
No