CODIS2.x原理 之 数据迁移流程

作者:邹祁峰
邮箱:[email protected]
博客:http://blog.csdn.net/qifengzou
日期:2016.08.03 10:42:40
转载请注明来自”祁峰”的CSDN博客

CODIS有一个非常重要的特点就是:支持热扩容。即:在不停止服务的情况下,实现集群设备的增减。其实现此功能的技术基础就是“数据迁移功能”。数据迁移的主要目的是将属于某codis-server组的slot的所有数据迁移到另外一个codis-server组中。


1 创建迁移任务

创建迁移任务有2中方式:一种是直接通过codis-config界面提交迁移任务;另一种是通过给codis-config发送post请求的方式提交迁移任务。但是这两种方式的处理流程是一致的。大体流程如下:
CODIS2.x原理 之 数据迁移流程_第1张图片

流程说明:
1.迁移指令中指明了将编号(from~to)所有slot都迁移到指定codis-server分组。
2.迁移任务的最小单位是slot。因此,本流程将会创建(to - from + 1)个slot迁移任务放入zk任务队列中。
3.注意:如果存在未完成的迁移任务时,则禁止提交新的迁移任务。

2 发起迁移指令

程序coddis-config dashboard会启一个task协程专门用来从zk中获取迁移任务,再将其转换为迁移指令发送给源codis-server程序。其大体流程如下:
CODIS2.x原理 之 数据迁移流程_第2张图片

3.执行迁移操作

源codis-server收到来自codis-config dashboard的slot迁移指令后,则会该slot下的所有key迁移到目的codis-server服务。其大体流程如下:
CODIS2.x原理 之 数据迁移流程_第3张图片

注意事项:
1.源codis-server收到slot迁移指令后,会与目的codis-server直接建立tcp连接。该tcp连接通道用于传输被迁移数据。
2.一旦某key迁移完成,则立即删除。

4 发起强制迁移

正在执行某slot迁移的过程中,同时codis-proxy可能会收到操作属于该slot下key的请求。如果直接去目的codis-server下操作,可能出现该key还未迁移完成,依然还在源codis-server; 如果直接去源codis-server下操作,可能出现该key已经迁移完成。为了防止此类情况的出现,只要该slot处于迁移状态,则不管三七二十一,程序codis-proxy都会给源codis-server发送”迁移该key”的迁移指令。其大体处理流程如下:
CODIS2.x原理 之 数据迁移流程_第4张图片

5 自动负载均衡

由于配置失误,或则后期增减容量导致各分组slot分配不均。一旦出现这种情况,有2种解决方案:1.使用人工提交迁移任务 2.使用自动负载均衡功能。第一种方案的处理已在上面的章节说明,在此无需赘述。第二种方案的大体处理流程如下:
CODIS2.x原理 之 数据迁移流程_第5张图片

注意事项:
1.使用自动负载均衡需要满足一个前提:所有codis-server的分组master必须配置maxmemory。
2.各组codis-server分配多少个slot是由其maxmemory决定。比如:A组maxmemory为10G, B组maxmory为1G,进行自动均衡处理后,A组分配的slot会是B组的10倍。
3.自动负载均衡并不会达到绝对意义上的均衡,其只做到maxmemory与分配的slot个数的比例均衡。无法达到操作次数的均衡。
4.自动负载均衡的处理过程中,如果发现存在maxmemory与分配的slot个数比例不均衡时,则会进行发起slot迁移的操作。达到均衡目的的前提下,此过程中会做到尽量减少slot的迁移。

你可能感兴趣的:(源码剖析,设计思路,CODIS)