10

Click here to load reader

Consistency level

Embed Size (px)

Citation preview

Page 1: Consistency level

ConsistencyLevel株式会社ムロドーとみたかずたか

Page 2: Consistency level

全回アジェンダ•cassandraを複数で立ち上げる•コンシステンシーレベルとは•ゴシッププロトコル?•複数ノードで異なる設定•巨大なデータを入れてみる•ノードのスプリットブレイン

Page 3: Consistency level

アジェンダ•ConsistencyLevelとは?

▫データは何処にあるのか?▫データは何処まで書き込まれるのか?▫データは何時書き込まれるのか?▫データを読み込む

Page 4: Consistency level

データは何処にあるのか? (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 ringAddress 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 」

Page 5: Consistency level

データは何処まで書き込まれるのか?

• 複数ノードを立ち上げた時にデータはどのノードに書き込まれるのか?storage-conf.xml の ReplicaPlacementStrategy が RackUnawareStrategy の場合(デフォルト)、 ring 上で隣り合う n-1 分、右のノードまで書き込む。 (next 2-1 nodes)N = ReplicationFactor

例 )key 「 3 」のハッシュ化→「 314755909755515592000481005244904880883 」ReplicationFactor = 2

192.168.1.106436894197437700848967067970328334

6037

192.168.1.6537167039411291530597324124416329

90819

192.168.1.104723608168334034138135161728186451

47903

192.168.1.109

123621947362397555094783433836216926846

2-1ノード右まで

Page 6: Consistency level

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で見てみる

Page 7: Consistency level

データは何時書き込まれるのか?

• 複数ノードを立ち上げた時に実際データは何時書き込まれるのか?

memtableMemory

Disk

Commit LogWrite

OP

Flush

SSTable

SSTable

SSTable

ConsistencyLevel ZERO

For local

YES

NoWith hints

YES

NoWrite Hints

Message Sent to other node

Read OP

Page 8: Consistency level

データは何時書き込まれるのか?

• 複数ノードを立ち上げた時に実際データは何時書き込まれるのか?

Commit Log

Write OP

ConsistencyLevel その他

For local

YES

No

With hints

YES

No

Write Hints

Sent messages to other node

Return message from other node

Page 9: Consistency level

データを読み込む

• 複数ノードの場合データはどの様に呼び出されるのか?

対応しているのは現状 ConsistencyLevel.ONE と ConsistencyLevel. QUORUMのみ。

「 ONE 」:最初に接続要求のあったノードによって返されたレコードを返答。一貫性を保持するためにバックグラウンド系で常時チェックを実行。最初の要求で古いデータを返答したとしても、その後の呼び出しで

正しいデータを返答。 ( 「リードリペア」と呼ばれます。 )

「 QUORUM 」:いったん全てのノードに問い合わせを行い、レプリカも含めた返答データの内、 最も新しい TimeStamp を持つレコードを返答。古いレコードを持つレプリカはバックグラウンドでチェックされる。

Page 10: Consistency level

宣伝

• 日経BP様より依頼があって日経Linuxに記事書きました。

でも原稿提出してからレスポンスが殆どないので本当に掲載されるか分かりません。W内容は AmazonEC2 で複数ノードの Cassandra を使うです。

質問等有れば連絡ください。twitter: railute

blog:http://www.intheforest.jp/blog/ e-mail:[email protected]