16
Apache Cassandra 分分分分分分分分分分 #2 Chris 2014/7/29 #m3dev https://github.com/m3dev/distrib-sy stems-tour

Tour of distributed systems 2 - Cassandra

Embed Size (px)

DESCRIPTION

Apache Cassandra

Citation preview

Page 1: Tour of distributed systems 2 - Cassandra

Apache Cassandra

分散システムのツアー #2Chris

2014/7/29#m3dev

https://github.com/m3dev/distrib-systems-tour

Page 2: Tour of distributed systems 2 - Cassandra

Cassandra

● 分散 key-value storeo “schema-optional”

● Fault tolerance、可用性o 自動レプリケートo 単一障害点なし

● リニアにスケールする● Eventual consistency

o チューニング可能● 複数 DC構成を考慮した設計

Page 3: Tour of distributed systems 2 - Cassandra

データ構成● keyspace DB ≒ スキーマ● column family DB≒ テーブル● unique primary key 必須● 型あり: int, varchar, timestamp, uuid, ...

Column family: Users

123

Primary keyuser_id

name

Chris

age

29

likes

ramen

dislikes

sushi

456name

Bob

age

35

Page 4: Tour of distributed systems 2 - Cassandra

注意: SuperColumns

複数の k-vペアをまとめる「サーパーカラム」もあるが、 Deprecateされている

古いドキュメントやブログによく出るので、無視してください

Page 5: Tour of distributed systems 2 - Cassandra

CQL (Cassandra Query Language)

CREATE KEYSPACE demo WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

USE demo;

CREATE TABLE users(user_id int PRIMARY KEY,name varchar,age int,likes varchar,dislikes varchar);

Page 6: Tour of distributed systems 2 - Cassandra

CQL: INSERT

INSERT INTO users (user_id, name, age, likes, dislikes) VALUES ( 123, 'chris', 29, 'ramen', 'sushi');INSERT INTO users (user_id, name, age) VALUES ( 456, 'bob', 35);

実は、 INSERTも UPDATE もアトミックな UPSERT をする

例えばINSERT INTO users (user_id, age) VALUES ( 123, 30);

で上記のユーザ 123の ageは更新される

Page 7: Tour of distributed systems 2 - Cassandra

CQL: SELECT

SELECT * FROM users;

user_id | age | dislikes | likes | name---------+-----+----------+-------+------- 123 | 30 | sushi | ramen | chris 456 | 35 | null | null | bob

(2 rows)

● レコードは PRIMARY KEYでソートされる● レコード内のキーはアルファベット順でソートされる

Page 8: Tour of distributed systems 2 - Cassandra

クエリ制限(1)● 任意のキーでクエリできない

o PRIMARY KEY、インデックスされたキーのみ

cqlsh:demo> SELECT * FROM users WHERE user_id = 123;

user_id | age | dislikes | likes | name---------+-----+----------+-------+------- 123 | 30 | sushi | ramen | chris

cqlsh:demo> SELECT * FROM users WHERE name = 'chris';Bad Request: No indexed columns present in by-columns clause with Equal operator

Page 9: Tour of distributed systems 2 - Cassandra

クエリ制限(2)● JOINができない

o アプリ側で JOINする、 oro materialized view作る( denormalization)

クエリに対応するテーブルを作成する アプリ側でテーブル内容を常時更新する

SQL select u.id, p.name from user u join product p on u.product_id = p.id

CQL select user_id, product_name from user_product

Page 10: Tour of distributed systems 2 - Cassandra

便利機能: counter型CREATE TABLE page_views( url varchar PRIMARY KEY, views counter);

UPDATE page_views SET views = views + 1 WHERE url = ‘www.m3.com’;

Page 11: Tour of distributed systems 2 - Cassandra

便利機能: TTL

CREATE TABLE hoge(foo int PRIMARY KEY, bar varchar);

INSERT INTO hoge(foo, bar) VALUES (123, ‘abc’) USING TTL 10;

cqlsh:demo> select * from hoge; foo | bar-----+----- 123 | abc

10秒待つ。。。

cqlsh:demo> select * from hoge;(0 rows)

Page 12: Tour of distributed systems 2 - Cassandra

Consistency levels

● 一貫性と可用性とのトレードオフ● read, writeそれぞれチューニング可能● クエリ単位でレベルを選べる

● ANY:ノード1台(どれでもいい)● ALL:全ノード● EACH_QUORUM:各データセンターにおいて1台以上

● 。。。

Page 13: Tour of distributed systems 2 - Cassandra

Consistent hashing

66

33

99token = hash(key) mod n

Page 14: Tour of distributed systems 2 - Cassandra

リニアにスケールする● Netflix社が AWS上でベンチマークを取った

http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html

288台で100万 writes/s!!

Page 16: Tour of distributed systems 2 - Cassandra

ハンズオン!

OSX: brew install cassandra

or, AWS上に稼働中の Cassandra を使うec2-54-92-114-167.ap-northeast-1.compute.amazonaws.com

https://github.com/m3dev/distrib-systems-tour