Twemproxy 缓存代理服务器

Twemproxy 缓存代理服务器

Twemproxy 概述

Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数。Twemproxy是由Twitter开源出来的缓存服务器集群管理工具,主要用来弥补Redis/Memcached 对集群(cluster)管理的不足。

antirez(Redis作者)写过一篇对twemproxy的介绍,他认为twemproxy是目前Redis 分片管理的最好方案,虽然antirez的Redis cluster正在实现并且对其给予厚望,但从现有的cluster实现上还是认为cluster除了增加Redis复杂度,对于集群的管理没有twemproxy来的轻量和有效。

谈到集群管理不得不又说到数据的分片管理(shard),为了满足数据的日益增长和扩展性,数据存储系统一般都需要进行一定的分片,如传统的MySQL进行横向分表和纵向分表,然后应用程序访问正确的位置就需要找的正确的表。这时候,这个数据定向工作一般有三个位置可以放:

  • 数据存储系统本身支持,Redis Cluster就是典型的试图在数据存储系统上支持分片;
  • 客户端支持,Memcached的客户端对分片的支持就是客户端层面的;
  • 代理支持,twemproxy就是试图在服务器端和客户端中间建代理支持;

在三种方案中:

1、客户端方案我认为欠妥,因为这样每个客户端需要维护一定的服务器信息,但是如果动态的增加或减少节点就需要重写配置各个客户端。

2、而在服务器端增加集群管理有利于使用者,减少使用者需要了解的东西,整合集群管理使得性能比其他方案都要更高,但是缺点是其会严重增加代码复杂度,导致服务器端代码爆炸。

3、而采用中间层代理的方式我认为是最优雅和有效的,在不改动服务器端程序的情况下,twemproxy使得集群管理更简单,去除不支持的操作和合并,同时更可以支持多个后端服务,大大减少连接数等等,但是缺点也是显而易见的,它不能更有效的利用集群的优势,如多键运算和范围查找操作等等,这都是需要服务器端程序本身支持。

Twemproxy 安装

从源码安装:

git clone [email protected]:twitter/twemproxy.git
cd twemproxy
autoreconf -fvi
./configure --enable-debug=full
make
src/nutcracker -h

twemproxy命令行选项:

Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]
[-c conf file] [-s stats port] [-a stats addr]
[-i stats interval] [-p pid file] [-m mbuf size]

-h, –help : 查看帮助文档,显示命令选项
-V, –version : 查看nutcracker版本
-t, –test-conf : 测试配置脚本的正确性
-d, –daemonize : 以守护进程运行
-D, –describe-stats : 打印状态描述
-v, –verbosity=N : 设置日志级别 (default: 5, min: 0, max: 11)
-o, –output=S : 设置日志输出路径,默认为标准错误输出 (default: stderr)
-c, –conf-file=S : 指定配置文件路径 (default: conf/nutcracker.yml)
-s, –stats-port=N : 设置状态监控端口,默认22222 (default: 22222)
-a, –stats-addr=S : 设置状态监控IP,默认0.0.0.0 (default: 0.0.0.0)
-i, –stats-interval=N : 设置状态聚合间隔 (default: 30000 msec)
-p, –pid-file=S : 指定进程pid文件路径,默认关闭 (default: off)
-m, –mbuf-size=N : 设置mbuf块大小,默认64K,含义见下面的零拷贝;

零拷贝(Zero Copy)
在twemproxy中,请求和响应都是分配到一块叫mbuf的内存中的,接收请求的mbuf同时会用于转发到backend,类似地,从backend接收响应的mbuf同时也会用于转发到client,这样做就避免了内存拷贝。
此外,mbuf使用内存池,一旦分配就不再释放,当一个请求结束时,它所使用的mbuf会放回内存池。一个mbuf占16K,这个大小需要在I/O性能和连接并发数之间做取舍,mbuf尺寸越大,对socket的读写系统调用次数越少,但整个系统可支持的并发数也越小。如果希望支持更高的client并发请求数,可以把mbuf的尺寸设置小一点(通过-m选项)。

Twemproxy 配置

Twemproxy 通过YAML文件配置,例如:

alpha:
  listen: 127.0.0.1:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 127.0.0.1:6379:1

beta:
  listen: 127.0.0.1:22122
  hash: fnv1a_64
  hash_tag: "{}"
  distribution: ketama
  auto_eject_hosts: false
  timeout: 400
  redis: true
  servers:
   - 127.0.0.1:6380:1 server1
   - 127.0.0.1:6381:1 server2
   - 127.0.0.1:6382:1 server3
   - 127.0.0.1:6383:1 server4

