如果你是通过google或者百度通过twemproxy redis之类的关键词搜到我的这篇文章,那么你大概已经了解了twemproxy用途。简单来说,twemproxy是twitter开发的一个redis代理proxy。如果使用过nginx的反向代理或者mysql的代理工具,如amoeba,你也能很快理解这个redis proxy。如果你第一次接触到这个概念,不理解proxy,那就举个例子吧-: 。你可以把公司前台的MM看作一个proxy,你是个送快递的,你可以通过这个妹子替你代理把你要送达的包裹给公司内部的人,而你不用知道公司每个人座位在哪里。Twemproxy可以把多台redis server当作一台使用,开发人员通过twemproxy访问这些redis servers 的时候不用关心到底去哪一台redis server读取k-v数据或者把k-v数据更新到数据集中。
通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。比如我所在的公司,只使用一台redis server进行读写(前端台web servers共用),但是还有一台slave server一直在同步这台生产服务器的数据。这样做就是为了防止这台单一的生产服务器出现故障时能够有一个“备胎”,可以把前端的redis数据读写请求切换到从服务器上,web程序因而不需要直接去访问mysql数据库。再借助于haproxy(又是proxy,^.^)或者VIP技术可以实现一个简单的HA方案,可以避免单点故障。但是这种简单的Master-Slave“备胎”方案不能扩张整个redis的容量[如果用系统内存大小衡量,且不考虑内存不足时把数据swap到磁盘上],最大容量由所有的redis servers中最小内存决定的【木桶的短板】。
Twemproxy可以把数据sharding到多台服务器的上(看见有人说Twemproxy中的服务器可以共享数据,难以理解!share or shard?),每台服务器存储着整个数据集的一部分。因而,当某一台redis服务器宕机了,那么也就失去了一部分数据。如果借助于redis的master-slave replication,能保证在任何一台redis不能工作情况下,仍然能够保证能够存在一个整个数据集的完全覆盖,那么整个redis group(或者称作cluster)仍然能够正常工作。
废话说了半天,都是架构方面比较“高深”的东西,那就来点“低俗”的东西。先说说twemproxy的安装配置方面,安装好了再折腾折腾。twemproxy的资料可以查看Twitter在GitHup上的twemproxy开源项目。twemproxy的开发者Salvatore Sanfilippo博客Antirez weblog也有很多这方面的资料和观点分享,下面两篇文章我看的比较仔细,受益匪浅。
1) Twemproxy, a Redis proxy from Twitter
2) Redis data model and eventual consistency
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直接make和make install即可。
twemproxy的安装方法与git上README.md里面的过程基本相同,只是configure过程中多了–prefix选项,个人比较偏爱把一些工具软件安装到指定的目录:-)
cd twemproxy
autoreconf -fvi
./configure --prefix=/usr/local/twemproxy
make -j 8
make install
2、配置文件
添加pid文件目录和配置文件conf目录
cd /usr/local/twemproxy
mkdir run conf
添加proxy配置文件
cd conf
vim nutcracker.yml
alpha:
listen: 127.0.0.1:22222
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 30000
server_failure_limit: 1
servers:
- 192.168.1.10:6379:1 master0
- 192.168.1.7:6379:1 master1
3、启动twemproxy服务
nutcracker -t 测试配置文件
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)
(added 2014年7月15日 12:30:32)
最近在新的公司要上twemproxy方案了,使用过程中出现了一下小问题:
1).yml配置文件中每个参数值对分隔符”:”后需要有一个空格
2)不同层次的参数需要缩进区分,最好使用tab键缩进,否则nutcracker进程不能启动。
3)在auto_eject_hosts: true的时候,关闭一个redis实例后,写入数据还是提示“(error) ERR Connection refused”。这个与server_retry_timeout参数设置太小有关,默认值30000msec是一个很好的选择。
学习了
Pingback引用通告: (转)twemproxy的参数解析和监控 – BiduTools.com聚合、分享