`
异步获取爱
  • 浏览: 77614 次
  • 性别: Icon_minigender_1
  • 来自: 大男子主义世界
社区版块
存档分类
最新评论

twemproxy 环境搭建

    博客分类:
  • job
阅读更多

     首先介绍下twemproxy,是一个轻量级的管理cache集群的,主要服务对象是memcached集群和redis集群。策略,主流是以几台节点间的数据备份,防止单点挂掉。笔者公司主要用于memcached的集群管理,防止单点挂机。

     经过笔者两天的摸索,终于把twemproxy搭建起来了。可谓饱经风霜。    
     首先我想说的是,本来是想在自己的mac上搭的,但是经过一天的各种失败,google,百度,各大论坛等等。最后的结论是,目前mac暂时无法搭建该环境(或者说本人的能力暂时无法搞定)。安装twemproxy的时候,需要呦ranlib,libtool等依赖,但是,坑爹的是,mac本身有自带的libtool,和linux上的,有语法上很多的差异。而安装编译的文件内部充斥着linux的libtool的命令,笔者表示相当郁闷。

      于是在ubuntu上进行了安装,安装也出奇的顺利。(shit~~~)

       基本安装步骤如下:

1.从git上将最新的code clone下来。

$ git clone https://github.com/twitter/twemproxy.git 


2.开始编译,安装
$ cd  twemproxy/

$ CFLAGS="-ggdb3 -O0" autoreconf -fvi && ./configure --enable-debug=log && make && sudo make install 


3.上一步的,可能会有一些依赖包要先安装,安装后再执行下编译安装即可。

4.开启twemproxy
虽然,安装编译会在/usr/bin里有nutcracker的快捷,但是切记不能这样开启。需要:

$ cd twemproxy/

$ /src/nutcracker  -t    ##先测试下配置文件是否正确


配置文件是conf/nutcracker.yml ,如果 -t 测试通过,则可以进行启动,配置好自己的环境。

$  /src/nutcracker


环境
  • ubuntu10.2
  • macos  10.8.2
  • twemproxy  2.2.0


[size=medium]后期有时间需要深入理解,针对业务也会有相应的代码修改。

编译过程中,会有m4或者autoconf的参数错误。如果你是手动编译这些lib的话,可能需要编译到twemproxy的指定目录下,记忆中好像是/usr/local/share目录下。具体可以参看编译的错误信息。





=================== 分隔线 ===================


参数篇


src/nutcracker.yml

clstuer1:
  listen: 0.0.0.0:9999             #使用哪个端口启动Twemproxy
  redis: true                            #是否是Redis的proxy
  hash: fnv1a_64                    #指定具体的hash函数
  distribution: ketama             #具体的hash算法
  auto_eject_hosts: true          #是否在结点无法响应的时候临时摘除结点
  timeout: 400                        #超时时间(毫秒)
  server_retry_timeout: 2000  #重试的时间(毫秒)
  server_failure_limit: 1           #结点故障多少次就算摘除掉
  servers:                                #下面表示所有的Redis节点(IP:端口号:权重  别名)
   - 192.168.0.22:6379:1  node1
   - 192.168.0.22:6380:1  node2
   - 192.168.0.22:6381:1  node3
   - 192.168.0.23:6381:2  node4


=================== 分隔线 ===================
启动篇

#查看命令信息
./src/nutcracker -h
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, --verbosity=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)
#查看命令信息
#启动命令
1. 为了方便调试启动
./src/nutcracker -c /opt/module/twenproxy/conf/nutcracker.xrk.yml
2.守护进程启动
./src/nutcracker -d -c /opt/module/twenproxy/conf/nutcracker.xrk.yml



=================== 分隔线 ===================

现实篇


twemproxy 有无数的优点,数据节点间的自动备份等等,都是优点。显著的缺点文章里也有提到,比如
1. 虽然可以动态移除节点,但该移除节点的数据就丢失了。
2. redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布.maillist里面作者说这个需要自己写个脚本实现
3. 性能上的损耗(其实作为代理  必定会有损耗, twemproxy损耗属于很小的级别了)
4. 不支持针对多个值的操作,比如取sets的子交并补等(MGET 和 DEL 除外)
5. 不支持Redis的事务操作
6. 出错提示还不够完善


以上是各大站包括github上一些人提出的,下面回到自我现实。发现问题,解决问题。

Q1:
各种语言的memcached,redis的客户端针对twemproxy,都会有一些不兼容。举个jedis的例子:
发送数据时候,会接受到jedis发送的一些其他的command,贴一下log
[Thu Aug 29 17:09:24 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:24 2013] nc_core.c:205 close c 9 '192.168.10.195:52175' on event 00FF eof 0 done 0 rb 23202 sb 1452: Invalid argument
[Thu Aug 29 17:09:24 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:24 2013] nc_core.c:205 close c 35 '192.168.10.195:52473' on event 00FF eof 0 done 0 rb 7107 sb 444: Invalid argument
[Thu Aug 29 17:09:24 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:24 2013] nc_core.c:205 close c 14 '192.168.10.195:51867' on event 00FF eof 0 done 0 rb 46743 sb 2924: Invalid argument
[Thu Aug 29 17:09:24 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:24 2013] nc_core.c:205 close c 31 '192.168.10.195:52348' on event 00FF eof 0 done 0 rb 11309 sb 708: Invalid argument
[Thu Aug 29 17:09:24 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:24 2013] nc_core.c:205 close c 24 '192.168.10.195:52202' on event 00FF eof 0 done 0 rb 21346 sb 1336: Invalid argument
[Thu Aug 29 17:09:24 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:24 2013] nc_core.c:205 close c 27 '192.168.10.195:52458' on event 00FF eof 0 done 0 rb 12483 sb 780: Invalid argument
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 9 on p 6 from '192.168.10.195:52602'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 14 on p 6 from '192.168.10.195:52603'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 15 on p 6 from '192.168.10.195:52604'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 23 on p 6 from '192.168.10.195:52606'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 24 on p 6 from '192.168.10.195:52605'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 27 on p 6 from '192.168.10.195:52607'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 29 on p 6 from '192.168.10.195:52608'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 31 on p 6 from '192.168.10.195:52609'
[Thu Aug 29 17:09:25 2013] nc_proxy.c:336 accepted c 35 on p 6 from '192.168.10.195:52610'
[Thu Aug 29 17:09:26 2013] nc_redis.c:923 parsed unsupported command 'QUIT'
[Thu Aug 29 17:09:26 2013] nc_core.c:205 close c 39 '192.168.10.195:52314' on event 00FF eof 0 done 0 rb 30008 sb 1876: Invalid argument



以前用的一些memcached的client也会出现version的command错误等等。虽然异常无伤大雅,但是对于有洁癖的人来说。。。。还是无法忍受。

解决方案:
自己fork出一个客户端的版本吧。


Q2:
虽然twemproxy是缓存集群代理,可以对单点出现问题进行剔除和重试链接。但是。。。 要是这个proxy的管理节点挂了。。那岂不是。。惨淡了。。。

解决方案:
目前我的测试环境里3格redis节点,用3个proxy来管理,每个proxy都管理3个节点。连接3个proxy都可以。 (待明天测试各种挂点的情况,会贴出详细的分析报告!)










分享到:
评论
6 楼 cyflhn 2015-02-16  
redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布.maillist里面作者说这个需要自己写个脚本实现. 能提供一下具体的脚本实现吗 或者maillist的链接地址也行,谢谢了。
5 楼 caiyiyong 2015-02-05  
jianglijian2422323 写道
问下楼主,这个确定是做到集群 么?集群的效果是一台集群上有数据,其他群内的集群都有数据了,但我测了下好像是两台机器插入的数据是不同步的,只是分布式,两台集群上的数据是不一样的,并没集群的效果,所以想和楼主确定下,或者能不能给个联系方式咨询下,谢谢!




肯定每台cache 的数据不一样的,  又不是双主   这个集群是通过一致性哈希来构建的  是哈希环而不是常见的传统分发
4 楼 kennykinte 2014-11-17  
twemproxy需要用到epoll,epoll是Linux下的。
mac osx是FreeBSD的后代,是unix家族的,用的是kqueue。
所以你当然没法在mac 上装了。。。
3 楼 异步获取爱 2013-08-27  
jianglijian2422323 写道
问下楼主,这个确定是做到集群 么?集群的效果是一台集群上有数据,其他群内的集群都有数据了,但我测了下好像是两台机器插入的数据是不同步的,只是分布式,两台集群上的数据是不一样的,并没集群的效果,所以想和楼主确定下,或者能不能给个联系方式咨询下,谢谢!


twemproxy 核心功能就是防止集群内挂点造成的数据丢失。 twemproxy的数据节点间会保持数据通信,使得节点的数据会备份到其他节点上。   而你只需要连接主节点去获取数据 ,而不需要再关注数据节点间的任何动作。   顺便提下国内有个mangant,也是做cache的集群代理的,原理是用一个节点做备份节点,备份所有节点的数据。可以做下对比。   不太看消息,貌似好久了,抱歉!
2 楼 yx1989 2013-06-04  
jianglijian2422323 写道
问下楼主,这个确定是做到集群 么?集群的效果是一台集群上有数据,其他群内的集群都有数据了,但我测了下好像是两台机器插入的数据是不同步的,只是分布式,两台集群上的数据是不一样的,并没集群的效果,所以想和楼主确定下,或者能不能给个联系方式咨询下,谢谢!

肯定是不一样的,memcached 的机制就是大家是互补的。
1 楼 jianglijian2422323 2013-05-10  
问下楼主,这个确定是做到集群 么?集群的效果是一台集群上有数据,其他群内的集群都有数据了,但我测了下好像是两台机器插入的数据是不同步的,只是分布式,两台集群上的数据是不一样的,并没集群的效果,所以想和楼主确定下,或者能不能给个联系方式咨询下,谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics