ElastiCache - 将数据从t1.*/t2.*迁移到m3.*

Ada*_*rsh 5 amazon-web-services redis amazon-elasticache

我目前有一个Redis集群,实例类型为cache.t2.micro

没有选项来自动备份Redis的数据到S3这个实例类型,也一个不能运行BGSAVE为命令其描述限制这里

我注意到,如果重新启动Redis群集中的主节点,或者Redis引擎版本从较低版本更改为较高版本(即从3.x到4.x),则会完全删除节点中的数据,尽管他们声称尽力而为.

此处还不支持为此实例类型创建快照

我能想到的唯一选择是使用DUMP命令并获取密钥的序列化版本并为所有DBS归档此数据,然后使用RESTORE命令将其还原回新集群.但这可能不是最好的方法,因为它不可扩展,最终需要一些时间来处理更大的数据集.

同样对于启用了TTL的密钥,我必须运行TTL命令,获取TTL(这是额外的开销).

但DUMP命令发出错误DUMP有效负载版本或校验和错误,该规则将该选项排除(难怪此命令不受限制)

除了读取所有键及其值之外,还有其他方法可以执行备份和还原吗?

谢谢.


编辑:

所以我知道这不是最好的方法,但这是我能想到的.

TL; DR

读取所有密钥并从一个群集迁移到另一个群集.

对于具有config的集群,这应该不是问题.大于t2.*

码:

import traceback
from redis import Redis
import itertools

def migrate_to_another_redis_node(source_node, source_node_port_no, dest_node, dest_node_port_no):
'''
migrates the keys from one redis node to the other
:param source_node: source redis node url
:param source_node_port_no: source redis node port number
:param dest_node: destination redis node url
:param dest_node_port_no: destination redis node port number
:return: True/False
'''
    try:
        total_keys_migrated = 0
        for db in range(16):
             source_redis_client = Redis(source_node, source_node_port_no, db=db)
             dest_redis_client = Redis(dest_node, dest_node_port_no, db=db)
             for key in source_redis_client.keys('*'):
                 key_type = source_redis_client.type(key).decode()
                 if key_type == 'string':
                     value = source_redis_client.get(key)
                     dest_redis_client.set(key, value)
                 elif key_type == 'list':
                     values = source_redis_client.lrange(key, 0, -1)
                     dest_redis_client.rpush(key, *values)
                 elif key_type == 'hash':
                     key_value_pairs = source_redis_client.hgetall(key)
                     dest_redis_client.hmset(key, key_value_pairs)
                 elif key_type == 'set':
                     values = source_redis_client.smembers(key)
                     dest_redis_client.sadd(key, *values)
                 elif key_type == 'zset':
                     values = list(itertools.chain(*source_redis_client.zrange(key, 0, -1, withscores=True)))
                     dest_redis_client.zadd(key, *values)
                 ttl = source_redis_client.ttl(key)
                 if ttl:
                     dest_redis_client.expire(key, ttl)
                 total_keys_migrated += 1
        print('total keys migrated is {}'.format(total_keys_migrated))
        return True
   except:
        error = traceback.format_exc()
        print(error)
   return False
Run Code Online (Sandbox Code Playgroud)

以上工作与键类型无关.
性能:上面在2秒内迁移了约4000个密钥.

小智 0

根据 AWS 文档:

对于 Redis(禁用集群模式)集群,​​cache.t1.micro 节点不支持备份和恢复。支持所有其他缓存节点类型。

因此,对于 cahce.t2 节点,您可以创建手动/最终快照并在从快照还原时更改节点类型