【发布时间】:2014-05-16 02:26:47
【问题描述】:
我有两个 redis 实例都在 win64 的同一台机器上运行。该版本是来自https://github.com/MSOpenTech/redis 的版本,没有任何修改,并且二进制文件按照从 github 下载的方式运行(即版本 2.6.12)。
我想创建一个从站并将其同步到主站。我在同一台机器上执行此操作,以确保它在位于 WAN 的机器上创建从属设备之前工作,这将需要大约一个小时来传输主服务器中存在的数据。
但是,我收到以下错误:
[4100] 15 May 18:54:04.620 * Connecting to MASTER...
[4100] 15 May 18:54:04.620 * MASTER <-> SLAVE sync started
[4100] 15 May 18:54:04.620 * Non blocking connect for SYNC fired the event.
[4100] 15 May 18:54:04.620 * Master replied to PING, replication can continue...
[4100] 15 May 18:54:28.364 * MASTER <-> SLAVE sync: receiving 2147483647 bytes from master
[4100] 15 May 18:55:05.772 * MASTER <-> SLAVE sync: Loading DB in memory
[4100] 15 May 18:55:14.508 # Short read or OOM loading DB. Unrecoverable error, aborting now.
我可以同步的唯一方法是通过一个类似于以下内容的迷你脚本:
import orm.model
if __name__ == "__main__":
src = orm.model.caching.Redis(**{"host":"source_host","port":6379})
dest = orm.model.caching.Redis(**{"host":"source_host","port":7777})
ks = src.handle.keys()
for i,k in enumerate(ks):
if i % 1000 == 0:
print i, "%2.1f %%" % ( (i * 100.0) / len(ks))
dest.handle.set(k,src.handle.get(k))
其中 orm.model.caching.* 是我的中间件缓存实现位(对于 redis 来说,它只是创建一个 self.handle 实例变量)。
首先,我非常怀疑接收字节中的数字,因为它是 2^32-1 .. 一个非常奇怪的巧合。其次,OOM 可能意味着内存不足,但我可以启动第二个进程并通过脚本同步该进程,但通过 redis --slaveof 执行此操作失败,似乎内存不足。这肯定不对吧?
redis-check-dump 不运行,因为这是 windows 实现。
很遗憾,我正在同步的密钥中有敏感数据,因此我无法将其提供给任何人进行调查。对此感到抱歉。
我肯定在运行 64 位版本,因为它在启动时在标题中说明了这一点。
我不介意通过我的迷你脚本同步然后只启用从模式,但我认为这是不可能的,因为在执行 slaveof 的那一刻,它会删除所有已知数据并从头开始重新同步(然后失败) .
有什么想法吗??
【问题讨论】: