redis集群之Codis( 四 )


  Codis 将槽位关系存储在 zk 中 , 并且提供了一个 Dashboard 可以用来观察和修改槽位关系 , 当槽位关系变化时 , Codis Proxy 会监听到变化并重新同步槽位关系 , 从而实现多个

Codis Proxy 之间共享相同的槽位关系配置 。
扩容
  刚开始 Codis 后端只有一个 Redis 实例 , 1024 个槽位全部指向同一个 Redis 。 然后一个 Redis 实例内存不够了 , 所以又加了一个 Redis 实例 。 这时候需要对槽位关系进行调整 ,

将一半的槽位划分到新的节点 。 这意味着需要对这一半的槽位对应的所有 key 进行迁移 , 迁移到新的 Redis 实例 。

那 Codis 如果找到槽位对应的所有 key 呢?
  Codis 对 Redis 进行了改造 , 增加了 SLOTSSCAN 指令 , 可以遍历指定 slot 下所有的key 。 Codis 通过 SLOTSSCAN 扫描出待迁移槽位的所有的 key , 然后挨个迁移每个 key 到新的 Redis 节点 。 在迁移过程中 , Codis 还是会接收到新的请求打在当前正在迁移的槽位上 , 因为当前槽位的数据同时存在于新旧两个槽位中 , Codis 如何判断该将请求转发到后面的哪个具体实例呢?Codis 无法判定迁移过程中的 key 究竟在哪个实例中 , 所以它采用了另一种完全不同的思路 。 当 Codis 接收到位于正在迁移槽位中的 key 后 , 会立即强制对当前的单个 key 进行迁移 , 迁移完成后 , 再将请求转发到新的 Redis 实例 。

推荐阅读