Upload
chris-birchall
View
198
Download
1
Embed Size (px)
DESCRIPTION
Apache Cassandra
Citation preview
Apache Cassandra
分散システムのツアー #2Chris
2014/7/29#m3dev
https://github.com/m3dev/distrib-systems-tour
Cassandra
● 分散 key-value storeo “schema-optional”
● Fault tolerance、可用性o 自動レプリケートo 単一障害点なし
● リニアにスケールする● Eventual consistency
o チューニング可能● 複数 DC構成を考慮した設計
データ構成● 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
注意: SuperColumns
複数の k-vペアをまとめる「サーパーカラム」もあるが、 Deprecateされている
古いドキュメントやブログによく出るので、無視してください
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);
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は更新される
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でソートされる● レコード内のキーはアルファベット順でソートされる
クエリ制限(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
クエリ制限(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
便利機能: counter型CREATE TABLE page_views( url varchar PRIMARY KEY, views counter);
UPDATE page_views SET views = views + 1 WHERE url = ‘www.m3.com’;
便利機能: 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)
Consistency levels
● 一貫性と可用性とのトレードオフ● read, writeそれぞれチューニング可能● クエリ単位でレベルを選べる
● ANY:ノード1台(どれでもいい)● ALL:全ノード● EACH_QUORUM:各データセンターにおいて1台以上
● 。。。
Consistent hashing
66
33
99token = hash(key) mod n
リニアにスケールする● Netflix社が AWS上でベンチマークを取った
http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html
288台で100万 writes/s!!
ライブラリ● Java
o DataStax drivero Netflix Astyanax
● Scalao Scqla
● Rubyo cql-rb
● Nodeo Helenuso node-cassandra-cql
ハンズオン!
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