我们的托管设施有一个相当大的redis数据库(~40GB),我们希望迁移到AWS' ElastiCache Redis服务。挑战是数据经常在生产中更新(数万次写入操作/分钟),因此将RDB文件上传到ElastiCache会导致ElastiCache实例已经过时。
亚马逊的文档建议导入现有数据库的RDB文件 - 这很好。但是,我们如何导入在我们获取RDB快照,将其上传到S3并将其导入ElastiCache实例之间发生的数十万次写操作? ElastiCache似乎不支持SLAVEOF,因此我们不能简单地将其作为奴隶,然后将其切换到主人。
在我们准备好翻转交换机并使ElastiCache服务器成为主要的redis服务器之前,有哪些选项可以使ElastiCache redis实例与外部redis服务器保持近似同步?
答案 0 :(得分:1)
就个人而言,我认为最简单的解决方案是停止服务,将数据移至ElastiCache,然后重新启动服务。
如果您无法停止服务,则可以逐步移动数据到ElastiCache。但是,这是一个复杂得多的解决方案,您需要实现PROXY
将请求分派给旧的Redis实例和新的ElasticCache,并DATA-MOVER
逐步移动数据。 DATA-MOVER
的工作原理如下:
scan
命令从Redis中获取一些密钥。list
,set
,您可能需要type
,zsan
,sscan
,hscan
命令来获取值。每次我们只将一小部分数据移动到ElasticCache(这就是为什么它被称为逐步移动)。将这些数据移动到ElasticCache后,新的更新将写入ElasticCache。所以你不会失去太多的更新。
如果您的密钥具有某种特殊模式,则可能有助于递增移动和请求分派。首先,您可以移动前缀为aaa:
的密钥,然后,您可以移动前缀为bbb:
的密钥,依此类推。
如果您的密钥没有任何特殊模式,则可以使用散列函数计算每个密钥的散列密钥,并根据散列密钥移动数据。例如:首先,移动满足以下条件的所有密钥:hash( key1 ) mod 10 == 0
,然后移动满足以下条件的所有密钥:hash( key2 ) mod 10 == 1
,依此类推。
正如我所提到的,这是一个非常复杂的解决方案。您可能仍然喜欢最简单的一个:)