ElastiCache(Redisクラスターモード無効/有効)への接続確認手順メモ

AWSからクライアントライブラリ提供はしておりません。大変申し訳ございません。 (以下資料のP.20参照) [AWS Black Belt Online Seminar 2017 Amazon ElastiCache] (https://d1.awsstatic.com/webinars/jp/pdf/services/20171214_AWS-Blackbelt-ElastiCache.pdf)

ただし、 "Redis 用 Amazon ElastiCache は、オープンソース Redis のデータ形式および Redis API との互換性を備えており、Redis クライアントとの連携が可能です。コードを変更することなく、自己管理型の Redis ワークロードを Redis 用 ElastiCache に移行できます。" Redis 互換 上記記載からオープンソースRedisに準拠したライブラリであれば使用可能かと思います。

Github: redis-rails Usage with Redis Cluster

ElastiCache(Redisサーバ)

ElastiCacheクラスタ モード シャード数 ノード数
rediscluster Clustered Redis 3 7
redisnoncluster Redis ReadReplica 1 2

Rails Client (AmazonLinux 2)

$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
$ gem -v
3.0.3
$ rails -v
Rails 5.2.4.3
$ gem list redis

*** LOCAL GEMS ***
redis (4.2.1)
redis-actionpack (5.2.0)
redis-activesupport (5.2.0)
redis-rack (2.1.3)
redis-rails (5.0.2)
redis-store (1.9.0)
redis-store-testing (0.0.2)

Redisクラスターモード無効

$ rails c
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> redis = Redis.new(url: 'redis://xxxxxxxxxx.xxxxx.ng.0001.apne1.cache.amazonaws.com:6379/0')
=> #<Redis client v4.2.1 for redis://xxxxxxxxxx.xxxxx.ng.0001.apne1.cache.amazonaws.com:6379/0>
irb(main):002:0> redis.flushdb      <--- データ削除
=> "OK"
irb(main):003:0> redis.keys           <--- データ削除確認
=> []
irb(main):004:0> redis.set "mykeyid0001", "123456789abcdefg"       <--- データSET
=> "OK"
irb(main):005:0> redis.keys           <--- Key一覧確認
=> ["mykeyid0001"]
irb(main):006:0> redis.get "mykeyid0001"          <--- データGET
=> "123456789abcdefg"

Redisクラスターモード有効

$ rails c
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> redis = Redis.new(cluster: %w[ **redis://xxxxxxxxxx.xxxxx.apne1.cache.amazonaws.com** :6379])
=> #<Redis client v4.2.1 for  **redis://10.0.XXX.XXX:6379/0 redis://10.0.XXX.XXX:6379/0 redis://10.0.XXX.XXX:6379/0** >
irb(main):002:0> redis.flushdb        <--- データ削除
=> "OK"
irb(main):003:0> redis.keys             <--- データ削除確認
=> []
irb(main):004:0> redis.set "mykeyid0001", "123456789abcdefg"      <--- データSET
=> "OK"
irb(main):005:0> redis.keys               <--- Key一覧確認
=> ["mykeyid0001"]
irb(main):006:0> redis.get "mykeyid0001"            <--- データGET
=> "123456789abcdefg"
irb(main):007:0> redis.set "mykeyid0002", "123456789abcdefg"     <--- 異なるKeyでデータSET
=> "OK"
irb(main):008:0> redis.set "mykeyid0003", "aaaaaaaaaaaaa"           <--- 異なるKeyでデータSET
=> "OK"
irb(main):009:0> redis.set "mykeyid0004", "bbbbbbbbbbbb"          <--- 異なるKeyでデータSET
=> "OK"
irb(main):010:0> redis.get "mykeyid0003"
=> "aaaaaaaaaaaaa"
irb(main):011:0> redis.keys
=> ["mykeyid0001", "mykeyid0002", "mykeyid0003", "mykeyid0004"]     <--- Key一覧確認

(略)

# 各ノード別接続してデータ分散されているか確認
$ rails c
Loading development environment (Rails 5.2.4.3)

# Cluster へ接続してKeyリスト取得
irb(main):001:0> redis = Redis.new(cluster: %w[redis://xxxxxxxxxxxx.xxxxxxx.apne1.cache.amazonaws.com:6379])
=> #<Redis client v4.2.1 for redis://10.0.XXX.XXX:6379/0 redis://10.0.XXX.XXX:6379/0 redis://10.0.XXX.XXX:6379/0>
irb(main):002:0> redis.keys
=> ["keyid0001", "keyid1001", "keyid1002", "keyid1003", "keyid1332", "keyid1333", "mykeyid0001", "mykeyid0002", "mykeyid0003", "mykeyid0004", "sessionid0001", "sessionid0002", "sessionid0003", "sessionid0004", "sessionid1111", "sessionid1112"]

# Keyのハッシュ値をもとにシャード毎にデータ格納されているか確認
# node0001-001(シャード1)
irb(main):001:0> redis = Redis.new(url: 'redis://xxxxxxxxxx.xxxxxxxxxxx.apne1.cache.amazonaws.com:6379/0')
=> #<Redis client v4.2.1 for redis://xxxxxxxxxxxxx-0001-001.eyz6sy.0001.apne1.cache.amazonaws.com:6379/0>
irb(main):002:0> redis.keys
=> ["sessionid1112", "sessionid0001", "mykeyid0002", "mykeyid0003", "keyid0001", "keyid1333", "keyid1332", "keyid1002"]

# node0002-001(シャード2)
irb(main):001:0> redis = Redis.new(url: 'redis://xxxxxxxxxxxxx-0002-001.eyz6sy.0001.apne1.cache.amazonaws.com:6379/0')
=> #<Redis client v4.2.1 for redis://rxxxxxxxxxxxxx-0002-001.eyz6sy.0001.apne1.cache.amazonaws.com:6379/0>
irb(main):002:0> redis.keys
=> ["sessionid0003", "sessionid1111", "sessionid0002", "keyid1001", "mykeyid0004"]

# node0003-001(シャード3)
irb(main):001:0> redis = Redis.new(url: 'redis://xxxxxxxxxxxxxr-0003-001.eyz6sy.0001.apne1.cache.amazonaws.com:6379/0')
=> #<Redis client v4.2.1 for redis://xxxxxxxxxxxxx-0003-001.eyz6sy.0001.apne1.cache.amazonaws.com:6379/0>
irb(main):002:0> redis.keys
=> ["sessionid0004", "keyid1003", "mykeyid0001"]