gamma:
  listen: 127.0.0.1:22123
  hash: fnv1a_64
  distribution: ketama
  timeout: 400
  backlog: 1024
  preconnect: true
  auto_eject_hosts: true
  server_retry_timeout: 2000
  server_failure_limit: 3
  servers:
   - 127.0.0.1:11212:1
   - 127.0.0.1:11213:1

delta:
  listen: 127.0.0.1:22124
  hash: fnv1a_64
  distribution: ketama
  timeout: 100
  auto_eject_hosts: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 127.0.0.1:11214:1
   - 127.0.0.1:11215:1
   - 127.0.0.1:11216:1
   - 127.0.0.1:11217:1
   - 127.0.0.1:11218:1
   - 127.0.0.1:11219:1
   - 127.0.0.1:11220:1
   - 127.0.0.1:11221:1
   - 127.0.0.1:11222:1
   - 127.0.0.1:11223:1

omega:
  listen: /tmp/gamma
  hash: hsieh
  distribution: ketama
  auto_eject_hosts: false
  servers:
   - 127.0.0.1:11214:100000
   - 127.0.0.1:11215:1

说明:

listen
twemproxy监听地址,支持UNIX域套接字。

hash
可以选择的key值的hash算法:

  • one_at_a_time
  • md5
  • crc16
  • crc32 (crc32 implementation compatible with libmemcached)
  • crc32a (correct crc32 implementation as per the spec)
  • fnv1_64
  • fnv1a_64,默认选项
  • fnv1_32
  • fnv1a_32
  • hsieh
  • murmur
  • jenkins

hash_tag
hash_tag允许根据key的一个部分来计算key的hash值。hash_tag由两个字符组成,一个是hash_tag的开始,另外一个是hash_tag的结束,在hash_tag的开始和结束之间,是将用于计算key的hash值的部分,计算的结果会用于选择服务器。

例如:如果hash_tag被定义为”{}”,那么key值为"user:{user1}:ids"和"user:{user1}:tweets"的hash值都是基于”user1”,最终会被映射到相同的服务器。而"user:user1:ids"将会使用整个key来计算hash,可能会被映射到不同的服务器。

distribution
存在ketama、modula和random3种可选的配置。其含义如下:

  • ketama,一致性hash算法,会根据服务器构造出一个hash ring,并为ring上的节点分配hash范围。ketama的优势在于单个节点添加、删除之后,会最大程度上保持整个群集中缓存的key值可以被重用。
  • modula,根据key值的hash值取模,根据取模的结果选择对应的服务器;
  • random,无论key值的hash是什么,都随机的选择一个服务器作为key值操作的目标;

timeout

单位是毫秒,是连接到server的超时值。默认是永久等待。

backlog
监听TCP 的backlog(连接等待队列)的长度,默认是512。

preconnect
是一个boolean值,指示twemproxy是否应该预连接pool中的server。默认是false。

redis
是一个boolean值,用来识别到服务器的通讯协议是redis还是memcached。默认是false。

server_connections
每个server可以被打开的连接数。默认,每个服务器开一个连接。

auto_eject_hosts
是一个boolean值,用于控制twemproxy是否应该根据server的连接状态重建群集。这个连接状态是由server_failure_limit阀值来控制。
默认是false。

server_retry_timeout
单位是毫秒,控制服务器连接的时间间隔,在auto_eject_host被设置为true的时候产生作用。默认是30000 毫秒。

server_failure_limit
控制连接服务器的次数,在auto_eject_host被设置为true的时候产生作用。默认是2。

servers
一个pool中的服务器的地址、端口和权重的列表,包括一个可选的服务器的名字,如果提供服务器的名字,将会使用它决定server的次序,从而提供对应的一致性hash的hash ring。否则,将使用server被定义的次序。

Twemproxy 监控

Twemproxy 监控端口默认为22222,并每隔30s收集一次信息。

nutcracker --describe-stats

报告的信息如下:

pool stats:
  client_eof          "# eof on client connections"
  client_err          "# errors on client connections"
  client_connections  "# active client connections"
  server_ejects       "# times backend server was ejected"
  forward_error       "# times we encountered a forwarding error"
  fragments           "# fragments created from a multi-vector request"

server stats:
  server_eof          "# eof on server connections"
  server_err          "# errors on server connections"
  server_timedout     "# timeouts on server connections"
  server_connections  "# active server connections"
  requests            "# requests"
  request_bytes       "total request bytes"
  responses           "# responses"
  response_bytes      "total response bytes"
  in_queue            "# requests in incoming queue"
  in_queue_bytes      "current request bytes in incoming queue"
  out_queue           "# requests in outgoing queue"
  out_queue_bytes     "current request bytes in outgoing queue"

