基于Twemproxy的群集部署方案

概述

本文描述的twemproxy基于nutcracker-0.2.4版本。

twemproxy是memcached 和redis的协议层面的代理,其提供的features如下:

注:

twemproxy不会增加redis的性能指标数据,据业界测算,使用twemproxy相比直接使用redis会带来~10%的性能下降。

 

但是单个redis进程的内存管理能力有限。据测算,单个redis进程内存超过20G之后,效率会急剧下降。目前,我们给出的建议值是单个redis最好配置在8G以内。8G以上的redis缓存需求,通过twemproxy来提供支持。

本文将描述twemproxy+redis的下载、安装、部署和配置过程。其中,其distribution是本文的重点之一。

部署

编译twemproxy

基本过程如下:

http://code.google.com/p/twemproxy/downloads/list下载对应版本的代码

然后解压缩、配置、编译、安装

twemproxy的命令行参数

twemproxy的配置详解

twemproxy的配置信息填写在nutcracker.yml之中,默认的查找位置是在conf目录下,也可以通过-c参数指定。

nutcracker.yml的例子:

一个twemproxy可以被配置成多个角色。

详细的配置信息如下:

l  listen

twemproxy监听的端口。可以以ip:port或name:port的形式来书写。

l  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

如果没选择,默认是fnv1a_64。

l  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,可能会被映射到不同的服务器。

l  distribution

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

 

ketama

ketama一致性hash算法,会根据服务器构造出一个hash ring,并为ring上的节点分配hash范围。ketama的优势在于单个节点添加、删除之后,会最大程度上保持整个群集中缓存的key值可以被重用。

modula

modula非常简单,就是根据key值的hash值取模,根据取模的结果选择对应的服务器。

random

random是无论key值的hash是什么,都随机的选择一个服务器作为key值操作的目标。

l  timeout

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

l  backlog

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

l  preconnect

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

l  redis

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

l  server_connections

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

l  auto_eject_hosts

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

默认是false。

l  server_retry_timeout

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

l  server_failure_limit

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

l  servers

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

高容量的twemproxy群集部署方案

目标:面向大容量redis实例的需求配置方案。

根据以往的测试结论,基于redis server的性能考虑,单个redis的实例的内存总量需控制在8G以内(最大不能超过20G),而实际上应用对redis的内存的需求可能会远远大于8G,因此需要一个保持redis server性能不下降,但可以有效扩充redis server的容量的方案。twemproxy是一个恰当的选择。

根据实际需要的redis的内存量,来规划twemproxy群集中redis的实例数量,然后,通过twemproxy提供该群集的统一的访问入口,这样即有效的扩充了redis server的内存总量,又避免了单个redis server内存过大导致的问题。

扩充twemproxy群集的并发能力

存在既需要redisserver的内存容量,也需要redisserver的并发能力的情况。理论上twemproxy群集能提供的并发规模的总量是所有redis服务器并发量的总和(会因为使用twemproxy存在略微的下降),而扩展并发量的方式是增加twemproxy群集的访问入口:

客户端使用Jedis配置好这几个访问入口,就可以同时使用多个twemproxy入口来访问twemproxy群集。

一致性hash的选择

在twemproxy的配置的章节有对distribution的描述,这部分就是twemproxy的群集的一致性hash算法的配置,有3个选择:

ketama,modula和random

先说random,是随机的选择一个redis server作为最终操作的目标,这个适合只读的场景,需要配合数据加载。

ketama是一种基于key-range的一致性hash算法,它的优势是一个redisserver down掉之后,整个群集做re-hash,会有一部分key-range与以前的key-range重合。这种特性也是只适合做比较单纯cache。

modula的方式是根据key的hash取模,来选择目标的redisserver。这种方式,显而易见,如果一个redis server down掉之后,如果整个群集做re-hash,所有的key值的目标都会错乱。

而是否做整个群集的re-hash,这由twemproxy的Liveness配置来决定。

Liveness配置的开启由auto_eject_hosts来检测,轮询的周期由server_retry_timeout来决定,而server_failure_limit则决定如果几次轮询失败,会将该redis server从群集中摘除。

twemproxy的Liveness需要根据情况谨慎配置。

配置tips

使用server name

