ElastiCache Redis 3.2.10 で使える「オンラインリサイズ機能」を試した

最近 ElastiCache Redis の検証をしていて,最近の新機能をキャッチアップできていなかったので「オンラインリサイズ機能」を試してみた.

用語

まず ElastiCache Redis の資料を読んでいると,管理コンソールと API で用語が異なっていてとにかく混乱するので,最初に整理しておく.現状だと以下は同じ意味で使われるので,今回は「管理コンソール」を尊重して「クラスタ」「シャード」という用語を使うことにする.なお,用語のためのドキュメントもあり,今後のアップデートで用語が統一される予定があると書いてあった.待望過ぎる!

  • 「クラスタ」 = 「レプリケーショングループ」
  • 「シャード」 = 「ノードグループ」

docs.aws.amazon.com

クラスタ

ElastiCache Redis クラスタの中にも,以下の2種類のモードがある.「クラスタモード無効のクラスタ」ってどういうこと?という感じはあるけど,正しく言うと,Redis 自体の Redis Cluster 機能 ( Redis Cluster Specification – Redis ) を有効にするか,無効にするかという違いで,構成もスケール戦略も全然違うため,どちらも理解しておく必要がある.

  • クラスタモード有効(シャードごとに分散し,シャードの中にマスターノードとレプリカノードを持つ構成)
  • クラスタモード無効(マスターノードとレプリカノードを持つ構成)

なお「クラスタモード有効」にする場合,ElastiCache Redis のバージョンは 3.2 系を選ぶ必要がある.

  • 3.2.10
  • 3.2.6
  • 3.2.4

オンラインリサイズ機能

「オンラインリサイズ機能」は去年11月にリリースされたもので,「クラスタモード有効」にした ElastiCache Redis 3.2.10 だけで使える.

aws.amazon.com

簡単に言うと,シャードを無停止でスケールアウトしたり,スケールインしたりできる機能で,今まではダウンタイムをある程度考慮する必要があった Redis の運用を大きく改善することができる.詳しくは,去年12月に開催された最新の BlackBelt 資料に載っている.

www.slideshare.net

試してみた : スケールアウト

まず「クラスタモード有効」にして,以下のような ElastiCache Redis クラスタを構築した.2 シャード,1 レプリカとした.

  • シャード名
    • kakakakakku-0001
      • スロット
        • 0-8191
      • ノード
        • kakakakakku-0001-001 kakakakakku-0001-001.xxxxxx.0001.apne1.cache.amazonaws.com
        • kakakakakku-0001-002 kakakakakku-0001-002.xxxxxx.0001.apne1.cache.amazonaws.com
    • kakakakakku-0002
      • スロット
        • 8192-16383
      • ノード
        • kakakakakku-0002-001 kakakakakku-0002-001.xxxxxx.0001.apne1.cache.amazonaws.com
        • kakakakakku-0002-002 kakakakakku-0002-002.xxxxxx.0001.apne1.cache.amazonaws.com

この構成のまま,以下のコマンドでシャードをスケールアウトすると,シャードが増えているのが確認できる.なお --node-group-count オプションでスケールアウト後のシャード数を設定することができる.

$ aws elasticache modify-replication-group-shard-configuration --replication-group-id kakakakakku --node-group-count 3 --apply-immediately

f:id:kakku22:20180119125017p:plain

スケールアウトが完了すると,以下のようにスロットがリバランスされていることを確認できる.なお,CLI だと aws elasticache describe-replication-groups で確認できる.

f:id:kakku22:20180119125050p:plain

参考として,現状と同じシャード数を指定して実行すると,ちゃんとエラーになった.

$ aws elasticache modify-replication-group-shard-configuration --replication-group-id kakakakakku --node-group-count 3 --apply-immediately

An error occurred (InvalidReplicationGroupState) when calling the ModifyReplicationGroupShardConfiguration operation: Slots in the replication group are uniformly distributed. No action to perform.

コマンドのドキュメントは以下にある.

試してみた : スケールイン

スケールインの場合は --node-group-count オプションに合わせて --node-groups-to-remove も使う必要がある.さらに --node-groups-to-remove '0001' '0002' のように,実際に削除するシャードを指定する必要がある.指定する機能はあっても良いけど,指定せずにスケールインする方法があっても良いのになー?という気もした.

$ aws elasticache modify-replication-group-shard-configuration --replication-group-id kakakakakku --node-group-count 1 --node-groups-to-remove '0001' '0002' --apply-immediately

f:id:kakku22:20180119125113p:plain

最終的に 1 シャードにスケールインできた.

f:id:kakku22:20180119125142p:plain

詳しくは以下のドキュメントに載っている.ただし,現時点だと「オンラインリサイズ機能」関連の内容が日本語のドキュメントに反映されていない部分も多く,読むときに注意が必要だった.

docs.aws.amazon.com

エンドポイント

「クラスタモード有効」の ElastiCache Redis にアプリケーションから接続する場合,設定エンドポイント (Configuration Endpoint) に接続することになる.ドキュメントを見ると,R/W Splitting をする場合でも同じエンドポイントで良いとのことだった.

設定エンドポイントを読み取りと書き込みの両方のオペレーションに使用します。Redis によってアクセス先のクラスターのノードが決定されます。

docs.aws.amazon.com

まとめ

  • ElastiCache Redis 3.2.10 で「クラスタモード有効」にすると,新機能「オンラインリサイズ機能」が使える
  • 無停止でスケールできるメリットがある
  • ただし「クラスタモード無効」と比べると,構成もスケール戦略も違うため,ユースケースによって選ぶ必要がある