Codis的架构设计

news/2024/7/9 22:27:40 标签: codis, 架构设计

https://blog.csdn.net/shmiluwei/article/details/51958359

最近学习了Codis的源码实现,把一些收获整理一下放在这里。

 

为什么会有Codis?

RedisCluster架构

Codis是怎么做的

Codis架构

 

首先,为什么会有Codis?

Codis是用来管理Redis集群的,那么Codis就是因为Redis而存在的,但是这并不是终极答案,对吧?为什么会有Redis呢?因为这个人。Redis的作者。

 这是一个大帅哥,一点也不像一个程序员屌丝。 他是Redis之父,意大利人,名字读不出来。大家有兴趣可以去搜一下。 Redis的设计也很简单,大家可以花时间来研究一下。

Redis的集群

可能有人会有疑问,Redis应该有自己的集群啊,就像MySql集群一样,既然是一个正式的中间件产品,那么官方也应出品类似的集群。 那么RedisCluster就是这样的东西。

下图是Redis集群的架构的图,RedisCluster是官方的产品,可以看到这个架构是一个平面的。这里的分布式的逻辑和Redis的存储模块是在一起的。 好处是部署简单。 集群的一致性和容错 都由这些节点自己保证。每个Redis集群的节点,负责了很多的功能。

优点是: 

真正的无中心节点,客户端与redis节点直连,不需要中间proxy层.

客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

对于客户端来说请求的性能不会损失太多

缺点是:

分布式逻辑和存储模块耦合

对协议进行了较大的修改,对客户端不太友好

他和Codis也有点像,在集群内部,把所有的Key映射到了16384个Slot中,在客户端访问时,有各个节点,把请求转发。

Codis的架构

这幅图是Codis官方的架构图,个人觉得比较难看,但是也反应了Codis的架构,Codis可以对Redis分组,一个RedisGroup里有一个Master,和多个Slave,Redisclient可以直接访问Proxy。还有一个CodisHA的客户端。但是这幅图有些内容还没有体现出来, 于是我就画了一幅更丑的。

 

Codis的内部,有三个主要的模块, Router,Model,Redis。 Router负责将前端的请求转发给Redis, Model负责和ZK交互,保持数据一致性,这里的数据主要是Group配置,Proxy配置,Slot的配置。Redis模块负责和Redis交互,将前端的命令转发给Redis,并将结果返回。刚才说了Model在负责把Proxy的配置变化发送给ZK, ZK再变化同步到Codisclient。

 

好了,现在切换到这幅图。刚才的那副是Codis的一个骨架, 这里是细化到肉了,这幅图稍微好看点。首先说Router,这里负责和Client通信,建立session,通过Mapper来过滤所有的请求。Slots中封装了Redis的连接。 下面这块Redis封装了Decode和EncodeRedis协议的过程,这里值得提一下,Redis是有自己的标准协议的,在Redis之间的交互,Codis使用的就是标准协议,这块的代码大家有兴趣可以看一下。

Model模块是和ZK交互的对象,负责发送指令给客户端,并解析返回结果。后面也会给大家主要介绍这块内容。

 

Codis除了支持Zk以外还支持ETCD,ETCD也是个牛逼的中间件。ETCD是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写。

 

 

Zookeeper保存的一些配置信息

Proxy

Server

Slot

Slot 是一个逻辑概念,一共 1024 个,使用 crc32(key) % 1024 计算 Slot id,而且一个(或多个) Slot 属于一个 ServerGroup,1024 个 Slot 一起分用多个 ServerGroup 资源;

Action

 

 

 

 

从Codis中可以学习到什么?

 Zookeeper的交互设计  ----- GO

 Redis的交互设计   ------ GO

 Jodis的交互设计  ------ Java

 Go语言本身的设计  —— GO

 

 

参考资料

 ZooKeeper开发手册

 http://my.oschina.net/sundiontheway/blog/346498

 作者访谈

 http://www.open-open.com/lib/view/open1436360508098.html

 codis 源码理解

 http://www.nosa.me/2016/02/21/codis-%E6%BA%90%E7%A0%81%E7%90%86%E8%A7%A3/

 Codis性能结果

 https://github.com/CodisLabs/codis/blob/master/doc/benchmark.md


http://www.niftyadmin.cn/n/1281219.html

相关文章

python代码风格建议

python 以其结构严格著称,同时也以其命名规范散漫出名,算乱无规矩的命名尤其给开发人员带来理解上的误区。 尤其像python、ruby动态语言,由于在运行期随时可能出现方法或者属性的增减,规则的命名尤其重要。ruby语言本身定义的语法…

速读原著-TCP/IP(交互式输入)

第19章 TCP的交互数据流 19.2 交互式输入 首先来观察在一个 R l o g i n连接上键入一个交互命令时所产生的数据流。许多 T C P / I P的初学者很吃惊地发现通常每一个交互按键都会产生一个数据分组,也就是说,每次从客户传到服务器的是一个字节的按键&am…

codis 源码理解

http://www.nosa.me/2016/02/21/codis-%E6%BA%90%E7%A0%81%E7%90%86%E8%A7%A3/http://www.nosa.me/2016/02/21/codis-%E6%BA%90%E7%A0%81%E7%90%86%E8%A7%A3/ 这里介绍一下 codis 几个主要的点,对理解源码有帮助。 1. 先看 ServerGroup 和 Slot。 一个 Proxy 可以…

RHCE (1)

首先将redhat6.2的网卡配置参数各项含义罗列一下哈: [rootlocalhost /]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE"eth0" #设备名称叫eth0 HWADDR"00:0C:29:FF:33:5E" #设备MAC地址 NM_CONTROLLED"yes" …

速读原著-TCP/IP(TCP经受时延的确认)

第19章 TCP的交互数据流 19.3 经受时延的确认 在图1 9 - 2中有一些与本节将要论及的时间有关的细微之处。图 1 9 - 3表示了图1 9 - 2中数据交换的时间系列(在该时间系列中,去掉了所有的窗口通告,并增加了一个记号来表明正在传输何种数据&am…

学车总结

昨天刚拿到小黑本(C1)。 小黑本 我是在北京学的车。历时2个月,学费5800 请假工资 打车费,大概7000大洋,总算拿到了这个小黑本。 说说我最近学车的感悟吧 学车由报名、理论学习、约考、考试、约车、练车等部分组成。…

速读原著-TCP/IP(Nagle算法)

第19章 TCP的交互数据流 19.4 Nagle算法 在前一节我们看到 , 在一个R l o g i n连接上客户一般每次发送一个字节到服务器,这就产生了一些4 1字节长的分组:2 0字节的I P首部、2 0字节的T C P首部和1个字节的数据。在局域网上,这些小分组&…

关于float/double的取值范围、精度和表示

https://blog.csdn.net/shenziheng1/article/details/79471340 1.float和double的范围和精度 float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下: float:1bit(符号位&…