redis 迁移 codis

最近需要将一个 非常大的 redis 迁移到 codis遇到了一些问题

首先说一下 redis 导数据的一些基本方法

  1. 停写 bgsave, 然后 拷贝 dump文件
    
    远古时期做法,需要停机

  2. 直接将 新的redis 作为老的redis的 slave 让她自己同步。

    现在主流,快, 但是对大内存的redis 不友好。

    流程就是先 子进程bgsave, 然后传递全量数据, 父进程缓冲增量数据(缓冲区大小需要配置), 子进程全量数据传完后, 传送增量数据。

    全量数据传递过程中需要buffer 会占用内存空间。

    版本 < 2.8.18 bgsave 由于要写文件,会让 磁盘io负载变高, 数据量大时会 会阻塞 write/fsync 系统调用,会让master 不可用。

    版本 >= 2.8.18 可以不落地, 减小对 master 磁盘io 压力。

  3. BGREWRITEAOF 然后自己自己解析aof 发送

    其实原理同上,一样先bgsave, 在子进程将全量数据以 aof 格式写磁盘, 然后父进程存增量数据到缓冲区,(哪不是一个链表, 无限制), 全量写入到 磁盘后,追加增量数据。

首先用codis官方的迁移工具 redis-port

他的原理是,2

不过实际测试发现, 如果数据量很大,则会造成 redis 缓冲区不足, 强制关闭 (p)sync 连接。 有修改的方法, 但是如果写入的量依然很大, 仍旧存在风险。

别的同步工具 也差不多这个原理。

需要注意的是, 不管用啥方法, 都应该在 slave 上面 执行。 避免影响 master。

由于我们的redis 非常大 30+G, 并且 写的量也很大,机器的内存不是瓶颈, 再加上 需要对数据做一些个性化修改, 所以 最终使用3, 然后用自己解析aof 发到 codis

reference

http://mdba.cn/2015/03/17/redis%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%EF%BC%882%EF%BC%89-replication-buffer%E4%B8%8Ereplication-backlog/

https://redis.io/topics/replication#diskless-replication

avatar

lelouchcr's blog