记一次pika迁移到codis
@[TOC] 记一次pika数据迁移到codis
- 基础环境
pika版本: v3.0.4
key: 3800W左右(因为大部分都是zset,hash所以dbSize比较大,一共4个实例共20G)
迁移工具: pika_port
codis: 腾讯云4台8核64G服务器,每台机器起8个codis_server,6G内存互为主从,这样大概有16个master共96G内存
迁移机器: 腾讯标准8核16G服务器
带宽: 内网带宽无限制,千兆 - 数据清理
因为前一天晚上对pika进行扩容,pika前端代理使用的twemproxy,每台机器上有50%的冗余数据需要清理,所以在迁移之前需要清理一下,清理脚本如下。import redis def hash_fnv1a_64(s): UINT32_MAX = 2 ** 32 FNV_64_INIT = 0xcbf29ce484222325 % UINT32_MAX FNV_64_PRIME = 0x100000001b3 % UINT32_MAX hval = FNV_64_INIT for c in s: hval = hval ^ ord(c) hval = (hval * FNV_64_PRIME) % UINT32_MAX return hval def cleanKey(key, conn): conn.delete(key) def scanKey(conn): r = conn num = 0 n, l = r.scan(0, count=500) while True: for i in l: modula = hash_fnv1a_64(i) % count if modula != index: cleanKey(i,r) if n == 0: return n, l = r.scan(n, count=500) if __name__ == "__main__": host = sys.argv[1] port = int(sys.argv[2]) count = int(sys.argv[3]) index = int(sys.argv[4]) r = redis.Redis(host=host, port=port) scanKey(r)
- 开始迁移
迁移参数:
./pika_port -t 172.16.5.95 -i 172.16.1.89 -o 9231 -m 172.16.6.182 -n 19001 -x 6 -l ./sync_log/ -r ./rsync_dump -b 64
每个pika实例dump到本地大约8.4G,大概花了4分钟左右,
从本地传输,注意到string,list,sets花费时间较短大概4分钟左右,zsets,hashes传输花费时间较长(应该是hash,zset数据较多)
最后单实例迁移到codis大概20分钟,1100Wkey,12G容量,迁移过程中codis proxy qps可以达到150K,但是在zsets,hash迁移的时候降低到20K左右。
后面3个实例是一起迁移,时间差不多。
最后附一个迁移到codis的实际运行图#key检查脚本 import redis import sys def scanKey(conn): r = conn num = 0 n, l = r.scan(0, count=500) while True: for i in l: s = c.exists(i) if int(s) == 0: print i if n == 0: return n,l = r.scan(n,count=500) if __name__ == "__main__": c = redis.Redis(host='172.16.6.182',prot=19001)#codis client host = sys.argv[1] port = int(sys.argv[2]) r = redis.Redis(host=host,port=port) scanKey(r)