Pipelining

Twemproxy 可以同时接收很多client端的请求,并仅通过一个或几个连接回源,这种结构很适合使用流水线处理请求和响应,从而节省TCP往返时间。
例如,Twemproxy 正在同时代理3个client端的请求,分别是:‘get key\r\n‘、‘set key 0 0 3\r\nval\r\n‘和‘delete key\r\n‘ ‘,Twemproxy 可以将这3个请求打包成一个消息发送给后端的redis: ‘get key\r\nset key 0 0 3\r\nval\r\ndelete key\r\n‘。

pipelining也是Twemproxy高性能的原因之一。

时间: 2024-10-10 01:22:25

Twemproxy 缓存代理服务器的相关文章

Twemproxy 分布式集群缓存代理服务器

Twemproxy 分布式集群缓存代理服务器 是一个使用C语言编写.以代理的方式实现的.轻量级的Redis代理服务器, 它通过引入一个代理层,将应用程序后端的多台Redis实例进行统一管理, 使 应用程序只需要在Twemproxy上进行操作,而不用关心后面具体有 多少个真实的Redis或Memcached实例,从而实现了基于Redis和 Memcached的集群服务.当某个节点宕掉时,Twemproxy可以自 动将它从集群中剔除,而当它恢复服务时,Twemproxy也会自动连接. 由 于是代理,

magent——memcached缓存代理服务器

memcached分布式缓存 我们使用PHP连接多台memcached服务器,做分布式缓存,实现如下: $memcache = new Memcache; $memcache->addServer('192.168.252.134', 11211); $memcache->addServer('192.168.252.134', 11212); $memcache->addServer('192.168.252.134', 11213); for ($i = 0; $i < 100

基于Centos 7 部署Varnish缓存代理服务器

博文结构Varnish的概述与工作原理等等安装Varnish缓存代理服务器 一.Varnish概述 1.Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合.与传统的squid相比,Varnish具有高性能.速度快.管理更加方便等优点,目前很多大型的网站都开始尝试使用Varnish来代替squid,这便是Varnish迅速发展的最根本的原因. Varnish的主要特征: (1)缓存代理位置:可以使用内存也可以使

linux之搭建varnish缓存代理服务器

一.varnish原理: 1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点.有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一. 根据官网的介绍,Varnish的主要特性如下:http

Squid代理--经典缓存代理服务器(实现正向代理配置、ACL各种访问控制、日志分析)

Squid是Linux系统中常用的一款开源代理服务软件官方网站http://www.squid-cache.org , 可以很好的实现http.ftp.dns查询,以及ssl等应用的缓存代理. 一.Squid服务概述 缓存代理概述 1.代理的工作机制 当客户机通过代理来请求web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要访问的页面,则直接将缓存中的页面反馈给请求的客户端.如果缓存中没有,则由代理服务器向web服务器发起访问请求,当获得返回的web页面后,缓存服务器首先

Web架构:varnish缓存代理服务器超详细剖析

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 目录 varnishi简介 varnish配置组成 --------------------------------------  vcl内置预设变量 --------------------------------------  功能语句与对象 --------------------------------------  varnish中内置

用Squid3搭建缓存代理服务器

最近在实验室研究CDN和缓存的一些内容,看了很多Squid缓存服务器的资料,于是想在自己电脑上搭建和配置一个Squid缓存代理,看看它的工作流程,下面是自己做的一些步骤. 实验环境: 环境很简单,都是在自己的电脑上跑的客户机win7系统,缓存代理为win6内的ubuntu 12.04虚拟机,win7内chrome浏览器通过缓存代理访问外网资源. 环境配置: 1.安装squid3 sudo apt-get install squid3 2.修改配置文件 squid3的配置文件和squid2的位置不

自建缓存代理服务器

工具及软件 vps 一台有公网ip能上google的虚拟机 Squid Squid is a fully-featured HTTP/1.0 proxy which is almost a fully-featured HTTP/1.1 proxy.官方网址:http://www.squid-cache.org/ StunnelStunnel is a proxy designed to add TLS encryption functionality to existing clients a

深入缓存核心技术:大型网站多级缓存的分层架构

在互联网高速发展的今天,缓存技术被广泛地应用.无论业内还是业外,只要是提到性能问题,大家都会脱口而出"用缓存解决". 这种说法带有片面性,甚至是一知半解,但是作为专业的我们,需要对缓存有更深.更广的了解. 缓存技术存在于应用场景的方方面面.从浏览器请求,到反向代理服务器,从进程内缓存到分布式缓存.其中缓存策略,算法也是层出不穷,今天就带大家走进缓存. 正文 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 假设一个网站,需要提高