7

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

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

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

4

3 回答 3

17

编辑:截至 2014 年 4 月 24 日的新 AWS 功能

自 4 月 24 日起,亚马逊增加了内部备份支持。 这使您可以每天对 redis 数据进行快照并将其还原到 ElastiCache 集群。它目前不允许导出/下载。如果您想保留自己的 redis 数据存档/备份,仍然需要以下解决方案。

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

原始答案

看起来这样做的唯一方法是执行以下操作。

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

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

编辑:阐述

我最终使用 Ruby gem/utility "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
于 2013-09-18T15:32:19.400 回答
3

看起来这已经不可能了。根据 AWS 文档,

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

于 2016-03-17T19:31:17.470 回答
1

ElastiCache 可能会禁用save或之类的命令bgsave。作为参考,请查看Restricted Redis Commands

以下 bash 脚本解决方案支持数据类型 string 和 hash。如果您希望支持其他数据类型(例如,集合、列表、排序集、位图),则必须扩展脚本(如脚本中所述)。

#!/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"
    ]
}
于 2020-01-27T19:59:32.193 回答