我目前有一个实例类型为cache.t2.micro的 Redis 集群
对于此实例类型,没有自动将 Redis 数据备份到 s3 的选项,也无法运行BGSAVE命令,因为它受到限制,如此处所述
我注意到,如果重新启动 Redis 集群中的主节点,或者 Redis 引擎版本从较低版本更改为较高版本(即从 3.x 到 4.x(,节点中的数据将被完全删除,尽管它们声称是最大的努力。
此外,不支持为此实例类型创建快照,如此处所述
我能想到的唯一选择是使用DUMP命令并获取密钥的序列化版本,并将此数据存档为所有 DBS,然后使用RESTORE命令将其还原回新集群。 但这可能不是最好的方法,因为它不可扩展,最终需要一些时间来处理更大的数据集。
同样对于启用了TTL的密钥,我必须运行 TTL 命令,获取 TTL(这是额外的开销(。
但是 DUMP 命令发出错误DUMP 有效负载版本或校验和是错误的,从而排除了该选项(难怪此命令不受限制(
在这种情况下,除了读取所有密钥及其值之外,还有其他方法可以进行备份和还原吗?
谢谢。
编辑:
所以我知道这不是最好的方法,但这是我能想到的。
TL;博士
读取所有密钥并将密钥从一个群集迁移到另一个群集。
对于具有配置的集群来说,这应该不是问题。 大于 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
无论密钥类型如何,以上都有效。
性能:上述内容在 2 秒内迁移了大约 ~4000 个密钥。
根据 AWS 文档:
对于 Redis (已禁用集群模式( Cache.t1.micro 节点不支持群集、备份和还原。 支持所有其他缓存节点类型。
因此,对于 cahce.t2 节点,您可以创建手动/最终快照,并在从快照还原时更改节点类型