You can
migrate your Redis DB to OCI Cache on Redis using the following steps.
You need to
use a data dump tools such as pyredis-dump for getting serialised dump from
your Redis DB.
This tool can be used to take a serialised dump from any Redis node
running in any cloud environments like AWS ElastiCache. So far, we are testing
only single master Redis cluster.
[root@jay ~]# git clone
https://github.com/tkote/pyredis-dump.git
Cloning into 'pyredis-dump'...
remote: Enumerating objects: 51, done.
remote: Counting objects: 100% (40/40), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 51 (delta 22), reused 28 (delta 17), pack-reused 11
Receiving objects: 100% (51/51), 15.89 KiB | 15.89 MiB/s, done.
Resolving deltas: 100% (22/22), done.
[root@jay ~]#
Using pyredis-dump,
you can create a backup of your dataset from OCI Redis as well for safe keeping
of your data.
You can use
the backup you have taken to move the Redis node to a different Redis node in
another region/VCN as per your requirement.
The
pyredis-dump has the following options:
[root@jay
pyredis-dump]# python3 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
[root@jay
pyredis-dump]#
Take a serialised
backup of the Redis.
Syntax:
# python3 pyredis-dump.py <Options> -H <Hostname/IP>
dump -o /path/to/backupfile
[root@jay
pyredis-dump]# python3 pyredis-dump.py -S -H
amaaaaaa2ne4d2aaxhlt47oluwtlrvualroXXocvb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com
dump -o /opt/redisdump/rdump1
dumping to '/opt/redisdump/rdump1'
connecting to {'db': 0, 'host': amaaaaaa2ne4d2aaxhlt47oluwtlrvualroXXocvb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com', 'port': 6379, 'ssl': True}
5 keys, bulk_size: 1000, watch_keys: False
dumped 5 records
elapsed time: 0.029 seconds
[root@jay
pyredis-dump]#
Here we
have taken a backup of the OCI Redis cluster. However, you may run the same
command to take backup of any Redis clusters in any environments.
In the
above command, we used the option ‘-S’ as we are connecting to an OCI Redis
cluster and it mandates secure TLS connection. For your Redis environment you
might not need to use this option.
The
pyredis-dump command creates a dump file in the path you specified. The time it
takes to create a dump depends on your data size.
Once you
get the dump file, you can move it to the location or an OCI instance from
which you can access your new OCI Redis cluster.
Restore
to OCI Redis Cache
You may use
the following command to restore the data to the new cluster.
Syntax:
# python3 pyredis-dump.py <Options> -H <Hostname/IP>
restore -i /path/of/backup
[root@jay
pyredis-dump]# python3 pyredis-dump.py -S -H amaaaaaa2ne4d2aaxhlt4XXXrvualrociwb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com
restore -i /opt/redisdump/rdump1
restore from '/opt/redisdump/rdump1'
connecting to {'db': 0, 'host': amaaaaaa2ne4d2aaxhlt4XXXrvualrociwb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com', 'port': 6379, 'ssl': True}
restored 5 records
elapsed time: 0.022 seconds
[root@jay
pyredis-dump]#
Some
catches:
If you get
the following error when using pyredis-dump, install redis for python.
[root@jay
pyredis-dump]# python3 pyredis-dump.py -h
Traceback (most recent call last):
File "pyredis-dump.py", line 7, in <module>
from redis import StrictRedis as Redis
ModuleNotFoundError: No module named 'redis'
[root@jay
pyredis-dump]#
Install
redis in python using pip3.
[root@jay
pyredis-dump]# pip3 install redis
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting redis
Downloading https://files.pythonhosted.org/packages/d6/f6/19237b28c632935c7359bddf703395ba13bbd134fc5e2eb297c4c120398c/redis-4.3.6-py3-none-any.whl (248kB)
100% |████████████████████████████████| 256kB 5.7MB/s
Collecting importlib-metadata>=1.0; python_version < "3.8" (from redis)
Downloading https://files.pythonhosted.org/packages/a0/a1/b153a0a4caf7a7e3f15c2cd56c7702e2cf3d89b1b359d1f1c5e59d68f4ce/importlib_metadata-4.8.3-py3-none-any.whl
Collecting async-timeout>=4.0.2 (from redis)
Downloading https://files.pythonhosted.org/packages/d6/c1/8991e7c5385b897b8c020cdaad718c5b087a6626d1d11a23e1ea87e325a7/async_timeout-4.0.2-py3-none-any.whl
Collecting packaging>=20.4 (from redis)
Downloading https://files.pythonhosted.org/packages/05/8e/8de486cbd03baba4deef4142bd643a3e7bbe954a784dc1bb17142572d127/packaging-21.3-py3-none-any.whl (40kB)
100% |████████████████████████████████| 40kB 11.4MB/s
Collecting typing-extensions; python_version < "3.8" (from redis)
Downloading https://files.pythonhosted.org/packages/45/6b/44f7f8f1e110027cf88956b59f2fad776cca7e1704396d043f89effd3a0e/typing_extensions-4.1.1-py3-none-any.whl
Collecting zipp>=0.5 (from importlib-metadata>=1.0; python_version < "3.8"->redis)
Downloading https://files.pythonhosted.org/packages/bd/df/d4a4974a3e3957fd1c1fa3082366d7fff6e428ddb55f074bf64876f8e8ad/zipp-3.6.0-py3-none-any.whl
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/lib/python3.6/site-packages (from packaging>=20.4->redis)
Installing collected packages: zipp, typing-extensions, importlib-metadata, async-timeout, packaging, redis
Successfully installed async-timeout-4.0.2 importlib-metadata-4.8.3 packaging-21.3 redis-4.3.6 typing-extensions-4.1.1 zipp-3.6.0
[root@jay
pyredis-dump]#
If you get
a ConnectionError exception as follows, its mostly due to OCI Redis cache needing
a secure TLS connection.
Error: redis.exceptions.ConnectionError:
Error while reading from <Hostname>:6379 (104, 'Connection reset by
peer')
[root@jay
pyredis-dump]# python3 pyredis-dump.py -H amaaaaaa2ne4d2aaxhlt47xxxktdy77fovocvb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com
dump -o rdump1
dumping to 'rdump1'
connecting to {'db': 0, 'host': amaaaaaa2ne4d2aaxhlt47xxxktdy77fovocvb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com', 'port': 6379, 'ssl': None}
[..]
redis.exceptions.ConnectionError: Error while reading from amaaaaaa2ne4d2aaxhlt47xxxktdy77fovocvb3xmg546a-p.redis.eu-frankfurt-1.oci.oraclecloud.com:6379 : (104, 'Connection reset by
peer')
[root@jay
pyredis-dump]#
OCI Redis
cache requires secure TLS connection. The pyredis-dump supports TLS connection
using switch ‘-S’. Use this option to the connection string.