记一次pika迁移到codis

@[TOC] 记一次pika数据迁移到codis

  1. 基础环境
    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服务器
    带宽: 内网带宽无限制,千兆
  2. 数据清理
    因为前一天晚上对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)
  3. 开始迁移
    迁移参数:
    ./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个实例是一起迁移,时间差不多。
    #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)
    最后附一个迁移到codis的实际运行图