• 検索結果がありません。

Advanced Design Pattern for Amazon ElastiCache アマゾンウェブサービスジャパン 2020, Amazon Web Services, Inc. or its Affiliates.

N/A
N/A
Protected

Academic year: 2021

シェア "Advanced Design Pattern for Amazon ElastiCache アマゾンウェブサービスジャパン 2020, Amazon Web Services, Inc. or its Affiliates."

Copied!
63
0
0

読み込み中.... (全文を見る)

全文

(1)

アマゾンウェブサービスジャパン

Advanced Design Pattern for

Amazon ElastiCache

(2)

Agenda

Amazon ElastiCacheについて

ElastiCache ユースケースパターン

• アーキテクチャについての考察

ElastiCacheを用いた実装の方法

• まとめ

(3)
(4)
(5)
(6)

Amazon ElastiCache

とは

• フルマネージド

• 高速な2種類のエンジン(

memcached, redis

)をサポート

• キャッシュクラスタを数クリックで起動

• 初期費用なし、時間単位の従量課金

• 可用性を向上させる機能

• モニタリング

• 自動障害検出、復旧

• 拡張

• パッチ適用

• バックアップ

(7)

What is Memcached?

2003年初リリース。Memcachedの機能

• シンプルなインメモリLRUキャッシュ

• シンプルな string-stringのキーバリューストア

• StringとObjectをサポート

• マルチスレッド

• シャーディングはクライアントライブラリで

• スケールが簡単

• 永続化はなし

• オープンソース

(8)

Amazon ElastiCache for memcached

特徴

• 対応バージョン

1.5.16、1.5.10、1.4.34 、1.4.33 、1.4.24、1.4.14、

1.4.5 (2020.8.24現在)

Cache Clusterという論理グループに、Cache Nodeを起動

Configration

Endpoint

Node

Endpoint

Endpoint

Node

(9)

Auto Discovery for memcached

DNS エイリアスとして提供され稼働しているノードリストを表示する

従来のクライアントの設定

Cache Clusterの全エンドポイントを接続先として設定

Auto Discoveryクライアント(Java, PHP, .NET)

Cache ClusterのConfiguration EndpointはCache Clusterの ロードバランサ(Proxy)

ではなく、接続先として設定すると全ノードを自動取得・設定し、接続する

CacheCluster

xxx.

0001

.apne1.cache.amazonaws.com

App

通常のクライアントライブラリ

App

(10)

What is Redis?

2009年初リリース。 Redis の機能

複雑なデータ型

: Strings, Lists, Sets, Sorted Sets, Hash Maps, HyperLogLog,

Geospatial, and Streams

レプリケーションによる高可用性

オンラインシャーディングによるスケーラビリティ

永続化、スナップショット

&リストア

Multi-key atomic operations

LUA スクリプティング

(11)

Amazon

による

Redis

拡張

Swap Memoryの最適化

同期やスナップショット中にスワップの使用量が増加するリスクを軽減

書き込みの動的な制限

ノードのメモリが使い尽くされている時の出力バッファ管理の改善

高速なフェイルオーバ

レプリカがプライマリとの完全な再同期を行うためにデータをフラッ

シュするのを避けるため、クラスタはより早く回復

強化された

I/O処理

I/O の処理とワークロードの動的調整に使用するコアを増やすことでス

(12)

Redis Cluster Mode – Enabled vs. Disabled

Feature

クラスターモード有効

クラスターモード無効

リカバリタイム

10-20 秒 (non-DNSベース)

~30+ 秒 (DNSベース)

フェイルオーバの

影響

Writesはシャードへの影響

Readsは問題なし

Writes はデータセット全体に影響

Readsは問題なし

最大ノード数

最大

250* ノード (デフォルト90ノード =

15 シャード+ 0–5 のシャードあたりレプ

リカ

)

1 プラマリノード + 0-5 レプリカ (最大6

ノード)

最大ストレージ

170 TB (635 GB x 250)

635 GB

最大接続数

16,250,000 (65,000 x 250)

390,000 (65,000 x 6)

オンラインスケー

リング

シャーディング

/リードレプリカ

リードレプリカ

マイグレーション

スナップショットのBackup/Restore

オンラインマイグレーションツール

スケーラビリティ

とパフォーマンス

水平スケールによるハイスループット

垂直スケールアップもサポート

最大スループットは

1プライマリ、5リー

ドレプリカの構成

リードレプリカによる水平スケール

レプリカ/プライマリの垂直スケールも

サポート

