基于Redis的开源分布式服务Codis

Redis在豌豆荚的使用历程——单实例==》多实例,业务代码中做sharding==》单个Twemproxy==》多个Twemproxy==》Codis,豌豆荚自己开发的分布式Redis服务。在大规模的Redis使用过程中,他们发现Redis受限于多个方面:单机内存有限、带宽压力、单点问题、不能动态扩容以及磁盘损坏时的数据抢救。

基于Redis的开源分布式服务Codis

Redis通常有3个使用途径:客户端静态分片,一致性哈希;通过Proxy分片,即Twemproxy;还有就是官方的Redis Cluster,但至今无一个新版本。随后刘奇更详细的分析了为什么不使用Twemproxy和Redis Cluster:

Twemproxy:最大的痛点是无法平滑的扩容或者缩容,甚至修改配置都需要重启服务;其次,不可运维,甚至没有Dashboard。

Redis Cluster(官方):无中心化设计,程序难以编写;代码有点吓人,clusterProcessPacket函数有426行,人脑难以处理所有的状态切换;迟迟没有正式版本,等了4年之久;目前还缺乏最佳实践,没有人编写Redis Cluster的若干条注意事项;整个系统高度耦合,升级困难。

虽然我们有众多的选择,比如Tair、Couchbase等,但是如果你需要更复杂和优秀的数据结构,Redis可称为不二之选。基于这个原因,在Redis之上,豌豆荚设计了Codis,并将之开源。

Codis

既然重新设计,那么Codis首先必须满足自动扩容和缩容的需求,其次则是必须避免单点故障和单点带宽不足,做一个高可用的系统。在这之后,基于原有的遗留系统,还必须可以轻松地将数据从Twemproxy迁移到Codis,并实现良好的运维和监控。基于这些,Codis的设计跃然纸面:

基于Redis的开源分布式服务Codis

然而,一个新系统的开发并不是件容易的事情,特别是一个复杂的分布式系统。刘奇表示,虽然当时团队只有3个人,但是他们几乎考量了可以考量的各种细节:

  • 尽量拆分,简化每个模块,同时易于升级
  • 每个组件只负责自己的事情
  • Redis只作为存储引擎
  • Proxy的状态
  • Redis故障判定是否放到外部,因为分布式系统存活的判定异常复杂
  • 提供API让外部调用,当Redis Master丢失时,提升Slave为Master
  • 图形化监控一切:slot状态、Proxy状态、group状态、lock、action等等

而在考量了一切事情后,另一个争论摆在了眼前——Proxy或者是Smart Client:Proxy拥有更好的监控和控制,同时其后端信息亦不易暴露,易于升级;而Smart Client拥有更好的性能,及更低的延时,但是升级起来却比较麻烦。对比种种优劣,他们最终选择了Proxy,无独有偶,在codis开源后,twitter的一个分享提到他们也是基于proxy的设计。

基于Redis的开源分布式服务Codis

Codis主要包含Codis Proxy(codis-proxy)、Codis Manager(codis-config)、Codis Redis(codis-server)和ZooKeeper四大组件,每个部分都可动态扩容。

codis-proxy 。客户端连接的Redis代理服务,本身实现了Redis协议,表现很像原生的Redis (就像 Twemproxy)。一个业务可以部署多个 codis-proxy,其本身是无状态的。

codis-config。Codis 的管理工具,支持添加/删除Redis节点、添加/删除Proxy节点、发起数据迁移等操作。codis-config自带了一个http server,会启动一个dashboard,用户可以在浏览器上观察 Codis 集群的运行状态。

codis-server。Codis 项目维护的一个Redis分支,加入了slot的支持和原子的数据迁移指令。

ZooKeeper。Codis依赖ZooKeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令会通过 ZooKeeper同步到各个存活的codis-proxy。

基于Redis的开源分布式服务Codis

最后,刘奇还介绍详细的了Codis中Migration、lock (rwlock)等操作的实现过程和原理,以及从Twemproxy迁移到Codis的详细操作。更多Codis详情可移步Clodis开源页 GitHub


原文链接:http://www.cnblogs.com/shanyou/p/4268896.html

原创文章,作者:追马,如若转载,请注明出处:http://www.178linux.com/509

赞 (0)
追马追马
上一篇 2015-02-22 17:32
下一篇 2015-02-25 10:38

相关推荐

  • N22-第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;    (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; 创建一个10G的分区:  &nbs…

    Linux干货 2016-12-18
  • Linux文件查找命令详解

    Linux中在文件系统上查找符合条件的文件,实现工具有locate和find locate: 1.它是依赖于事先索引构建好的数据库进行查找的。更新它的数据库有两种方式,一种是系统定期自动更新,另一种是执行命令updatedb手动更新数据库。 注意:索引构建过程需要遍历整个根文件系统,极消耗资源 2.它的工作特性: 1.因为是基于数据库实现的,所以查找速度快(…

    Linux干货 2017-04-10
  • 进程管理

    一、进程概述 1、进程的概念        用户通过执行命令,将程序提起到内存中运行,运行中的程序即称为进程。内核为了方便管理,根据内核发起者的权限、属性等参数,为每个进程设置一个独立的PID号,通过PID号来判断进程的权限。 2、进程的分类:    &nbs…

    Linux干货 2016-09-07
  • 文件查找命令find详解

    文件的查找命令 find 用法 功能:实时查找工具,通过遍历指定路径完成文件查找 工作特点: •  查找速度略慢•  精确查找•  实时查找•  可能只搜索用户具备读取和执行权限的目录 语法:   find [OPTION]… [查找路径] [查找条件] [处理动作] 查找路径:指定具体目标路径;默认为当前目录查找条件…

    Linux干货 2016-11-07
  • 文件管理类的命令总结

    Linux系统内针对目录的管理命令有很多,现在我们进行逐一介绍: 1.  mkdir – make directories,创建目录 语法:mkdir [OPTION]… DIRECTORY…常用选项: 选项 | 含义—— | ——-p, –parents | 递…

    2017-09-07
  • 数据分析≠Hadoop+NoSQL,不妨先看完善现有技术的10条捷径

    让业务搭乘大数据技术确实是件非常有吸引力的事情,而Apache Hadoop让这个诱惑来的更加的猛烈。Hadoop是个大规模可扩展数据存储平台,构成了大多数大数据项目基础。Hadoop是强大的,然而却需要公司投入大量的学习精力及其它的资源。 如果得到正确的应用,Hadoop确实能从根本上提升你公司的业务,然而这条Hadoop的应用之路却充满了荆棘。另一个方面…

    Linux干货 2015-02-25