书写twemproxy的servers pool,我们可以这么写:

也可以这么写:

提供一个名字的好处是可以将对servers pool中server定义的次序的依赖性转换为对server名字的依赖性。

使用Hash Tags

hash tag的具体解释可以看我们对twemproxy的配置方面的描述,简单的说,hash tag可以根据key的一部分作为选择redis server的键值,从而来干预内容存在何处。

hash tag很简单,就2个字符,前面是引导字符,后面是结束字符,在这两个字符中间的被作为最终用于作为群集一致性hash的key值。

例如:

hash tag是”{}”,而传递过来的rediskey值是"user:{user1}:ids"和"user:{user1}:tweets",这两个key值在选择redisserver时使用的一致性hash的key值都是”user1”,这两个key值都会被存在相同的redis server上。

注:

如果在key中没找到对应的hash_tags模式,会使用整个key作为一致性hash的key值。

关于key值长度的限制

memcache限制key值在250字符以内,redis则没什么限制,由于twemproxy将key值存放在连续的内存之中,所以twemproxy的key值的最大长度受到mbuf长度的限制。

mbuf的长度由-m指定,默认是16384字节,一般够用了。如果遇到key值过长的问题,可以调整这个参数。

mbuf的含义&调整

最小512字节,最大65536字节,默认16384字节。可以通过命令行的-m参数调整。

mbuf是twemproxy引以为傲的zero-copy技术的底层支撑,zero-copy意味着从客户端接收的数据直接被提交到redis-server,不需要经过中间的copy环节(看似不难,实际上操作起来很难做到)。

很明显,大尺寸的mbuf会增加性能,减少分包的次数,但是会增加对内存的消耗。

如何估计twemproxy的mbuf对内存的需求呢?公式如下:

max(client_connections, server_connections) * 2 *mbuf-size

因为存在client-> twemproxy以及twemproxy->redis-server两个连接,所以mbuf是需要双份的。

大多客户端的连接会大于服务器连接池预设的连接数。我们假设1000个客户端连接,mbuf-size是16KB,那么大概会消耗掉1000*2*16KB=32M左右的内存。

使用Timeout配置参数

在twemproxy中可以指定timeout配置参数:

默认的情况下,twemproxy到redis server的连接没有超时,默认是永久等待。这也许不是最终期望的行为。twemproxy运行指定一个timeout的毫秒数,在指定的时间内如果没得到响应会返回客户端:

SERVER_ERROR Connection timed out\r\n

配置redis-server的连接数

默认的情况下,twemproxy会为每个redis-server准备一个连接,在这个连接中,传递所有来着客户端的命令。这样做的好处是当存在多个对相同key的操作的时候,我们可以将这些操作串行化。

twemproxy可以使用server_connections配置每个redis-server的最大连接数,还可以使用preconnect来配置是否预连接redis-server,不过需要小心多连接出现的竞争条件。

例如:客户端连续发出set foo xxx和get foo两个命令,如果存在多connection,两个命令可能会被分配到多个connection上执行,那么那个会被先执行呢?这是个不确定的问题。

这个参数也需要谨慎的使用,对于单个redis-server来说,增加server connection并不能简单的提高并发的性能,因为redis-server本身是单一进程的模型。如果后面是一个具有并发能力的redis-server(比如,aliredis),这个配置的优势就能发挥出来了。

时间: 2024-10-25 16:02:51

基于Twemproxy的群集部署方案的相关文章

Codis 3.0 Release (密码验证) 群集部署文档

前言: Codis 3.x 由以下组件组成: Codis Server:基于 redis-2.8.21 分支开发.增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令.具体的修改可以参考文档 redis 的修改. Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议. 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy). 对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例:

基于docker、kubernetes部署openstack到atomic系统上

声明: 本人阅读笔记,翻译类文章仅作意译.如有不对之处,请指出. 需要更本源的理解,请自行阅读英文. 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:寻觅神迹 内容系本人学习.研究和总结,如有雷同,实属荣幸! 基于docker.kubernetes部署openstack到atomic系统上 openstack的服务定义,是不是看起来很简洁? openstack的实际组件构成,是不是看起来很复杂? 所有的openstack

Haproxy+keepalived高可用、负载均衡安装部署方案

