我正在AWS Elasticache Redis中测试新的Redis群集(AWS Large主/从节点)。
如何从Redis群集备份或导出数据?
其他托管的redis服务会自动创建Redis RDB转储文件并将其存储在S3上。我想和ElastiCache做类似的事情。
答案 0 :(得分:15)
编辑:截至2014年4月24日的新AWS功能
Amazon has added internal backup support as of 4/24.这允许您每天快照redis数据并将其还原到ElastiCache群集。它目前不允许导出/下载。如果您想保留自己的redis数据存档/备份,仍然需要以下解决方案。
大多数人应该能够使用现有的内置备份系统。
原始答案
看起来这样做的唯一方法是执行以下操作。
SAVE
命令以生成本地转储dump.rdb
我喜欢更简单的解决方案或内置于ElastiCache中的内容。
编辑:精化
我最终实际使用Ruby gem /实用程序“redis-backup”(https://github.com/josegonzalez/ruby-redis-backup)和运行以下shell命令的crontab构建了这个:
sudo -u redis /usr/bin/env S3_SAVE=true redis-backup -s /var/lib/redis/dump.rdb -B YOUR_S3_BUCKET_FOR_BACKUPS -A S3_ACCESS_KEY_ID -S S3_ACCESS_SECRET_KEY
答案 1 :(得分:3)
看起来这不再可能了。根据AWS文档,
"从Redis 2.8.22开始,ElastiCache不再支持外部只读副本。"
答案 2 :(得分:1)
ElastiCache可能禁用诸如save
或bgsave
之类的命令。供参考,请检查Restricted Redis Commands。
以下bash脚本解决方案支持数据类型字符串和哈希。如果要支持其他数据类型(例如,集合,列表,排序集合,位图),则必须扩展脚本(如脚本中所述)。
#!/bin/bash
# change KEY_PATTERN accordingly if you want a subset of the keys in redis cache
KEY_PATTERN="*"
# provide the default redis url here if you don't supply that from command line/environment:
if [[ -z $REDIS_SERVICE_URL ]]; then
REDIS_SERVICE_URL=redis://localhost:6379
fi
IFS=' '
iKey=0 # counter to iterate over the keys
echo {
# iterate through the keys in redis:
while read key; do
if [ $iKey -gt 0 ]; then
echo ","
fi
echo \"$key\":
# get the datatype for the current key
datatype=$(redis-cli -u "$REDIS_SERVICE_URL" type "$key")
# this script supports string/hash datatype.
# Extend if you want to support other data types.
if [ "$datatype" = 'string' ]; then
val=$(redis-cli -u "$REDIS_SERVICE_URL" get "$key")
echo -n \"${val//\"/\\\"}\"
elif [ "$datatype" = 'hash' ]; then
echo [
i=0
while read val; do
if [ $i -gt 0 ]; then
echo ","
fi
echo \"${val//\"/\\\"}\"
i=$((i+1))
done <<< $(redis-cli -u "$REDIS_SERVICE_URL" hgetall "$key")
echo ]
else
echo Unsupported type $datatype
exit -1
fi
iKey=$((iKey+1))
done <<< $(redis-cli -u "$REDIS_SERVICE_URL" keys "$KEY_PATTERN")
echo }
unset IFS
使用上述脚本的示例输出的格式化JSON:
{
"vlaue-key-1": "value-1",
"hash-key-1": [
"key-a",
"value of key-a in hash-key-1",
"key-b",
"20"
],
"vlaue-key-2": "25.5",
"hash-key-2": [
"key-x",
"value-x of hash-key-2/key-x",
"key-b",
"9999"
]
}