P

P P P

R

Configuration Endpoint Primary Endpoint Slot 0 Slot 1 … Slot 16383 Slot 0–5461 Slot 5462–10922 Slot 10923– 16383 R R R

(13)
(14)

Webアプリケーションのセッション管理ストアとして

• キャッシュレイヤとして

• ニュースアプリの”最新のニュース”機能の実装

• チャット/メッセージングアプリの実装

• リアルタイムリーダーボードの実装

• デジタルマーケティング等におけるユニークユーザー数推定

• 位置情報を用いたモバイルアプリケーションの実装

ユースケースパターン

(15)
(16)

Web

セッションとは

Web/Appサーバ

クライアント

ログイン

Web/Appサーバで、「このユーザーがこのクライアントからログイン

中である」という情報を保持する必要がある

セッション

(17)

App

サーバのメモリ上のみにセッションを保持

Web/Appサーバ

クライアント

ログイン

アプリケーションサーバのメモリ上に

保持?

(18)

App

サーバのメモリ上のみにセッションを保持

Web/Appサーバ

クライアント

Web/Appサーバ

Load

Balancer

ロードバランサ

ロードバランサ

同じセッションのクライアントは同じサーバに固定する必要があり、負荷分散の

足枷に

オートスケーリング

負荷が下がってもセッションが残っているインスタンスはスケールインできない

(19)

ElastiCache

をセッションストアとして利用

Web/Appサーバ

クライアント

Web/Appサーバ

Load

Balancer

ロードバランサ

ElastiCacheをセッションストアとして利用

Web/Appサーバはステートレス

• いつでもスケールイン可能

• ロードバランサの負荷分散に制限なし

ElastiCache

SET/GET

(20)

ElastiCache

をセッションストアとして利用

Memcached vs Redis

• セッションの永続化が不要な場合はシンプルなインメモリ

KVSであるMemcached

• 永続化したい場合はRedis

Redisをつかう場合

• データタイプはHashを使うとメモリ効率がよい

(21)
(22)

データベースへのアクセス

Web/Appサーバ

データベース

すべての読込み、書込みを直接データ

ベースに任せる

(23)

リクエスト数の増加

データベース

Web/Appサーバ

規模が大きくなり、

Readの数が増える

とデータベース一台では捌き切れない

• データベースインスタンスのスケー

リクエスト

(24)

“Lazy Loading”

なキャッシュレイヤ

データベース

Web/Appサーバ

リクエスト

ElastiCache

“Lazy Loading”シーケンス

1. キャッシュからread

2. データがなければDBか

read

3. データをキャッシュへ

write

4. キャッシュデータはTTL

Expire

1.read

2.read

3.write

• アクセスのあったデータのみ

• オリジンデータの更新への追随のタイムラグ

• キャッシュミスの際のレイテンシ

(25)

“Write Through”

なキャッシュレイヤ

データベース

Web/Appサーバ

書込み

リクエスト

ElastiCache

DBへのWrite後、直ぐに

キャッシュへ

Write

データ取得は原則として常に

キャッシュから。

2.write

1.write

• キャッシュ上のデータが古くならない

(26)

擬似コード

Lazy Loading

更新時は

DBのみ書き込み

読込時

data = GET_FROM_CACHE()

