文档章节

Codis多语言客户端Java、C++、Python版本开源了

百分点集团
 百分点集团
发布于 2016/08/02 13:54
字数 1596
阅读 122
收藏 0

  开源伴随着互联网的兴起影响着越来越多的人,它让程序员可以站在巨人的肩膀上,帮助企业更快速地进行研发。百分点作为大数据领域的践行者和引领者,也正在从开源受益者成为开源贡献者。

  开发背景Codis 作为分布式 Redis 解决方案,在百分点已经有4.8T的Codis内存空间用来存储推荐引擎、CookieMapping和用户画像的数据。在实际应用中,Codis集群为 线上业务提供了稳定、低延迟以及高吞吐的Key-Value存储服务,并支持在线业务长期稳定运行。

  百分点在很多业务场景都在使用Codis。作为内存KV服务从早期的memcached到Redis-Sentinel,再到现在的Codis云,很多产品和应用都需要使用不同的语言对KV服务完成调用,如Python、C++、 Java等。但遗憾的是,目前Codis官方只提供了Java的客户端,对多语言应用造成不便,所以百分点研发团队开发了C++和Python两种语言的客户端来满足大部分业务代码的需求。同时,也对Java的客户端做了修改,来防止多个业务使用同一个Codis集群带来的key冲突问题。

  我们已经将代码分享在开源社区,帮助更多的人、更方便地使用Codis。

  C++

  Python

  为什么选择Codis?

  选型影响着技术发展的方向,在选用Codis之前,我们曾对下面的组件做过对比和评测:

  Twemproxy:是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。这个方案顺理成章地解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。

  优点:这些年来,Twemproxy是应用范围最广、稳定性最高、最久经考验的分布式中间件。

  缺点:Twemproxy最大的痛点在于其使用了ketama一致性hash算法,无法平滑地扩容/缩容,甚至连修改配置都需要重启服务;Twemproxy另一个痛点是,运维不友好,甚至没有控制面板,对Redis集群的扩容/缩容都很难操作,或者说,Twemproxy更像服务器端静态sharding。有时为了应对业务量突增导致的扩容需求,甚至被迫新开一个基于Twemproxy的Redis集群。

  Redis-Cluster:Redis-Cluster在Redis3.0中推出,是与Codis同期发布的产品,支持Redis分布式集群部署模式,采用无中心分布式架构,所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议,优化传输速度和带宽,节点的fail是通过集群中超过半数的节点检测失效时才生效。客户端与Redis节点直连,不需要中间proxy层,也不需要连接集群所有节点,只需连接集群中任何一个可用节点即可,减少了代理层,大大提高了性能。Redis-Cluster把所有的物理节点映射到[0-16383]slot上,Cluster 负责维护node<->slot<->key之间的关系。目前Jedis已经支持Redis-Cluster。

  优点:部署简单,all-in-the-box,没有像Codis那么多概念、组件和依赖。

  缺点:因其是无中心化设计,导致程序难以编写;Cluster的数据存储模块和分布式的逻辑模块是耦合在一起的,整个集群高度耦合,很难对Redis集群进行无痛的升级;不支持multi-key的操作,也不支持pipeline;其对协议进行了较大的修改,对客户端不太友好,目前很多客户端中的程序已经写好,让业务方去更换Redis Client是不太现实的。虽然Redis-Cluster从方案选型上面比较占据优势,但稳定性方面还有待验证。

  Codis:是用Go语言编写的具有高性能的Redis集群解决方案,在很多公司已被广泛的使用,支持绝大多数的Redis命令,完全兼容Twemproxy。

  优点:Codis无疑是为解决Twemproxy缺点而出的解决方案,因此综合方面会优于Twemproxy很多。Codis引入了Group的概念,每个Group包括1个Redis Master及多个Redis Slave,这样做的好处是如果Master有问题,则运维人员可通过Dashboard“自助式”切换到Slave,而不需要小心翼翼地修改配置文件;还可以轻松的升级、扩容和缩容;Dashboard页面还可以支持监控和集群管理。

  项目描述

  Codis-Client是为Codis写的Java、C++和Python的客户端,其中Java的客户端是基于Jodis开发的。

  (1)Codis-Client用循环和连接池的策略去实现Codis-Proxy的负载均衡,并能够根据zookeeper的watcher自动的发现Codis-Proxy的增加、删除、online和offline状态。

  (2)Codis-Client会在每一个key前面加一个productid以区分不同的业务。

  流程

  Codis在zookeeper中注册自己的集群信息,程序启动后,Codis-Client会去zookeeper拿到Codis集群的proxy信息,并添加watcher持续观察proxy的状态信息。拿到的proxy信息被存放在集合当中,程序会循环的拿某一个地址并获取所对应的队列,如果队列中有连接则直接用,如果没有连接且没有超过最大连接数,则会创建新的连接,反之就会进入等待状态。请求结束之后,会把连接放回队列。

  总结

  Codis在百分点生产环境用了接近一年的时间,期间我们对Codis-Client做了足够多的测试和优化,足以保证服务的正常运行。我们在部署和维护Codis上也做了一些努力和优化,比如自动化部署功能和低延迟、高吞吐调优。

  开源代码:https://github.com/baifendian/CodisClient

© 著作权归作者所有

百分点集团
粉丝 0
博文 1
码字总数 1596
作品 0
朝阳
私信 提问
Apache Qpid 0.8 发布

Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议。提供了 Java、C++ 两种服务端版本以及 Java、C++、.NET、Python和Ruby语言的客户端。 ...

红薯
2010/12/07
1K
1
Apache Qpid 0.10 发布

Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议。提供了 Java、C++ 两种服务端版本以及 Java、C++、.NET、Python和Ruby语言的客户端。 ...

红薯
2011/05/04
1K
0
C、C++、Java、JavaScript、PHP、Python分别用来开发什么?

C、C++、Java、JavaScript、PHP、Python分别用来开发什么? 2018-05-25 11:47编辑: 游星啊分类:程序人生来源:代码湾 开发程序人生C 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发...

游星啊
2018/05/25
0
0
Linux开放实验室

简介 为方便广大Linux软件开发爱好者,轩辕高端IT培训中心于2009年10月设立了Linux开放实验室,轩辕Linux开放实验室提供了完整的 Linux软件开发环境,包括:Redhat Enterprise Linux 5.4、C...

athxy
2010/04/20
2.1K
19
Apache Qpid Python 1.36.0 发布,消息队列服务

Apache Qpid Python 1.36.0 发布了,Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议。提供了 Java、C++ 两种服务端版本以及 Java、C++...

局长
2017/03/18
412
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部