twemproxy架构分析

我没货,只剩下水了 我没货,只剩下水了     2022-08-20     550

关键词:

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。

 

另外,对于博文有问题的请大家在评论中留言与博主讨论,博主会及时回复的!!!!

[转]twemproxy介绍与使用

Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是... 查看详情

laravel项目利用twemproxy部署redis集群的完整步骤

Twemproxy是一个代理服务器,可以通过它减少Memcached或Redis服务器所打开的连接数。下面这篇文章主要给大家介绍了关于laravel项目利用twemproxy部署redis集群的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下前... 查看详情

python监视twemproxy(代码片段)

查看详情

linux-centos7源码编译安装twemproxy服务(代码片段)

1.软件简单介绍Twemproxy2.编译安装Twemproxy编译安装过程中,参考现在搜索引擎能检索到文章都比较旧了,参考部分教程总是遇到各种缺少文件导致编译出现异常问题,下面教程参考GitHub官网说明,亲测可以编译安装Twemproxy成功。2.... 查看详情

twemproxy

eshop-detail-test:  listen:127.0.0.1:1111  hash:fnv1a_64  distribution:ketama  timeout:1000  redis:true  servers:    -127.0.0.1:6379:1test-redis-01    -127.0.0.1:6380:1test-redis-02eshop-detail-test:r 查看详情

redis集群方案之twemproxy+haproxy+keepalived+sentinel+主从复制(待实践)

首先说明一下,Twemproxy+HAProxy+Keepalived+Sentinel+主从复制-这里提到的技术不一定全部都用上,但是全部用上之后可以达到高可用。主从复制:实现数据一式多份的保障。Sentinel哨兵模式:实现主从节点的切换,比如主节点挂了之后... 查看详情

结合keepalivedh和haproxy组件实现twemproxy的高

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、http://www.ukmtey.com/个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。相反,如果在源节点找不... 查看详情

架构分析-《卓越架构师修炼之道》

...写作,不少于3000字,使用markdown格式。目录如下。第二章架构分析第2.1节架构分析方法2.1.1分析方法定义2.1.2架构分析维度2.1.3功能分析2.1.4性能分析2.1.5时间分析第2.2节架构设计要素2.2.1架构模块2.2.2架构规范2.2.3架构控制2.2.4架构... 查看详情

基于twemproxy和vip实现redis集群的无感知弹性扩容

目标是实现redis集群的无感知弹性扩容 关键点1.是无感知,即对redis集群的用户来说服务ip和port保持不变2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量。 1.业务场景1.redis集群某个业务容量不足,需要扩容2.... 查看详情

VTune Amplifier XE 2015 架构分析

】VTuneAmplifierXE2015架构分析【英文标题】:VTuneAmplifierXE2015architecuralanaylsis【发布时间】:2015-02-0207:37:32【问题描述】:我最近下载了VTuneAmplifierXE2015来分析应用程序。为了进行分析,我想从建筑和微建筑事件的角度进行分析。我... 查看详情

分享java从初级程序员到架构师视频,文档,架构设计,大型网站架构分析,大数据分析资料

JAVA从初级程序员到架构师视频,文档,架构设计,大型网站架构分析,大数据分析资料,搭建高并发、高可用电商架构设计资料需要的联系我。很多目录都没列出来(QQ空间相册里有很多目录的截图)加QQ:1927360914650)this.width=650;"... 查看详情

androiddisplay架构分析(代码片段)

AndroidDisplay架构分析–侧重高通平台转:https://www.pianshen.com/article/7993475272/display渲染https://www.pianshen.com/article/96762157553/Androiddisplay架构分析(一)http://hi.baidu.com/leowenj/blog/ 查看详情

谷歌分析架构

】谷歌分析架构【英文标题】:GoogleAnalyticsSchema【发布时间】:2016-02-2620:37:22【问题描述】:为了从GA架构中获取BigQuery中的用户数,我需要查询什么字段?我在BigQuery提供的架构参考链接中找不到它:https://support.google.com/analytics... 查看详情

电商平台lnmp架构之mysql高速缓存--redis(代码片段)

电商平台lnmp架构之mysql高速缓存--redis1.redis的介绍2.redis服务的安装3.Redis常用命令4.Redis异步复制5.Redis高可用6.twemproxy分片代理7.rediscluster集群8.redis的持久化9.redis与mysql的结合1.redis的介绍Redis是一个nosql(notonlysql不仅仅只有sql)数据... 查看详情

架构设计-架构需求分析

一、架构设计的需求分析从哪来需求分析的前期工作是愿景描述及愿景分析,即愿景分析就是需求的前期调研.从软件过程来看,需求分析是一个承上启下的阶段–“上承”愿景,“下接”设计。需求分析的工作内... 查看详情

android图形架构之七——choreographer源码分析(代码片段)

前言Android图形架构之一——概述Android图形架构之二——SurfaceFlinger启动和连接Android图形架构之三——创建Layer、Surface、SurfaceControlAndroid图形架构之四——图形缓冲区的申请和消费流程及核心类Android图形架构之五——深入分析add... 查看详情

数据库分析架构

】数据库分析架构【英文标题】:Architecturefordatabaseanalytics【发布时间】:2011-02-1011:19:18【问题描述】:我们有一个架构,我们为每个客户的网站(互联网商家)提供类似商业智能的服务。现在,我需要在内部分析这些数据(用... 查看详情

二openstack入门之架构分析

OpenStack入门之架构分析写在前面学习目标:了解OpenStack各组件的逻辑关系;了解OpenStack的各组件的通信和部署关系;了解OpenStack的工作流程;接下来我会掌握:OpenStack组件间的逻辑关系;OpenStack的API;OpenStack组件间的通信关系;... 查看详情