AWS Summit Tokyo 2018の「RDBMSだけで本当にいいの?NoSQL on AWSの勘所」のセッションを聴いて、個人的に気になった部分をまとめています。
まだ資料が公開されておらず、個人のメモをベースに書いているため、内容が全て網羅されているレポートではありません。
資料、動画が公開されたら別途ちゃんとしたレポートを書きます(多分)
NoSQLでよくある話
- 特にRDBMSで困ってない
- NoSQL使ってみたけど運用大変だし、性能悪い
- NoSQLどういう時に使う?
NoSQLとは
- RDBMS
- ストレージに最適化
- トランザクション処理に強い(これが一番デカい)
- スケールアウトの煩雑さ
- まだまだこれからだし、お金もかかる
- テーブルの運用負荷
- NoSQL
- 計算リソースに最適化
- トランザクション処理は限定的
- 高いスケーラビリティ
- もともとここを考えて作られているので
- クラスタの運用負荷
- 規模が大きくなるとサーバが増えてくるので
NoSQLの種類
- KVS
- カラム指向
- ドキュメント指向
- グラフ指向
NoSQLで実現したいこと
- どこまでスケールしても変わらない基盤
- 低レイテンシ、高スループット
- スケールするWebセッション管理
- Pub/Sub
- イベント処理
- Jsonなど複雑なデータの格納
Amazon ElastiCache
- インメモリKVS
- フルマネージド
- ハイパフォーマンス
- 高いスケーラビリティ
- RedisとMemcachedが利用可能
- Amazon Redis(Amazonによる拡張)
- バックアップの改善
- フェイルオーバー時の起動が可能
追加機能
- Redis Cluster Online Resizing
- セキュリティ機能の強化
- HIPAA認証取得
Redis Cluster
- Redis3.2からクラスターのサポート
Redis Cluster Online Resizing
- Redis Clusterのシャード数をダウンタイム0で動的に増減変更する
- SNSやLambdaと連携することでAutoScaleも可能
- メモリの枯渇度に合わせてリソースの増減
DynamoDB
- フルマネージド
- 高速
- スケーラビリティ
- イベント指向
管理不要で信頼性が高い
- SPOFが存在しない
- データは3箇所のAZに保存される
- 3箇所一気にデータセンターが落ちなければ大丈夫
- ストレージは自動的にパーティショニングされる
ストレージの容量制限がない
- 従量課金制のストレージ
追加機能
- バックアップ/リストアにネイティブ対応
- 数百TBのデータベースでもパフォーマンス影響なし
- Global Tables
- 複数リージョンでデータを共有したテーブルを作れる
- 全てのローカルにあるリージョンのテーブルに読み書きしたものが非同期にレプリケーションされる
- Auto Scaling
- デフォルトで対応
- キャパシティ設定を動的に管理
- DynamoDB Accelerator(DAX)
- 間にキャッシュクラスタを置くことができる
- パフォーマンス向上、コスト最適化
- TTL
- テーブルのITEMの有効期限を設定して、非同期で削除してくれる
- 設定しておくだけで古い不要なデータの削除が可能
Amazon Neptune
(ここはあんまり理解できてないです・・・)
- グラフDB
- フルマネージド
- SPARQLとGremlinに対応
- Apache ThinkProp、W4C RDFグラフモデルをサポート
グラフDBの得意な領域
- 高度に連結されたデータ
- ソーシャル・ネットワーク、レストランのレコメンデーション、不正取引の検出
- SNSでよく見ているデータとか、家族が見ているデータとか
- 店のLikeの情報から、その人に対するおすすめを出す
- 高速
- 高信頼性
- 簡単
- オープン
NoSQLのユースケース
キャッシング
- DBへのアクセスを減らすためのキャッシュ
- DBにクエリが走った時にLambdaでElastiCacheに入れたりできる
- DAXの活用
IoT
- データ量が多い
- AWS IoTから送られたデータを、DynamoDBへ保存
- Redisを使う場合はLambdaをかます
Pub/Sub
- チャットメッセージのPublishとSubscribeの実行
リアルタイムリーダーボード
- Redisによるリアルタイムランキング
グローバルアプリケーション
- DynamoDBのGlobal Tables
- 全部やると大変なので、グローバルに必要なものだけ切り出して使う(マスタデータとか)
- 各ローカルで使うようなものは、各リージョンで持てば良い
非同期処理のトリガー
- DynamoDB Streamsを使い、DBの変更内容をほかサービスへ連携
- Lambdaと連携する(Lambdaにつなげればもはやなんでもできる)
時系列データが必要なアプリケーション
- ホットデータとコールドデータでテーブルを分ける
NoSQLのデザインパターンの考え方
NoSQLのデータモデリング
- RDBMSでの手法を当てはめても、最適でない場合がある
- 非正規化とか
- データの連携等にこだわらずに実現したいことにこだわる
DynamoDBのデータモデリング
- DynamoDBの構造
- パーティションキーとソートキーがプライマリキーになる
- Global Secondary Index
- GSIを自由に作成することで自由に検索できる
事例
- Mackerel
- AmazonではOracleから全てDynamoDBに変えた
感想
キャッシュとしてMemcachedやRedisは使っているのでElastiCacheは分かっていたが、DynamoDBはなんとなく「Mongo DBのクラウド版みたいなもん?」くらいにしか思ってなかったので、機能とか設計の考え方とかを色々聞けて参考になった。
作るものの要件次第ではRDBMSの代わりとして十分使えそうだし、手軽に扱えるのも魅力。
Neptuneはこのセッションの日の直前にちょうどGAになったところだったので興味あったけど、まだイマイチ理解できず。
まずグラフDBちゃんと理解したい・・・