twemproxy架构分析——剖析twemproxy代码前编

 

twemproxy背景

在业务量剧增的今天,单台高速缓存服务器已经无法满足业务的需求, 而相较于大容量SSD数据存储方案,缓存具备速度和成本优势,但也存在数据安全性的挑战。为此搭建一个高速缓存服务器集群来进行分布式存储是十分必要的。

目前主流的高速缓存服务器是redis和memchache。而twemproxy是支持memcached和redis协议的轻量级代理中间件,能用于高速缓存服务器集群的搭建。为此,twemproxy是高速缓存服务器集群的核心组件之一,也是业界较为成熟的高速缓存服务器集群解决方案之一。

twemproxy概述 

twemproxy是搭建分布式缓存集群的重要组件之一。他能将来自客户端的redis包通过key分片发送到不同的redis服务器,而不是发到单个redis服务器上。因此,可以使本来集中到一个redis上的信息被分流到多个redis上,这就使得 twemproxy能支持redis集群。

不难想到,因为twemproxy的分片功能,可以轻松地对redis集群进行水平扩展(简单地理解成在一个业务中加入更多的redis服务器),同时对于代码稍加改造,我们就可以得到能读写分离的redis集群,这大大将提高了redis集群的性能。这使得各大公司如豌豆荚、阿里、百度等都对于这份代码进行了修改,能使其满足分布式缓存集群的要求。当然,twemproxy并不负责数据一致性的工作。

源码下载地址:https://github.com/twitter/twemproxy/

twemproxy架构 

为了能更好地了解twemproxy的代码结构,我们就需要了解twemproxy的架构,明白与它交互的组件。下面就是一般twemproxy的架构图

图1 twemproxy架构图

图1中,client是客户端,这里的客户端可以是很多应用,如网页,也可以是一些需要redis支持的服务器。LVS是Linux虚拟服务器,它主要用于负载均衡以及数据冗余,当然这一个层的负载均衡以及数据冗余也可以通过其他手段完成,如HAproxy等,当然也可以不需要这一层,可以让客户端直连twemproxy。memchache和redis是twemproxy目前支持的两种高速缓存服务器,但是考虑到高可用性和具体功能,一般会选用redis服务器。

我们可以看到在这种架构下,由于所有的通信都是用redis或者memchache协议完成。为此,client根本不知道和它通信的是高速缓存服务器还是twemproxy,高速缓存服务器memchache或redis也不知道和它联系的的是client还是twemproxy。

这样业务量一旦提升,我们只需要添加适量的高速缓存服务器和twemproxy服务器就可以满足业务需求。在这期间,几乎不需要对原先的client端的代码或者原先的高速缓存服务器的配置做任何修改,就可以完成业务上的水平扩容,这样就大大提高了高速缓存服务器的可用性。同时,由于不用修改client端的代码,我们可以进行平滑升级,即用户根本感知不到我们对业务进行了扩容,线上的client端不会因为我们的扩容而停止服务。同样地,我们可以对业务进行缩容处理。因此在业务量急剧变化的时候,这种架构的灵活性和可用性是原先单一的高速缓存服务器集群不能比拟的。

从这幅架构图上,我们也能开始逐一说明twemproxy的特性,阅读源码文件夹下的《README.md》的features,至于他是如何实现的,就需要我们去解读代码,这不是这一章要完成的任务。

                                  图2 twemproxy特性

1.Fast,即快速,据测试,直连twenproxy和直连redis相比几乎没有性能损失,这已经很逆天了,最重要的是他还没有进行读写分离就能达到这样的效果,确实fast

2.Lightweight,即轻量级,就我个人而言,它代码量就是轻量级的,解压后仅仅1.8MB!!!!因为透明连接池,内存零拷贝以及epoll模型的使用,使得它足够快速和轻量级。

3.Enables pipelining of requests and responses,Keeps connection count on the backend caching servers low,即保持前端的连接数,减少后端的连接数,这里主要得益于透明连接池的使用,前端主要指的是client和lvs,后端指的是redis和memchache,这个好处特别明显,既可以减少了redis的连接负载,又保持了保持了前端的功能。

4.Enables pipelining of requests and responses,即将请求和回复管道化,这里我的理解是他将请求包和回复包一一对应起来后,使得它的请求和回复更明确。

5.Supports multiple server pools simultaneously,Shard data automatically across multiple servers,即它可以支持多个高速缓存服务器,以及能对高速缓存服务器的数据进行共享,这是通过我在前面讲到过twemproxy的分片功能来实现的。

6.Implements the complete memcached ascii and redis protocol,它支持memchache和redis这两个协议,当然现在只支持其中大部分的协议而不是全部,这个会在后面开章节专门说明。

7.Supports multiple hashing modes including consistent hashing and distribution.就是它支持很多哈希算法来哈希key,如crc32,crc16,MD5等等。

8.Easy configuration of server pools through a YAML file.它的配置文件是通过YAML文件来配置的,YAML文件好处是简单易懂,容易学习配置。

9.Can be configured to disable nodes on failures. 它会自动指出连接失败的节点并报警,就是一旦某个高速缓存服务器发生故障,它能感知到并报警。

10.Observability via stats exposed on the stats monitoring port.这是他的监控功能,一般比较少用,但是它提示的信息却有统计的价值,如统计发送了多少读写命令。

通过上述的功能分析,我们可以理出一个我们值得关注的实现上的功能列表:

1.内存管理,这是导致特性1和4的关键之一,他通过一些方法,如内存用完后不立即释放将其放入内存队列里以备它用,内存零拷贝等手段使内存使用效率大幅提高。对应源码中的nc_mbuf 文件。

