1.总论
twemproxy,也叫nutcraker。是一个twtter开源的一个redis和memcache代理服务器。 redis作为一个高效的缓存服务器,非常具有应用价值。但是当使用比较多的时候,就希望可以通过某种方式 统一进行管理。避免每个应用每个客户端管理连接的松散性。同时在一定程度上变得可以控制。 搜索了不少的开源代理项目,知乎实现的python分片客户端。node的代理中间层,还有各种restfull的开源代理。
-
RedBrige
- C + epoll实现的一个小的webserver
- redis自身执行lua脚本的功能来执行redis命令
- 访问时在url中带上lua脚本文件的名字,直接调用执行该lua脚本
- 本质是通过http协议远程执行lua脚本
-
Webdis
- libevent, http-parser...实现的小型web服务器
- C 语言实现,通过unix-socket,TCP调用redis命令。
- 访问方法:
/cmd/key/arg0,arg1,...
实质是对redis命令的简单变换
-
redis-proxy
- 使用node写的redis代理层。
- 支持主从节点的失败处理(可以仔细研究)
- 测试后发现性能为原生的1/3
-
twemproxy
-
支持失败节点自动删除
- 可以设置重新连接该节点的时间
- 可以设置连接多少次之后删除该节点
- 该方式适合作为cache存储
-
支持设置HashTag
- 通过HashTag可以自己设定将两个KEYhash到同一个实例上去。
-
减少与redis的直接连接数
- 保持与redis的长连接
- 可设置代理与后台每个redis连接的数目
-
自动分片到后端多个redis实例上
- 多种hash算法(部分还没有研究明白)
- 可以设置后端实例的权重
-
避免单点问题
- 可以平行部署多个代理层.client自动选择可用的一个
-
支持redis pipelining request
-
支持状态监控
- 可设置状态监控ip和端口,访问ip和端口可以得到一个json格式的状态信息串
- 可设置监控信息刷新间隔时间
-
高吞吐量
- 连接复用,内存复用。
- 将多个连接请求,组成reids pipelining统一向redis请求。
-
另外可以修改redis的源代码,抽取出redis中的前半部分,作为一个中间代理层。最终都是通过linux下的epoll 事件机制提高并发效率,其中nutcraker本身也是使用epoll的事件机制。并且在性能测试上的表现非常出色。
配置部署建议: 编译时候打开logging模块。
redis部署知识: AOF;一种记录redis写操作的文件,用于恢复redis数据。
Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。不熟悉twemproxy的同学,如果玩过nginx反向代理或者mysql proxy,那么你肯定也懂twemproxy了。其实twemproxy不光实现了redis协议,还实现了memcached协议,什么意思?换句话说,twemproxy不光可以代理redis,还可以代理memcached,官方说明:
twemproxy (pronounced "two-em-proxy"), aka nutcracker is a fast and lightweight proxy for memcachedand redis protocol. It was built primarily to reduce the number of connections to the caching servers on the backend. This, together with protocol pipeling and sharding enables you to horizontally scale your distributed caching architecture.
Twemproxy架构:
但是从上面我们可以看到这样以来Twemproxy就成了单点,所以通常会结合keepalived来实现Twemproxy的高可用。架构图如下:
上面的架构通常只有一台Twemproxy在工作,另外一台处于备机,当一台挂掉以后,vip自动漂移,备机接替工作。
2安装
1.编译安装:
autoconf下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
twemproxy下载地址:https://codeload.github.com/twitter/twemproxy/zip/master
twemproxy的安装要求autoconf的版本在2.64以上,否则提示"error: Autoconf version 2.64 or higher is required"。
查找旧版本autoconf,并且卸载
rpm -qf /usr/bin/autoconf rpm -e --nodeps autoconf-2.63
安装最新版本
tar zxvf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix=/usr make && make install
编译安装twemproxy
unzip twemproxy-master.zip cd twemproxy-master autoreconf -fvi ./configure --prefix=/usr/local/twemproxy make -j 8 make install
设置环境变量:
echo "PATH=$PATH:/usr/local/twemproxy/sbin/" >> /etc/profile source /etc/profile
2.创建相关目录(存放配置文件和pid文件)
cd /usr/local/twemproxy mkdir run conf
3.添加proxy配置文件
vim /usr/local/twemproxy/conf/nutcracker.yml
内容如下(配置文件参考官方)
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:7000:1 - 127.0.0.1:7001:1 - 127.0.0.1:7002:1 - 127.0.0.1:7003:1 - 127.0.0.1:7004:1 - 127.0.0.1:7005:1
我在本地安装了6个redis实例,不清楚的同学参考redis官网安装或者我前面的文章Redis安装以及主从实现。
4.启动Twemproxy服务
nutcracker -t 测试配置文件
测试配置文件这里有个小坑,本来以为要指定配置文件路径,于是这样检查配置文件:
[root@redis-server ~]# nutcracker -t /usr/local/twemproxy/conf/nutcracker.yml nutcracker: configuration file 'conf/nutcracker.yml' syntax is invalid
后来才反应过来是检查命令所在路径的conf下面的nutcracker.yml文件,于是把conf目录复制到/usr/local/twemproxy/sbin/目录下,再次进行检测:
[root@redis-server sbin]# pwd /usr/local/twemproxy/sbin [root@redis-server sbin]# ll total 808 drwxr-xr-x 2 root root 4096 Apr 10 03:02 conf -rwxr-xr-x 1 root root 819245 Apr 9 23:26 nutcracker [root@redis-server sbin]# ./nutcracker -t nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok [root@redis-server sbin]#
可以看见提示配置文件没有语法错误了。
启动命令:
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log
nutcracker用法与命令选项
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 : 查看帮助文档,显示命令选项 -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块大小,以bytes单位 (default: 16384 bytes)
查看进程,确认启动。
[root@redis-server run]# ps -ef | grep nutcracker | grep -v grep root 809 1 0 03:09 ? 00:00:00 nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log [root@redis-server run]#
5. 简单测试
[root@redis-server ~]# netstat -nltp | grep nutcracker tcp 0 0 0.0.0.0:22222 0.0.0.0:* LISTEN 809/nutcracker tcp 0 0 127.0.0.1:22121 0.0.0.0:* LISTEN 809/nutcracker [root@redis-server ~]# redis-cli -p 22121 127.0.0.1:22121> set name yaun OK 127.0.0.1:22121> get name "yaun" 127.0.0.1:22121>
http://www.cnblogs.com/gomysql/p/4413922.html
http://www.cnblogs.com/yuxingfirst/archive/2013/02/05/2892947.html
http://www.cnblogs.com/haoxinyue/p/redis.html