if (data does not exist) {

data = GET_FROM_DATABASE()

SET_TO_CACHE(data)

Write Through

更新時

WRITE_TO_DATABASE(data)

SET_TO_CACHE(data)

読込時

GET_FROM_CACHE(data)

(27)

さまざまなデータストアのキャッシング

RDS

Web/Appサーバ

リクエスト

ElastiCache

DynamoDB

DocumentDB

ElasticSearch

Service

S3

(28)
(29)

ニュースアプリの

最新のニュース

機能要件

• 最新のニュース5件を常に表示する

(30)

ニュースアプリの

最新のニュース

機能要件

• 最新のニュース20件を常に表示する

• 新たに3件ニュースが発生した場合、古い3件は消える

(31)

「最近のニュース」データモデル

ニュース

4

ニュース

3

ニュース

2

ニュース

1

ニュース

5

(32)

「最近のニュース」データモデル

ニュース

4

ニュース

3

ニュース

2

ニュース

1

ニュース

5

ニュース

6

1. 最新を追加

2. 最古を削除

(33)

「最近のニュース」データモデル

ニュース

4

ニュース

3

ニュース

2

ニュース

5

ニュース

6

1. 最新を追加

2. 最古を削除

“Capped List”

(34)

「最近のニュース」データモデル

ニュース

4

ニュース

3

ニュース

2

ニュース

1

ニュース

5

ニュース

6

1. 最新を追加

2. 最古を削除

Listデータタイプ

(LPUSHコマンド)

(LTRIMコマンド)

(35)

「最近のニュース」データモデル

ニュース

4

ニュース

3

ニュース

2

ニュース

1

ニュース

5

ニュース

8

ニュース

6

ニュース

2

ニュース

1

ニュース

9

ニュース

6

ニュース

5

ニュース

4

ニュース

2

ニュース

8

ユーザー

A

ユーザー

B

ユーザー

C

(36)

「最近のニュース」データモデル

4

3

2

1

5

政治経済

政治経済

テック

ユーザ

A

エンタメ

テック

ユーザ

B

Setデータタイプ

Listデータタイプ

(37)

「最近のニュース」

Redis

コマンド

>

LPUSH

User_A NEWSID_1

>

LPUSH

User_A NEWSID_2

>

LPUSH

User_A NEWSID_3

>

LPUSH

User_A NEWSID_4

>

LPUSH

User_A NEWSID_5

>

LPUSH

User_A NEWSID_6

>

LTRIM

User_A 0 4

>

LRANGE

User_A 0 -1

1) ”NEWSID_6"

2) ”NEWSID_5"

最新の

5件のみ保持して残りを削除

User_Aリストの先頭に新項目追加

(38)
(39)

チャットアプリケーションの機能要件

• 複数人が発言できる

(40)

チャットアプリケーションの実装検討

Web/Appサーバ

データベース

クライアント

1

クライアント

2

1.write

2.write

クライアント

2はいつデータを読みにいくか?

Web/Appサーバ

(41)

チャットアプリケーションの実装検討

Web/Appサーバ

データベース

クライアント

1

クライアント

2

1.write

2.write

3.polling

4.read

Polling…リソースの無駄、またタイムラグが大きい

Web/Appサーバ

(42)

ElastiCache for Redis

でやってみる

RedisのPub/Sub機能

• チャットルームごとにチャンネル作成

SUBSCRIBE

chat_channel_114

PUBLISH

chat_channel_114 "Hello all"

>> ["message", "chat_channel_114", "Hello all"]

(43)

ElastiCache for Redis

でやってみる

Web/Appサーバ

ElastiCache

クライアント

1

クライアント

2

1.write

2.PUBLISH

• クライアントサーバ間はWebSocketで接続

Web/Appサーバ

WebSocket

WebSocket

ALB (sticky session)

3.メッセージReceive

4.クライアントへ

(44)

ElastiCache for Redis

でやってみる

Web/Appサーバ

ElastiCache

クライアント

1

クライアント

2

1.write

2.PUBLISH

• クライアントサーバ間はWebSocketで接続

• 各クライアントはあらかじめRedisのチャネルにSubscribe

Web/Appサーバ

WebSocket

WebSocket

ALB (sticky session)

subscribe

3.メッセージReceive

4.クライアントへ

Push

(45)

過去ログをみたい

Web/Appサーバ

ElastiCache

クライアント

1

クライアント

2

Web/Appサーバ

WebSocket

WebSocket

ALB (sticky session)

データベース

DBへWrite & RedisでPUBLISH

(46)

過去ログもみたい

with Redis STEAMS

Web/Appサーバ

ElastiCache

クライアント

1

クライアント

2

Web/Appサーバ

WebSocket

WebSocket

ALB (sticky session)

XADD chat_channel * msg “hey!”

XREAD STREAMS chat_channel 0

(47)
(48)

リーダーボードとは

トップ

10人の順位とスコアをリアルタイムに表示

自分の順位とスコアの表示

(49)

リアルタイムリーダーボード データモデル

ユーザー

5: 500pt

ユーザー

1: 400pt

ユーザー

2: 300pt

ユーザー

4: 200pt

ユーザー

3: 100pt

(50)

リアルタイムリーダーボード データモデル

ユーザー

5: 500pt

ユーザー

1: 400pt

ユーザー

2: 300pt

ユーザー

4: 200pt

ユーザー

3: 100pt

ユーザー

6: 350pt

O(log(N))で追加/更新

参加ユーザーの追加

/スコアの更新

(51)

リアルタイムリーダーボード データモデル

ユーザー

5: 500pt

ユーザー

1: 400pt

ユーザー

2: 300pt

ユーザー

4: 200pt

ユーザー

3: 100pt

ユーザー

