概要
Redisのデータ移行に関する検証記事です。
検証にあたっては以下のリンクを参考にしました。
Migrating OCI Redis Cache data from one cluster to another cluster
構成
今回はAWS ElastCasheからOracle Cloud Infrastructure(OCI) OCIキャッシュへのデータ移行を検証しました
Redisバージョンは以下の通りです
- AWS ElastCashe 7.1.0
- OCIキャッシュ 7.0.5
準備
-
AWS ElastiCache作成
-
サンプルデータ入力
以下のリンクからサンプルデータを入力
Sample Dataset -
データが入力されたことを確認
redis:6379> dbsize
(integer) 7036
redis:6379> HMGET "movie:343" title release_year genre
1) "Spider-Man"
2) "2002"
3) "Action"
redis:6379> HMGET "theater:20" name location
1) "Broadway Theatre"
2) "-73.98335054631019,40.763270202723625"
redis:6379> HMGET "user:343" first_name last_name last_login
1) "Umeko"
2) "Castagno"
3) "1574769122"
redis:6379>
Dump
- AWS InstanceにPythonをinstall
- AWS Instanceにgitをinstall
- AWS Instanceにpyredis-dump toolをclone
[user@ec2]$ git clone https://github.com/tkote/pyredis-dump.git
- pipコマンドでredisをinstall
- pyredis-dumpコマンドオプションを確認
[user@ec2]$ python3 pyredis-dump/pyredis-dump.py -h
Usage: pyredis-dump.py [options] dump|restore|dblist
Options:
-h, --help show this help message and exit
-H HOST, --host=HOST connect to HOST (default localhost)
-P PORT, --port=PORT connect to PORT (default 6379)
-s SOCKET, --socket=SOCKET
connect to SOCKET
-d DB, --db=DB database
-w PASSWORD, --password=PASSWORD
connect with PASSWORD
-p PATTERN, --pattern=PATTERN
pattern
-o OUTFILE, --outfile=OUTFILE
write to OUTFILE
-i INFILE, --infile=INFILE
read from INFILE
-t use ttl when in restore mode
-b BULK, --bulk=BULK dump/restore bulk size
-S, --ssl use tls connection
-k, --watch watch key value change while dumping
- Dump実行
オプションは以下のとおりです。- -S : tls接続します
- -H : Host名を指定します
- dump
- -o : 出力先を指定します
- コマンド実行時にエラーredis.exceptions.ResponseError: CROSSSLOT Keys in request don't hash to the same slotが発生する場合は、マルチキー操作を無効にするため -b 1を指定します
(参考)
Redis (クラスターモードが有効) の ElastiCache クラスターでマルチキーオペレーションを行うときに、すべてのキーが同じノードに保存されているのに、「CROSSSLOT Keys in request don't hash to the same slot (リクエストされた CROSSSLOT キーが同じスロットにハッシュされません)」というエラーが発生するのは、なぜですか?
[user@ec2]$ python3 pyredis-dump/pyredis-dump.py -b 1 -S -H 【Host名】 dump -o outfile5.py3redis
dumping to 'outfile5.py3redis'
connecting to {'db': 0, 'host': '【Host名】', 'port': 6379, 'ssl': True}
7,036 keys, bulk_size: 1, watch_keys: False
dumped 7,036 records
elapsed time: 4.341 seconds
ファイル転送
DumpしたAWSインスタンスからRestoreするOCIインスタンスに出力ファイルを転送します
1台でDump/Restoreを実施できる場合は、当作業はスキップします
Restore
- OCIにログインしてOCIキャッシュを作成
- OCI InstanceにPythonをinstall
- OCI Instanceにgitをinstall
- OCI Instanceにpyredis-dump toolをclone
- pipコマンドでredisをinstall
- Restore実行
オプションは以下のとおりです。- -S : tls接続します
- -H : Host名を指定します
- restore
- i : 入力元を指定します
[user@linux]$ python3 pyredis-dump/pyredis-dump.py -S -H 【Host名】 restore -i outfile5.py3redis
restore from 'outfile5.py3redis'
connecting to {'db': 0, 'host': '【Host名】', 'port': 6379, 'ssl': True}
/home/opc/work/redis/pyredis-dump/pyredis-dump.py:109: DeprecationWarning: Pipeline.hmset() is deprecated. Use Pipeline.hset() instead.
p.hmset(key, value)
restored 7,036 records
elapsed time: 0.533 seconds
確認
OCIキャッシュにアクセスして正常にリストアされたことを確認します
[user@linux]$ redis-cli -h 【Host名】 --tls
redis:6379> dbsize
(integer) 7036
redis:6379> HMGET "movie:343" title release_year genre
1) "Spider-Man"
2) "2002"
3) "Action"
redis:6379> HMGET "theater:20" name location
1) "Broadway Theatre"
2) "-73.98335054631019,40.763270202723625"
redis:6379> HMGET "user:343" first_name last_name last_login
1) "Umeko"
2) "Castagno"
3) "1574769122"