Click here to load reader
Upload
kazutaka-tomita
View
13.920
Download
2
Embed Size (px)
Citation preview
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 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 」
データは何処まで書き込まれるのか?
• 複数ノードを立ち上げた時にデータはどのノードに書き込まれるのか?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ノード右まで
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で見てみる
データは何時書き込まれるのか?
• 複数ノードを立ち上げた時に実際データは何時書き込まれるのか?
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
データは何時書き込まれるのか?
• 複数ノードを立ち上げた時に実際データは何時書き込まれるのか?
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
データを読み込む
• 複数ノードの場合データはどの様に呼び出されるのか?
対応しているのは現状 ConsistencyLevel.ONE と ConsistencyLevel. QUORUMのみ。
「 ONE 」:最初に接続要求のあったノードによって返されたレコードを返答。一貫性を保持するためにバックグラウンド系で常時チェックを実行。最初の要求で古いデータを返答したとしても、その後の呼び出しで
正しいデータを返答。 ( 「リードリペア」と呼ばれます。 )
「 QUORUM 」:いったん全てのノードに問い合わせを行い、レプリカも含めた返答データの内、 最も新しい TimeStamp を持つレコードを返答。古いレコードを持つレプリカはバックグラウンドでチェックされる。
宣伝
• 日経BP様より依頼があって日経Linuxに記事書きました。
でも原稿提出してからレスポンスが殆どないので本当に掲載されるか分かりません。W内容は AmazonEC2 で複数ノードの Cassandra を使うです。
質問等有れば連絡ください。twitter: railute
blog:http://www.intheforest.jp/blog/ e-mail:[email protected]