19
Cassandra 1.2 から 2.0 株式会社 INTHEFOREST

Cassandra12to20

Embed Size (px)

Citation preview

Page 1: Cassandra12to20

Cassandra 1.2 から 2.0 へ

株式会社 INTHEFOREST

Page 2: Cassandra12to20

自己紹介

冨田 和孝 (@railute)

肩書き: 株式会社INTHEFOREST 代表取締役社長 Cassandra商用サポート、Cassandraコンサルティング他 Cassandra勉強会主宰 2か月に一度程度開催。現在、第25回まで開催。 職種:本職はDB・インフラ系エンジニア 以前、某レストランサーチのDBA 高負荷・大容量・大規模のOracleRACとPostgreSQLと MySQLに苦しめられ続けた経験あり。

Page 3: Cassandra12to20

Agenda Cassandra基礎知識 Cassandraの歴史 Cassandraの新機能

CQL3 Virtual Node Request Trace Atomic Batch JBOD Disk Failure Policy CQL3 Native Protocol

Cassandra2.0に向けて トリガー 集約関数 Streaming及びrepairの改良 Counterの改良

Page 4: Cassandra12to20

Cassandraの基礎知識

Cassandraのノードはレプリカとコンシステントハッシングによるデータ配置でデータ保全性を担保する。

ノード1

ノード2

ノード3

ノード4

ノード5

ノード6

• 各ノードはP2Pで稼働 • データ配置はコンシステントハッシング • データの複製で保全性を担保

α

α

α’

α”

Page 5: Cassandra12to20

Cassandraの歴史

0.8 0.7 1.0 1.1 1.2

• 動的スキーマ変更 • セカンダリ・インデックス

• CQL • Counter

• Compression • Leveled-compaction

• Row Level isolation

2.0

Page 6: Cassandra12to20

CQL3 変わるデータ構造(CQL2)

cqlsh & cql

create keyspace CassandraBenchmark

with strategy_class = ‘SampleStrategy'

and strategy_options:replication_factor=3;

use CassandraBenchmark;

CREATE COLUMNFAMILY CBench (

KEY text PRIMARY KEY,

cbid int

);

CREATE INDEX cbid_idx ON CBench (cbid);

CassandraBenchmark

CBench

Key cbid:000001

textdata:xxxxxxxxxxxx

Key cbid:000002

textdata:xxxxxxxxxxxx

Key cbid:000003

textdata:xxxxxxxxxxxx

SELECT * FROM Cbench WHERE KEY = ‘10000’; INSERT INTO (KEY,cbid,textdata) VALUES (‘10000’,‘000001’,’xxxxxxx’);

thriftAPIのラッパー構造

Page 7: Cassandra12to20

CQL3 変わるデータ構造(CQL3)

cqlsh & cql

CREATE KEYSPACE CassandraBenchmark

WITH replication = {

'class': 'SimpleStrategy',

'replication_factor': '3'

};

use CassandraBenchmark;

CREATE TABLE CBench (

cbid int PRIMARY KEY,

textdata text

);

SELECT * FROM Cbench WHERE cbid = ‘10000’; INSERT INTO (cbid,textdata) VALUES (‘000001’,’xxxxxxx’);

APIを一から作り直し

CassandraBenchmark

cbid textdata

0001 xxxxxx

0002 xxxxxx

0003 xxxxxx

CBench

※複合KEYもサポートされた

Page 8: Cassandra12to20

Virtual Node

Cassandraのノードは一つのリングに対して データを請け負う範囲を一つ設定する

ノード1

ノード2

ノード3

ノード4

ノード5

ノード6

リング一周 0 ~ 2^127

リング一周の 0 ~ 2^127 の数値の 各ノードに一つ割り当て

割り当てた数値から次のノードの数値まで そのノードのデータ範囲を割り振れる

※1.2になってからデフォルトのリングの 一周の範囲が 0 ~ 2^127 から 変更されているので注意

Page 9: Cassandra12to20

Virtual Node

Virtual Nodeの場合ランダムで請け負うデータ範囲が 複数持つ事になるので、データ範囲の設定が不要に

ノード1 ノード3

ノード2

ノード3

ノード1

ノード2

ノード1

ノード3

ノード2

ノード2 ノード1

ノード2

ノード3