1     环境说明 前端两台haproxy+keepalived互为主从,提供高可用:另外基于不同域名访问不同的虚拟ip实现负载均衡 1.1     环境描述 服务器A(主.从):eth0:10.241.51.245   eth1:192.168.1.9 服务器B(从.主):eth2:10.241.51.246   eth1:192.168.1.10 服务器C(web01):eth0:10.241.51.247 服务器D(web02):eth0:10.241.51.248 VIP1:10.24

开源jms服务ActiveMQ的负载均衡+高可用部署方案探索

一个文件(或目录)拥有若干个属性,包括(r/w/x)等基本属性,以及是否为目录(d)与文件(-)或连接文件(l)等属性.此外,Linux还可以设置其他系统安全属性,使用chattr来设置,以lsattr来查看,最重要的是可以设置其不可修改的特性,即便是文件的拥有者都不能进行修改.这个属性相当重要,尤其是在安全机制方面(security). 文件默认权限:umask 当建立一个新的文件或目录时,它的默认属性是与umask有关的.通常,umask就是指定当前用户在建立文件或目录时的属性默认值.那么,

CloudStack+XenServer详细部署方案创建高级网络资源域

CloudStack+XenServer详细部署方案(5):创建高级网络资源域 本文将根据设计文档结合和之前创建的XenServer 资源池, 介绍CloudStack高级网络资源域的创建过程. Step1. 选择高级网络模式, 单击下一步.   Step2. 配置域信息. 域名称: shenzone DNS: 10.1.1.11 Hypervisor 类型: XenServer 网络域: shenzone.com 来宾网络CIDR: 192.168.100.0/24 公共: 是   注: 此处

CloudStack+XenServer详细部署方案 CloudStack管理节点的安装和配置

CloudStack+XenServer详细部署方案 CloudStack管理节点的安装和配置 本文将根据设计文档, 安装和配置CloudStack管理节点. 本文只对配置流程和结果进行举例说明, 具体 细节和配置操作请参考 CloudStack安装文档. 实际部署架构: 管理机柜规划: Step1. 安装和配置MySQL数据库. 根据设计部署2台MySQL数据库服务器, 安装过程和配置过程请参考CloudStack管理文档. 辅DB 对主DB 采用Replication方式进行备份. Step

Jenkins spring boot 自动部署方案

原文地址:http://www.cnblogs.com/skyblog/p/5632869.html 现在主流的自动部署方案大都是基于Docker的了,但传统的自动部署方案比较适合中小型公司,下面的方案就是比较传统的自动部署方案. 1.为什么需要自动部署 基于微服务的架构,自动部署显得非常重要.因为每一个服务都需要部署.如果是手动部署,那么有M个服务,那么至少需要部署M次,如果每个同样的服务部署N个实例,那么就需要部署M*N次.所以自动部署对于微服务架构几乎是必须的,这一点不同于传统应用. 2.

我不是九爷 带你了解 CloudStack+XenServer详细部署方案(3):CloudStack管理节点的安装和配置

CloudStack+XenServer详细部署方案(3):CloudStack管理节点的安装和配置 本文将根据设计文档, 安装和配置CloudStack管理节点. 本文只对配置流程和结果进行举例说明, 具体 细节和配置操作请参考 CloudStack安装文档. 实际部署架构: 管理机柜规划: Step1. 安装和配置MySQL数据库. 根据设计部署2台MySQL数据库服务器, 安装过程和配置过程请参考CloudStack管理文档. 辅DB 对主DB 采用Replication方式进行备份. S

电子邮件系统双机热备部署方案

双机热备部署 双机热备针对的是服务器的临时故障所做的一种备份技术,通过双机热备,来避免长时间的服务中断,保证系统长期.可靠的服务.企业为了避免服务器故障产生数据丢失等现象,旧的技术是利用RAID技术和数据备份技术,但是数据备份只能解决系统出现问题后的恢复.无论是硬件还是软件问题,都可能会造成邮件服务的中断,而RAID及数据备份技术恰恰就不能解决避免服务中断的问题. 发生宕机事故后到恢复服务器运行,再轻微的问题或者强悍的技术支持,服务器也会中断一段时间,可能会造成邮件的丢失,对于一些需要不间断在线