rdb開発者のためのapache cassandra データモデリング入門
TRANSCRIPT
RDB開発者のための
Apache Cassandra™データモデリング入門
db tech showcase Tokyo 2017
森下雄貴
スピーカー
森下雄貴([email protected])
- Solution Architect (ときどきSoftware Developer) @ DataStax
- Apache Cassandra™コミッター
DataStax Enterprise
Apache Cassandraを中核にした製品
+ サポート
+ プロフェッショナルサービス
+ トレーニング
Apache Cassandraのおさらい
The Apache Cassandra database is the right choice
when you need scalability and high availabilitywithout compromising performance.
スケーラビリティ
• データはクラスター内のノードに分散されて格納される
• パフォーマンスとデータ容量両方でのリニアスケーラビリティ
50,000
trans/sec
500 GB
100,000
trans/sec
1 TB
200,000
trans/sec
2 TB
スケーラビリティ
• Cassandraはマスターレス
• ユーザーはどのデータセンターのどのノードにでも読み書きできる。
• 運用もシンプル
• すべての書き込みは、自動的に等しくノード間に分散され、クラスター内に複製される
10
50
3070
80
40
20
60
クライアント
ほかの2つのノードからデータを取得できる
一時的なノード障害
アベイラビリティ
• 単一障害点なし
• 高い耐障害性
• 自動レプリケーション
• スケールしても運用はシンプル
アベイラビリティ
• データセンター間レプリケーション
• データセンターやクラウドのアベイラビリティゾーンをまたぐデータの複製
• どんな障害が起きてもビジネスへの影響なし
• グローバルな低遅延パフォーマンス
10
50
3070
80
40
20
60
Clie
nt
15
55
3575
85
45
25
65
別のデータセンターデータセンター障害
10
50
3070
80
40
20
60
クライアント
Cassandraクエリ言語(CQL)
• RDBのSQLに似たシンタックス
• DDLによりオブジェクトを作成
• CREATE, INSERT, UPDATE,
DELETE, GRANT, REVOKE
• SELECT文で検索
• JOINはできない
• INSERT, UPDATE, DELETE
でデータ書き込み
CQL
CREATE TABLE market_prices ( symbol TEXT,date TIMESTAMP,price DECIMAL,side INT,PRIMARY KEY (symbol, date)
) WITH CLUSTERING ORDER BY(date DESC);
Cassandraデータモデリング
- 以上のような機能を実現するために、犠牲にしている機能もある
- どんなデータベースでもそうだが、適切なデータモデリングが性能に直結する
まずは用語の確認から
KEYSPACE
• トップレベルの名前空間
• テーブルなどのスキーマオブジェクトの集合
• レプリケーションの設定単位
CREATE KEYSPACE my_keyspace WITH WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor' : 1
};
TABLE
• RDBのテーブルに相当
• キースペースに属する
CREATE TABLE users (user_id UUID,first_name TEXT,last_name TEXT,PRIMARY KEY (user_id)
);
プライマリーキー
• テーブルの中のレコードを一意に識別する
• 物理的なデータの配置を制御
• パーティションキーとクラスタリングカラム(オプション)で構成される
CREATE TABLE users (user_id UUID,first_name TEXT,last_name TEXT,PRIMARY KEY (user_id)
);
CQLテーブルとストレージ
video_id name runtime year
1 Insurgent 144 2015
2 Interstellar 98 2014
3 Mockingjay 122 2014
パーティション
パーティションキー
セル
キー
バリュー
パーティションキー
• 物理的なパーティションを識別する
• 分散環境におけるデータの配置場所
• ディスク上のデータの場所
• プライマリーキーの最初の部分
• 複合パーティションキー
パーティションキー
• 実データがあるサーバーへのルーティングのためのキー
パーティションキー
• 複合パーティションキー
• 複数のカラムからパーティションキーを構成できる
PRIMARY KEY ((id, type))
• クエリー時はパーティションキーを構成するカラムをすべて検索条件に指定する必要がある
WHERE id = ? AND type = ?
クラスタリング
• パーティションをCQLテーブル内の各行に分割
• パーティション内はクラスタリングカラムでソートされている
データモデリングの流れ
KillrVideo
データモデリングの流れ
概念データモデル
アプリケーションワークフロー
マッピング論理データモデル
最適化物理データモデル
概念データモデル
• ドメインの抽象的なビュー
• 特定のテクノロジー/データベースによらない
• ERDを作成
アプリケーションワークフロー
- アプリケーションからのアクセスパターンから、どのようにデータへアクセスされるかを知る
- 実行されるクエリーをあらかじめ知っておく
- Apache Cassandra™が得意なクエリパターンは決まっている
アプリケーションワークフロー
マッピング
概念データモデル
アプリケーションワークフロー
マッピング論理データモデル
最適化物理データモデル
ERDとクエリーにマッピングルールとパターンを適用
論理データモデリングの成果物としてChebotkoダイアグラムを作成
Chebotkoダイアグラム
Chebotkoダイアグラム
Chebotkoダイアグラム
Chebotkoダイアグラム
Chebotkoダイアグラム
Cassandraデータモデリングの原則
- データを知る
- クエリを知る
- 非正規化
- データをネストする
- データを重複して持つ
データを知る
• 概念データモデルが完成していること
• Cassandraではプライマリーキーの設計がスキーマデザインに影響する
• プライマリーキーはユニークで、行を一意に識別
• プライマリーキーにはどんな問い合わせを行いたいかによって、カラムが追加される
クエリを知る
- クエリがスキーマデザインを決める
- クエリの変更はスキーマの変更を伴う可能性が高い
- Apache Cassandra™が得意なアクセスパターンに落とす
- 単一パーティションへのクエリー◎
- 少数のパーティションへのクエリー〇
- テーブルスキャン×
- 複数テーブルへのアクセス×
非正規化
- データをネストする
- 1つのパーティションに複数のエンティティを格納する
- 単一パーティションへのクエリーを実現
- 3つの方法
- クラスタリングカラム (一つのパーティションに複数の行を格納)
- コレクション型
- ユーザー定義型(UDT)
非正規化
- クラスタリングカラム
- パーティションキーが親のエンティティを識別
- クラスタリングカラムの値が子のエンティティを識別
- クラスタリングカラムを増やすことで多階層のネストを実現
非正規化
- ユーザー定義型
- 1対1の関係にも利用できるが、コレクション型と合わせても利用できる
非正規化
- データを重複して持つ
- クライアントサイドJOINよりも重複して持つほうがスケールする
マッピングルール
- ルール1: エンティティとリレーション
- ルール2: 等号(=)を用いる検索
- ルール3: 不等号(>, <)を用いる検索
- ルール4: 順序
- ルール5: エンティティを識別するキー
マッピングルール
- ルール1: エンティティとリレーション
- エンティティやリレーションがテーブルにマッピングされる
- 各レコードがパーティションや行にマッピングされる
- ひとつのパーティションに複数のエンティティやリレーションが入ることもある
- 属性はテーブルのカラムにマッピングされる
マッピングルール
- ルール2: 等号(=)を用いる検索
- プライマリーキーはパーティションキーとクラスタリングカラムで構成される
PRIMARY KEY ((partition_key1, partition_key2), clustering1, clustering2, …)
- 等号(=)を用いて検索を行う属性(カラム)がプライマリーキーの最初に来る
マッピングルール
- ルール3: 不等号(>, <)を用いる検索
- 不等号(>,<)を用いて検索を行う属性(カラム)は、プライマリーキーの定義において、等号を用いる属性の後に来る
- クエリ: 姓 = ? かつ登録日時 > ?
マッピングルール
- ルール4: 順序
- 各パーティション内で、CQLの行はソートされている (昇順もしくは降順)
PRIMARY KEY ((partition_key1, partition_key2), clustering1, clustering2, …)CLUSTERING ORDER BY clustering 1 ASC, clustering2 DESC
- クエリ: 姓 = ? かつ登録日時 > ? で、登録日時の昇順
マッピングルール
- ルール5: エンティティを識別するキー
- プライマリーキーの定義には、エンティティを識別するキー属性を含まなければならない
最適化
概念データモデル
アプリケーションワークフロー
マッピング論理データモデル
最適化物理データモデル
最適化のポイント
- パーティションのサイズ
- パーティションの物理的なサイズの上限
- 読み込みパフォーマンスへの影響(削除を伴うと特に)
- パーティションを分割するような疑似カラムを導入して複合パーティションキーとして利用できるか検討する
物理データモデル
- データサイズやアクセスパターンを考慮してデータモデルを最適化
- CQLの作成
CREATE TABLE comments_by_user (
user_id UUID,
posted_timestamp TIMESTAMP,
video_id TIMEUUID,
comment TEXT,
title TEXT,
type TEXT,
tags SET<TEXT>,
preview_thumbnails MAP<INT, BLOB>,
PRIMARY KEY ((user_id), posted_timestamp, video_id)
) WITH CLUSTERING ORDER BY (posted_timestamp DESC, video_id ASC);
まとめ
データモデリングのポイント
• クエリーをあらかじめ知る
• データは非正規化
• Apache Cassandraが得意なパターンに落とす
もっと詳しく!
- DSEダウンロードとフリーのオンライントレーニング
- 開発用途に無償利用可能
- DS220: Data Modeling(12時間)
- https://academy.datastax.com/
KillrVideoデモアプリケーション
- https://killrvideo.github.io/
告知
Cassandra Summit Tokyo 2017
2017年10月5日(木) 10:00-
ベルサール東京日本橋
国内外のCassandraデベロッパーが集結!!!!
http://cassandra-jp.com/cst2017/ja/