【OCI クラウド移行ガイド】 Amazon ElastiCache から OCI Cache へ移行してみた

# 概要
Redisのデータ移行に関する検証記事です。
検証にあたっては以下のリンクを参考にしました。

[Migrating OCI Redis Cache data from one cluster to another cluster](https://medium.com/@arunkumar.mb08/migrating-oci-redis-cache-data-from-one-cluster-to-another-cluster-7b524e87eeda)

# 構成
今回はAWS ElastCasheから[Oracle Cloud Infrastructure(OCI)](https://www.oracle.com/jp/cloud/) OCIキャッシュへのデータ移行を検証しました
Redisバージョンは以下の通りです
- AWS ElastCashe 7.1.0
- OCIキャッシュ 7.0.5

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/42c34d74-5cf2-c187-ae09-eb6054b1cb07.png">

# 準備

- AWS ElastiCache作成
- サンプルデータ入力
  以下のリンクからサンプルデータを入力
  [Sample Dataset](https://redis.io/learn/howtos/moviesdatabase/import)

- データが入力されたことを確認
```
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 : 出力先を指定します
    - コマンド実行時にエラー<font color="Red">redis.exceptions.ResponseError: CROSSSLOT Keys in request don't hash to the same slot</font>が発生する場合は、マルチキー操作を無効にするため -b 1を指定します
(参考)
[Redis (クラスターモードが有効) の ElastiCache クラスターでマルチキーオペレーションを行うときに、すべてのキーが同じノードに保存されているのに、「CROSSSLOT Keys in request don't hash to the same slot (リクエストされた CROSSSLOT キーが同じスロットにハッシュされません)」というエラーが発生するのは、なぜですか?](
https://repost.aws/ja/knowledge-center/elasticache-crossslot-keys-error-redis)
    　
```
[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"
```