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"]