6: 350pt

O(log(N))で取得

上位

3人を取得するオペレーション

(52)

Redis “Sorted Set”

データタイプ

ZADD

"leaderboard" 1201 ”User_1”

ZADD

"leaderboard" 963 " User_2"

ZADD

"leaderboard" 1092 ”User_3

"

ZADD

"leaderboard" 1383 ”User_4”

ZREVRANGE

"leaderboard" 0 -1

1) ”User_2"

2) ”User_3"

3) ”User_1"

4) ”User_4”

ZREVRANK

"leaderboard" ”User_3"

O(log(N))でトップN取得

O(log(N))で要素追加

(53)
(54)

広告配信のターゲッティング

• ユーザーの興味属性(アクセス履歴)に応じてセグメント化

ビジネスニュースへの興味

不動産サイトへの興味

エンタメへの興味

スポーツへの興味

• セグメント毎のボリュームの見積

ビジネスニュースに興味のあるユーザの人数は?

(55)

広告配信のターゲッティング

• ユーザーの興味属性(アクセス履歴)に応じてセグメント化

ビジネスニュースへの興味

不動産サイトへの興味

エンタメへの興味

スポーツへの興味

• セグメント毎のボリュームの見積

ビジネスニュースに興味のあるユーザの人数は?

SELECT count(distinct user_id) FROM user_access_history

WHERE interest IN (‘business_news’);

(56)

広告配信のターゲッティング

• ユーザーの興味属性(アクセス履歴)に応じてセグメント化

ビジネスニュースへの興味

不動産サイトへの興味

エンタメへの興味

スポーツへの興味

• セグメント毎のボリュームの見積

ビジネスニュースに興味のあるユーザの人数は?

SELECT count(distinct user_id) FROM user_access_history

WHERE interest IN (‘business_news’);

(57)

Redis “HyperLogLog”

PFADD

business_news User_1

PFADD

business_news User_2

PFADD

business_news User_3

PFADD

business_news User_1

PFCOUNT

business_news

(integer) 3

(58)

Redis “HyperLogLog”

PFADD

business_news User_1

PFADD

business_news User_2

PFADD

business_news User_3

PFADD

business_news User_1

PFADD

entertainment User_1

PFADD

entertainment User_4

PFCOUNT

business_news

(integer) 3

PFMERGE

business_or_entertainment business_news entertainment

PFCOUNT

business_or_entertainment

(integer) 4

エンタメ

:ユニークユーザは2人

ビジネスニュース

:ユニークユーザは3人

(59)
(60)

位置情報を用いたモバイルアプリケーション

• モバイル端末において、ユーザーの現在の位置情報を用い

て、「近くの店舗」を提案するアプリケーション

(61)

位置情報を用いたモバイルアプリケーション

ElastiCache

各店舗の位置情報

GEOADD

クライアント

Lambda

ユーザーの位置情報で問い合わせ

GEORADIUS

(62)

位置情報を用いたモバイルアプリケーション

GEOADD

shops <経度> <緯度> shop_1

GEOADD

shops <経度> <緯度> shop_2

GEOADD

shops <経度> <緯度> shop_3

GEOADD

shops <経度> <緯度> shop_4

GEORADIUS

shops <経度> <緯度> 500 m ASC

1) ”shop_1"

2) ”shop_3"

3) ”shop_2”

指定した位置から半径

500m以内の店舗を近い順に

(63)

参照

関連したドキュメント

サーバー費用は、Amazon Web Services, Inc.が提供しているAmazon Web Servicesのサーバー利用料とな

(4) 現地参加者からの質問は、従来通り講演会場内設置のマイクを使用した音声による質問となり ます。WEB 参加者からの質問は、Zoom

ユーザ情報を 入力してくだ さい。必要に 応じて複数(2 つ目)のメー ルアドレスが 登録できます。.

※ログイン後最初に表示 される申込メニュー画面 の「ユーザ情報変更」ボタ ンより事前にメールアド レスをご登録いただきま

ユーザ情報を 入力してくだ さい。必要に 応じて複数(2 つ目)のメー ルアドレスが 登録できます。.

1 つの Cin に接続できるタイルの数は、 Cin − Cdrv 間 静電量の,計~によって決9されます。1つのCin に許される Cdrv への静電量は最”で 8 pF

教職員用 平均点 保護者用 平均点 生徒用 平均点.

1) 特に力を入れている 2) 十分である 3) 課題が残されている. ] 1) 行っている <選択肢> 2) 行っていない