首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何备份AWS的Elasticache数据?

如何备份AWS的Elasticache数据?
EN

Stack Overflow用户
提问于 2013-09-18 15:17:21
回答 3查看 8.2K关注 0票数 7

我正在测试一个新的Redis集群(AWS大主/从节点)在AWS Elasticache中。

如何从Redis集群备份或导出数据?

其他托管的redis服务会自动创建Redis转储文件并将其存储在S3上。我想在ElastiCache上做一些类似的事情。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-18 15:32:19

编辑:自2014年4月24日起新的功能

Amazon has added internal backup support as of 4/24.允许您每天快照redis数据并将其还原到ElastiCache集群中。目前不允许导出/下载。如果您想要保存您自己的redis数据存档/备份,则仍然需要下面的解决方案。

大多数人应该能够使用现有的内置备份系统。

原始答案

这看起来是唯一的方法,这是做以下工作。

  • 拆分新的EC2实例
  • 安装Redis
  • 配置附加到ElastiCache redis主目录的本地副本
  • 等待数据在本地同步
  • 发出redis SAVE命令以生成本地转储
  • 本地dump.rdb在S3上的存档

我想要一个更简单的解决方案或内置在ElastiCache中的东西。

编辑:精化

最后,我使用Ruby /实用工具"redis-backup“(https://github.com/josegonzalez/ruby-redis-backup)实际构建了这个程序,并运行了以下shell命令:

代码语言:javascript
运行
复制
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
票数 17
EN

Stack Overflow用户

发布于 2016-03-17 19:31:17

看来这已经不可能了。根据AWS的文件,

“从Redis 2.8.22开始,ElastiCache不再支持外部读取副本。”

票数 3
EN

Stack Overflow用户

发布于 2020-01-27 19:59:32

ElastiCache可能禁用savebgsave之类的命令。如需参考,请查看Restricted Redis Commands

下面的bash脚本解决方案支持数据类型、字符串和哈希。如果您希望支持其他数据类型(例如,set、list、排序集、位图),则必须扩展脚本(如脚本中的注释)。

代码语言:javascript
运行
复制
#!/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:

代码语言:javascript
运行
复制
{
    "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"
    ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18876147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档