2016-09-22 162 views
2

我们有一个相当大的redis数据库(〜40GB),在我们的主机托管设施中,我们希望迁移到AWS的ElastiCache Redis服务。面临的挑战是数据在生产中经常更新(每分钟数万次的写入操作),因此将RDB文件上传到ElastiCache会导致已过期的ElastiCache实例。将大型/动态Redis数据库导入AWS ElastiCache

亚马逊的文档建议导入现有数据库的RDB文件 - 这很好。但是,我们如何导入在我们获取RDB快照之间发生的成千上万次写操作,将它们上载到S3并将其导入到ElastiCache实例中? ElastiCache似乎不支持SLAVEOF,因此我们不能简单地将其作为从属设备,然后将其切换到主设备。

有什么选择可以使ElastiCache redis实例与外部redis服务器保持大致同步,直到我们准备好翻转交换机并使ElastiCache服务器成为主Redis服务器为止?

+0

作为后续 - 我们结束了使用我们配置redis的常规EC2实例。我们只是从原始源中复制EC2实例,然后将其提升为主。 ElastiCache似乎不能支持这个简单的任务。 – Dan

回答

1

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

如果您无法停止该服务,则可以将增量移动数据至ElastiCache。但是,这是一个复杂得多的解决方案,您需要实现PROXY以将请求分派到旧的Redis实例和新的ElasticCache,并使用DATA-MOVER递增移动数据。 DATA-MOVER的工作原理如下:

  1. 开始时,代理会将所有请求分派给Redis。
  2. 使用scan命令从Redis获取一些密钥。
  3. 获取这些密钥的值。如果你有复杂的数据结构,例如list,set,您可能需要type,zsan,sscan,hscan命令来获取值。
  4. 将这些键和值写入ElasticCache。
  5. 代理将对这些密钥的请求分派给ElasticCache,并将其他密钥的请求分派给Redis
  6. 转到步骤2,直到所有密钥已移至ElasticCache。

每次我们只将一小部分数据移动到ElasticCache(这就是为什么它被称为增量移动)。当这些数据被移动到ElasticCache时,新的更新将被写入ElasticCache。所以你不会失去太多更新。

如果你的密钥有一些特殊的模式,这对增量移动和请求分派可能会有帮助。说,首先,您可以移动带有前缀aaa:的密钥,然后,您可以移动带有前缀bbb:的密钥,依此类推。

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

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