2.透明连接池,这是导致特性1,3的关键之一,当然连接池内的连接同样的是使用完后不立即释放将其放入连接队列里以备它用。对应源码中的nc_connection 文件。

3.分片,这是导致特性5,6的关键,也是twenproxy的核心功能。当然后面的7,8也导致了分片能得以进行。对应源码中的proto文件夹、hashkit文件夹。

4.配置文件,这影响了特性8,同时这份代码在配置上的代码风格非常简约,对应源码中的nc_conf 文件。

5.监控,不是特别了解但是它完成了9,10特性,对应源码中的nc_proxy 、nc_stats 文件。

这些将是我们未来阅读剖析代码的一些重要关注点。

twemproxyLinux下安装

通过上述的描述,大家是否心动了,想要玩一下twemproxy,那么请大家与我一起安装twemproxy,当然安装twemproxy对于我们阅读twemproxy源码也会有所帮助。

1.首先安装autoconf2.69,这个请参考我的博文http://www.cnblogs.com/onlyac/p/5408420.html

2.进入源码目录

cd twemproxy

3.使用autoconf进行编译准备

autoreconf -fvi

./configure CFLAGS="-g -gstabs -O3 -fno-strict-aliasing" --enable-debug=full

4.编译以及安装

make && make install

这样编译以及安装完的程序nutcracker已在src目录下生成了。

未来我们也可以采用通过gdb来进行边走流程边看代码的一种阅读代码方式。

总结

在这篇文章中,我们首先概述了twemproxy,接着通过架构图展示,我们分析了该架构的优点,提取了会成为我们阅读源码的一些重要关注点和twemproxy的工作环境,最后阐述了如何安装twemproxy。

 
分类: redis

twemproxy的更多相关文章

  1. 剖析twemproxy前言

    又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...

  2. Twemproxy 缓存代理服务器

    Twemproxy 缓存代理服务器 Twemproxy 概述 Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数.T ...

  3. twemproxy explore,redis和memcache代理服务器

    twemproxy,也叫nutcraker.是一个twtter开源的一个redis和memcache代理服务器. redis作为一个高效的缓存服务器,非常具有应用价值.但是当使用比较多的时候,就希望可 ...

  4. Redis集群~StackExchange.redis连接Twemproxy代理服务器

    回到目录 本文是Redis集群系列的一篇文章,主要介绍使用StackExchange.Redis进行Twemproxy(文中简称TW)代理服务的连接过程,事务上,对于TW来说,我们需要理解一下它的物理 ...

  5. Redis集群~StackExchange.Redis(10月6号版1.1.608.0)连接Twemproxy支持Auth指令了

    回到目录 对于StackExchange.Redis这个驱动来说,之前的版本在使用Proxy为Twemproxy代理时,它是不支持Password属性的,即不支持原始的Auth指令,而我也修改过源代码 ...

  6. twemproxy - Proxy Server for Redis 安装测试

    1. 安装 (1) 系统环境 测试用的服务器为阿里云ECS,4核8G,CentOS6.3 64bit. 部署了3个Redis实例,监听端口号为7410,7420,7430,设置maxmemory为25 ...

  7. 基于Twemproxy的Redis集群搭建以及想法

    基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...

  8. 基于Twemproxy的Redis集群方案

    概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...

  9. Redis/SSDB+Twemproxy的配置与使用(Mac/Linux平台)

    对于redis而已,相信不少的后台开发人员一直都在使用,相比memcache而已,redis不仅可以作为key-value缓存使用,而且提供了丰富的数据结构如set.list.map等,能够实现很多复 ...

  10. Twemproxy 介绍与使用

    Twemproxy是一种代理分片机制,由Twitter开源.Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回.该方案很好的解决了单个Re ...

随机推荐

  1. linux查找keyword在php出现的次数

    查找CleverCode在当前文件夹以及子文件夹,全部的php出现大于0的次数. # find -type f -name '*.php' | xargs grep CleverCode ./*.ph ...

  2. Linux环境编程之共享内存区(一):共享内存区简单介绍

    共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...

  3. tensorflow 下的滑动平均模型 —— tf.train.ExponentialMovingAverage

    在采用随机梯度下降算法训练神经网络时,使用 tf.train.ExponentialMovingAverage 滑动平均操作的意义在于提高模型在测试数据上的健壮性(robustness). tenso ...

  4. position:absolute和margin:auto 连用实现元素水平垂直居中

    有时候,要实现一些元素水平垂直都居中,这部分元素呢 可能大小未知,例如一些图片或者是一些未知大小的块元素. 利用绝对定位可以将要居中的元素脱离文档流. position: absolute; left ...

  5. css 单行图片文字水平垂直居中汇总

    (1) 水平居中 a. 行内元素水平居中 因为img是行内元素(行内块级元素也一样)父级元素设置text-align:center即可,例如: <div style="width: 6 ...

  6. Java中使用org.json和json-lib解析JSON

    文章目录  [隐藏] 一.JavaProject中org.json解析JSON 1.JSON的org.son-api下载 1)JSON网址 2)JSON的java解析org.json-api网址 3) ...

  7. IQueryFielter接口

    IQueryFilter基于属性查询过滤数据.需要定义一个where子句.可以指定要返回值的字段列表.如果没有指定列,将返回所有值.当需要根据属性值和属性的关系过滤数据时,使用该接口. 成员 AddF ...

  8. Win或Linux中编译安装软件的命令解析: configure; make; make install

    原文地址:http://www.cnblogs.com/Jerry-Chou/archive/2010/12/18/1909843.html 翻译一篇文章,我最早从这篇文章中了解到为什么Linux平台 ...

  9. C++ 中的 const 类型变量

    之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变.一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了.今天刚好 ...

  10. ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

    ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:ht ...