twemproxy源码解析-前言:特性简介

下面是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 文件。


Twemproxy是一个由twitter开源的memcache与redis的代理,全部由C语言实现。作为一个代理,它的主要特性包括:

1:可以减少到后端cache服务器的连接。

2:在多个cache服务之间自动共享数据。

3:能够使用不同的策略和散列函数支持一致性hash。

4:通过配置设置是否禁用失败的节点。

5:运行多个实例,客户端可以连接到第一个可用的代理服务。

6:支持请求的流式与批处理,降低来回的消耗。

上一篇:最强的疯狂java学习路线图,javaEE学习者必看


下一篇:Nginx多进程高并发、低时延、高可靠机制在缓存(redis、memcache)twemproxy代理中的应用