Pika Codis Solution
基本概念
1, 支持 slot的添加删除
pkcluster addslots 0-3,8-11
pkcluster addslots 0-3,8,9,10,11
pkcluster addslots 0,2,4,6,8,10,12,14
2, 支持 slot级别的同步命令
pkcluster slotslaveof no one 0-3,8-11
pkcluster slotslaveof no one all
pkcluster slotslaveof ip port 0-3,8,9,10,11
pkcluster slotslaveof ip port 0,2,4,6 force
pkcluster slotslaveof ip port all
3, 提供集群查询命令
pkcluster info slot db0:123
pkcluster info slot 123
pkcluster info slot
如果不指定table名字,默认db0
该命令会根据slave slot的状态做全量同步和增量同步
4,codis的每一个slot 对应pika 内部的一个slot
5,关于之后分布式 default_table 概念
目前pika提供一个default_table,目前不支持table的添加删除(分布式支持),default_table 名字叫 db0,所有的slots写入都默认写入此table
6,slave slot 不提供写入服务
pika 兼容codis 方案
1, 初始化拓扑
现有pika实例 pika1, pika3, pika2, pika4
pika1 和pika2 属于group1,pika2 是pika1 的全量备份,也就是pika2上面的slots全是pika1的slave, 监控发现pika1异常时可以让pika2执行 pkcluster slotslaveof no one all,然后切到pika2 上
同理 pika3 和pika4 属于 group2。
打算分配0-511slots 给 group1, 分配512-1023 slots 给 group2
以group1为例,group2同理
1.1,在pika1,pika2上执行pkcluster addslots 0-511
1.2,pika2 上执行pkcluster slotslave pika1_ip pika1_port 0-511
1.3,在codis分配相对应的slots给group1
2, 迁移
如果有新实例加入, 假设pika5 pika6 作为group3 加入集群。 打算迁移slot1 到pika5。
pika5 需要预先按照1.1中所述建立slot 1
未做分配前,原始拓扑 如下图
2.1 在pika5上通过pkcluster slotslaveof pika1_ip pika1_port 1 把slot1 同步到pika5上
2.2 在pika6上通过pkcluster slotslaveof pika5_ip pika5_port 1 把slot1 同步到pika6上 (保证slot1 有副本)保证2.1,2.2 的顺序,先建立pika5 和pika1 的同步关系,再建立pika6 和pika5的同步关系。因为pika5有可能会全同步,先建立pika5和pika6的关系会造成同步异常。
2.3 在pika1 上用pkcluster info slot 1 观察pika5的lag很小的时候,修改codis meta信息,准备将slot1指向 group3(pika5)。
2.4 观察pika1 上lag为0,pika5 做pkcluster slotslaveof no one 1。2.3 迁移过程中codis会cache来自客户端的请求,此时客户端请求不会流向pika1,之后观察pika1上对pika5的同步lag为0,在pika5上之后执行pkcluster slotsslaveof no one 1,pika1会向codis告知slot1迁移完成,slot1的meta信息才会指向group3,codis会把这段时间缓存的数据重新发送到slot1新的归属group上也就是group3。
2.5 用pkcluster slotslaveof no one 1, pkcluster removeslots 1清理pika1 pika2 上的slot1 数据