Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 将大型/动态Redis数据库导入AWS ElastiCache_Amazon Web Services_Redis_Amazon Elasticache - Fatal编程技术网

Amazon web services 将大型/动态Redis数据库导入AWS ElastiCache

Amazon web services 将大型/动态Redis数据库导入AWS ElastiCache,amazon-web-services,redis,amazon-elasticache,Amazon Web Services,Redis,Amazon Elasticache,我们的托管设施中有一个相当大的redis数据库(~40GB),我们希望将其迁移到AWS的ElastiCache redis服务。挑战在于数据在生产中经常更新(每分钟数万次写入操作),因此将RDB文件上载到ElastiCache会导致ElastiCache实例已经过时 Amazon的文档建议导入现有数据库的RDB文件——这很好。但是,我们如何也导入在拍摄RDB快照、将其上传到S3并将其导入ElastiCache实例之间发生的数十万次写入操作呢?ElastiCache似乎不支持SLAVEOF,因此我

我们的托管设施中有一个相当大的redis数据库(~40GB),我们希望将其迁移到AWS的ElastiCache redis服务。挑战在于数据在生产中经常更新(每分钟数万次写入操作),因此将RDB文件上载到ElastiCache会导致ElastiCache实例已经过时

Amazon的文档建议导入现有数据库的RDB文件——这很好。但是,我们如何也导入在拍摄RDB快照、将其上传到S3并将其导入ElastiCache实例之间发生的数十万次写入操作呢?ElastiCache似乎不支持SLAVEOF,因此我们不能简单地将其初始设置为从属,然后切换到主


有哪些选项可以使ElastiCache redis实例与外部redis服务器保持大致同步,直到我们准备好翻转开关并使ElastiCache服务器成为主要redis服务器?

就个人而言,我认为最简单的解决方案是停止服务,将数据移动到ElastiCache,然后重新启动服务

如果无法停止服务,则可以将数据增量移动到ElastiCache。然而,这是一个复杂得多的解决方案,您需要实现一个
代理
来向旧的Redis实例和新的ElasticCache发送请求,以及一个
数据移动器
来增量移动数据。
数据移动器的工作原理如下:

  • 开始时,代理将所有请求发送到Redis
  • 使用
    scan
    命令从Redis获取一些密钥
  • 获取这些键的值。如果您有复杂的数据结构,例如
    列表
    设置
    ,则可能需要
    类型
    zsan
    sscan
    hscan
    命令来获取值
  • 将这些键和值写入ElasticCache
  • 代理将这些密钥的请求发送到ElasticCache,并将其他密钥的请求发送到Redis
  • 转至步骤2,直到所有关键帧都已移动到ElasticCache
  • 每次我们只将一小部分数据移动到ElasticCache(这就是为什么称之为增量移动)。当这些数据被移动到ElasticCache时,新的更新将写入ElasticCache。这样您就不会丢失太多更新

    如果您的键有一些特殊的模式,这可能有助于增量移动和请求分派。例如,首先可以移动前缀为
    aaa:
    的键,然后可以移动前缀为
    bbb:
    的键,依此类推

    如果您的键没有任何特殊模式,则可以使用哈希函数为每个键计算哈希键,并基于哈希键移动数据。例如:首先,移动满足以下条件的所有键:
    hash(key1)mod 10==0
    ,然后移动满足以下条件的所有键:
    hash(key2)mod 10==1
    ,依此类推


    正如我提到的,这是一个非常非常复杂的解决方案。您可能仍然喜欢最简单的一个:)

    作为后续,我们最终使用了一个常规EC2实例,并在该实例上配置了redis。我们只是从原始源代码复制EC2实例,然后将其升级为master。ElastiCache似乎无法支持这个简单的任务。