redis-port icon indicating copy to clipboard operation
redis-port copied to clipboard

redis-port 迁移数据报错

Open zyi1992 opened this issue 8 years ago • 3 comments

2017/11/01 17:27:40 main.go:189: [INFO] set ncpu = 4, parallel = 16 2017/11/01 17:27:40 sync.go:56: [INFO] sync from '10.10.10.52:6679' to '10.10.10.55:8899' 2017/11/01 17:27:40 utils.go:139: [PANIC] invalid psync response, fullsync [error]: bad resp CRLF end 6 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/pkg/redis/decoder.go:166 github.com/CodisLabs/redis-port/pkg/redis.(*decoder).decodeSingleLineBulkBytesArray 5 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/pkg/redis/decoder.go:85 github.com/CodisLabs/redis-port/pkg/redis.(*decoder).decodeResp 4 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/pkg/redis/decoder.go:28 github.com/CodisLabs/redis-port/pkg/redis.Decode 3 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/utils.go:137 main.sendPSyncFullsync 2 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/sync.go:115 main.(*cmdSync).SendPSyncCmd 1 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/sync.go:67 main.(*cmdSync).Main 0 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/main.go:199 main.main ... ... [stack]: 3 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/utils.go:139 main.sendPSyncFullsync 2 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/sync.go:115 main.(*cmdSync).SendPSyncCmd 1 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/sync.go:67 main.(*cmdSync).Main 0 /home/zhouyi/go/src/github.com/CodisLabs/redis-port/cmd/main.go:199 main.main

迁移使用的命令是 ./redis-port sync --psync --ncpu=4 -p 16 --from=10.10.10.52:6679 --filterdb=1 --target=10.10.10.55:8899 --sockfile=test.tmp --filesize=32gb redis客户端是3.2版本的

zyi1992 avatar Nov 01 '17 10:11 zyi1992

这个是协议解析错误,不应该的。

spinlock avatar Dec 19 '17 12:12 spinlock

当时迁移的时候一直报这个错误 后来又试了几次,偶尔能成功一次,也就迁移完了,但是并不知道出错是是什么原因,我的场景下单个redis实例的内存在50gb左右,有多个zadd 添加的有序集合,单个集合的规模在千万级别,不知道是不是这些因素导致的。

zyi1992 avatar Dec 19 '17 13:12 zyi1992

理论上不是,我怀疑是对 redis 在生成 rdb 过程中的协议理解上或者实现上存在问题。

在生成 RDB 过程中,server 会不停地回复 '\n',直到返回数据长度,再之后就是正常的 Bulkbytes Array 的指令了。但是你的报错上看到 decodeSingleLineBulkBytesArray ,就是说我开始按照 String 开始解析 Redis 指令,而不是 Bulkbytes Array,说明我在第三步收到的指令格式完全不对。我回去翻翻 Redis 代码再看一下,我怀疑这里面理解上有错误。或者 Bug。但是我很难复现,因为我没环境。

spinlock avatar Jan 09 '18 04:01 spinlock