ノード1

ノード1

ノード3

ノード3

ノード2

ノード3つでそれぞれ 6つのデータ範囲を持たせた場合

ノード1

ノード2

ノード3

一つのノードのトークンの数を増やせば増やすほど 比較的、平均に負荷分散が行える

Page 10: Cassandra12to20

Virtual Node また、Virtual Nodeの場合ノード追加の際は Cassandraの特性上、追加ノードへ割り当てられたデータが 別のノードから転送されます

ノード3

ノード2

ノード3

ノード2

ノード3

ノード2

ノード2

ノード2

ノード3

ノード3

ノード3

ノード2

ノード1 ノード3

ノード2

ノード3

ノード1

ノード2

ノード1

ノード3

ノード2

ノード2 ノード1

ノード2

ノード3

ノード1

ノード1

ノード3

ノード3

ノード2

複数データを請け負う範囲を持つ事で、本来1ノードから転送される所を 複数のノードに分散でき、負荷も分散されます(ノード取り外しも負荷分散される)

Page 11: Cassandra12to20

Request Trace

Request Trace を行った結果はキースペースsystem_traceのテーブル sessions, events に溜まる

CQL3ではRequest Traceの機能が追加 tracing on と実行するとこの機能が使用できる

Page 12: Cassandra12to20

Atomic Batch

一塊のInsert, Update, Delete を一度に実行する事が出来る

Begin batch Insert into log (name, date, value) values (‘test1’, 2013220, ‘log1’) Insert into log (name, date, value) values (‘test2’, 2013220, ‘log2’) Insert into log (name, date, value) values (‘test3’, 2013220, ‘log3’) Insert into log (name, date, value) values (‘test4’, 2013220, ‘log4’) Apply batch;

Page 13: Cassandra12to20

Atomic Batch

cassandra

cassandra

cassandra cassandra

cassandra cassandra

cassandra cassandra

Begin batch Insert into … Insert into … Apply batch

バッチ内容をsystem.batchlogに書き込み その後バッチが実行される

×

× ×

System.batchlogにバッチ内容が書き込まれているので 関係あるノードが全てDownしても復帰後に 更新作業が行われる

バッチ実行最中にDown

実行ノードがダウンしてもバッチは継続して実行される。

Page 14: Cassandra12to20

JBOD

同一カラムファミリを複数のディスクに分散してストアすることが可能になった。

data1

data2

data3

CF:ABC × ×

HDD

HDD

HDD

+

+

Page 15: Cassandra12to20

Disk Failure Policy

Cassandra1.1 まではディスク障害時の挙動は決められていた

Cassandra 1.2からは・・・

3種類のいずれかを設定する事が出来る

stop : ディスク障害時、プロセスはダウンしないがgossipとThriftは行われない best_effort : ディスク障害時、gossip、thriftは止めず動作し続けるが、問題あるディレクトリの 書込みは止まる、読込みも出来ない場合は読込みも止まるが 出来る場合は読込みは通常に行われる ignore : 単にリクエストがエラーになる

Page 16: Cassandra12to20

CQL3 Native Protocol

現在Cassandra内ではサーバー・クライアント間の通信に Apache Thrift が使用されている

cqlsh CQL3

Cassandra

Thrift Thrift

CQL3

CQLのクエリは Thriftを使用していた

1.2は新しくCQL3用の Protocolが追加された

・ノード間のスキーマ反映が高速に

・複数のリクエストを同時に処理する事ができるように

・送信データは圧縮する事が可能に

Page 17: Cassandra12to20

Cassandra 2.0

サーバーサイドの各テーブルにトリガーを設置可能とする 構造はまだ議論中であるがRDBMSでいうところのアフタートリガーに近い動きになる模様

トリガー

集約関数

サーバーサイド側にSUMのような集約関数を実装可能にする。

Page 18: Cassandra12to20

Cassandra 2.0

既存のCassandra無いで非常に負荷が高く運用上の問題になりがちなRepair処理に関して根本的な解決方法を提供する。

• より的確なレプリカの再生 • マークル木の精度 の動的調整 • 最小限の同期

Counterの改良

ノード障害発生時に実数破損が起きやすい実装の修正

Streaming及びrepairの改良

Page 19: Cassandra12to20

ご清聴ありがとうございました。