Twemproxy又名nutcraker,是由Twtter 开源,是一种代理分片机制的中间件(类似于mycat),主要用于管理 Redis Memcached 集群,可接受来自多个客户端的请求,按照路由规则,转发给后端cache节点,减少了客户端与cache 服务器直接连接的数量。
一、twemproxy特性
1、优点
- 快速。
- 轻量级。
- 保持与服务器的长连接。
- 减少了直接与缓存服务器连接的连接数量
- 启用管道pipelining请求和响应。
- 支持代理到多个服务器。
- 同时支持多个服务器池。
- 跨多个服务器自动共享数据。
- 实现完整的memcached ascii和redis协议。
- 通过yaml文件轻松配置服务器池。
- 支持多种哈希模式,包括一致的哈希和分布。
- 可以配置为在故障时禁用节点。
- 可通过端口监控状态。
- 可运行在Linux、*BSD、OS X和SmartOS(Solaris)
2、缺点
- 不支持针对多个值的操作,比如取sets的子交并补等
- 不支持Redis的事务操作
- 错误消息、日志信息匮乏,排查问题困难
- 无友好管理界面,运维操作困难
- 无法平滑扩展,添加去除新节点必须重启服务
二、twemproxy安装
autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,因此要安装autoconf。
1、检查autoconf
检查是否安装autoconf:rpm -qa |grep -i autoconf,看到:autoconf-2.63-5.1.el6.noarch
若已安装版本低于2.64,卸载 rpm -e --nodeps autoconf-*
若没有安装,则去http://ftp.gnu.org/gnu/autoconf/下载目前最新版本autoconf-2.69.tar.gz安装
解压 tar -zxvf autoconf-2.69.tar.gz后进入根目录cd autoconf-2.69
配置:./configure
编译:make
安装:make install
确保每一步操作没有错误出现
2、twemproxy安装
去https://github.com/twitter/twemproxy下载源码包,wget https://codeload.github.com/twitter/twemproxy/zip/master
解压:unzip master,
进入解压目录:cd twemproxy-master
生成源码包 :autoreconf -fvi
配置 :./configure --prefix=/usr/local/twemproxy
编译 :make
安装 :make install
三、配置nutcracker
1、参数释义
- listen: 监听服务器池的地址和端口或者是sock文件的绝对路劲 (如 /var/run/nutcracker.sock)
- client_connections: 允许从Redis客户端的获取的最大连接数。默认不限制,同样适用于操作系统强制的限制
- 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: 一个两个字符的字符串,指定用于散列的key部分。例如"{}" 或 "$$"。哈希标记允许将不同的密钥映射到同一个服务器,只要标记中的密钥部分相同
- distribution: key的分发模式. 可能取值如下:
- ketama
- modula
- random
- timeout: 等待与服务器建立连接或从服务器接收响应的超时值(毫秒)。默认一直等待
- backlog: tcp backlog参数。默认为512.
- preconnect: 用于控制twemproxy在进程启动时是否应预连接到此池中的所有服务器。默认为false
- redis: 制服务器池是否使用redis或memcached协议。默认为false。
- redis_auth: 连接时对redis服务器进行身份验证.
- redis_db: 池服务器上要使用的数据库编号。默认值为0。twemproxy将始终以db0的形式呈现给客户机
- server_connections: 可以打开到每个服务器的最大连接数。默认最多打开1个服务器连接
- auto_eject_hosts:用于当服务器连续请求失败超过限制次数时是否禁用该服务器。默认为false
- server_retry_timeout: 当auto_eject_hosts为true时,在要禁用服务器上重试之前等待的超时值(毫秒)。默认为30000毫秒.
- server_failure_limit: 当auto_eject_hosts为true时,连续请求失败超限次数,超过次数该redis节点被禁用。默认值为2。
- servers: 服务器池的服务器地址、端口、权重.
2、配置nutcracker.yml
安装后会在/usr/local/twemproxy 生成 sbin share,sbin下为nutcraker命令,share下为nutcraker.8命令
需要把twemproxy-master下conf的配置nutcracker.yml复制到/usr/local/twemproxy下
编辑vim /usr/local/twemproxy/conf/nutcracker.yml配置文件如下
alpha:
listen: 192.168.172.71:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 3000
server_failure_limit: 3
servers:
- 192.168.172.72:6379:1
- 192.168.172.73:6379:1
- 192.168.172.74:6379:1
listen后为twmeproxy所在节点,servers为每个redis节点,distribution采用一致性哈希算法ketama
3、测试配置
配置完成了,测试下nutcracker.yml在语法 上是否有误
/usr/local/twemproxy/sbin/nutcracker -t /usr/local/twemproxy/conf/nutcracker.yml
正确显示如下:
nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok
四、启动nutcracker
进入到安装路径/usr/local/twemproxy下
启动命令:sbin/nutcracker -d -c conf/nutcracker.yml -o logs/log.log -p ./twemproxy.pid
-d守护进程启动,-c指定配置文件,o指定日志文件路径,日志需要自己创建,-p指定pid保存路径
/usr/local/twemproxy/sbin/nutcracker --help命令详细参数如下
This is nutcracker-0.4.1
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]
Options:
-h, --help : this help
-V, --version : show version and exit
-t, --test-conf : test configuration for syntax errors and exit
-d, --daemonize : run as a daemon
-D, --describe-stats : print stats description and exit
-v, --verbose=N : set logging level (default: 5, min: 0, max: 11)
-o, --output=S : set logging file (default: stderr)
-c, --conf-file=S : set configuration file (default: conf/nutcracker.yml)
-s, --stats-port=N : set stats monitoring port (default: 22222)
-a, --stats-addr=S : set stats monitoring ip (default: 0.0.0.0)
-i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)
-p, --pid-file=S : set pid file (default: off)
-m, --mbuf-size=N : set size of mbuf chunk in bytes (default: 16384 bytes)