BDRP(baidu distributed redis platform)是基于twemproxy的redis集群解决方案,目前有1.0和2.0架构,已经在github上开源,本文依然是从网络上找的一些资料并加入自己的理解,方便自己复习。
1、1.0架构
twemproxy:对redis请求进行路由转发,通过pubsub功能同步sentinel中的后端redis信息,增加了用户白名单和流量控制的功能。
redis:redis采用的是2.6.16版本,将2.8版本中的增量复制功能merge进来,提高替换时候的可用性。
sentinel:监控redis故障,如果redis master故障,会自动进行故障替换,并给twemproxy同步替换结果。
2、2.0架构
由于社区的sentinel主要是用于故障替换,只存储当前redis master的信息,如果想对集群进行更精细的控制,比如读写分离、扩容,必须保存更详细的集群信息,因而增加了meta-server组件代替了sentinel,meta-server在redis的基础上开发,能够保存更详细的信息,并支持一些控制命令的处理。
twemproxy:增加了读写分离,因为meta-server通知的后端信息不但有redis-master,还有redis-slave以及部署的位置,因而可以基于位置做读写分离,将一些读请求路由到同机房的redis-slave上,但这样会牺牲数据一致性。
redis:为了方便扩容,merge了3.0版本的slot功能,BDRP的数据迁移是基于slot的,用子线程dump整个slot的数据,然后将数据发送给目标shard上面,改进了社区的基于key的迁移策略,减少了大量的控制命令,提高了迁移的效率,但是在迁移的时候,迁移的slot是只读的,不算是平滑的。数据balance的策略主要是基于shard的容量,统计所有shard的容量,找到最大值,最小值和平均值,如果最大值和最小值相差不大,则不进行balance,对所有shard做不完全排序,查找一个大于平均值并且没有迁移的shard,再查找一个小于平均值并且没迁移的shard,从两个shard中random一个slot进行迁移。
meta-server:基于redis开发,保存了cluster,proxy,shard的信息,支持主从切换,推送配置。
master:协调各个组件工作,对实例进行故障探测,自动化管理集群。
3、其它
另外BDRP还做了redis&mysql的融合工作。基于databus&broker,proxy基于mysql命令进行智能路由,后端通过databus&broker自动进行mysql到redis的同步,对用户无感,用户使用mysql协议访问后端存储服务。