启动命令 ./nutcracker -d -o nut.logtwitter/twemproxy使用,启动命令 ./nutcracker -d -o nut.log
vi conf/nutcracker.yml
gamma:
listen: 192.168.171.52:22123
hash: fnv1a_64
redis: true
distribution: ketama
timeout: 1000
backlog: 10240
preconnect: false
server_connections: 20000
auto_eject_hosts: false
server_retry_timeout: 2000
server_failure_limit: 5
servers:
- 192.168.171.52:6378:1
- <span style="font-family: Arial, Helvetica, sans-serif;">192.168.161.157:6378:1</span>
servers中 是IP:端口:权重
curl http://192.168.171.52:22222 查看twemproxy统计指标,返回json格式内容。内容中每个属性说明,如下
./nutcracker -D
This is nutcracker-0.4.1
pool stats:
client_eof "# eof on client connections"
client_err "# errors on client connections"
client_connections "# active client connections"
server_ejects "# times backend server was ejected"
forward_error "# times we encountered a forwarding error"
fragments "# fragments created from a multi-vector request"
server stats:
server_eof "# eof on server connections"
server_err "# errors on server connections"
server_timedout "# timeouts on server connections"
server_connections "# active server connections"
server_ejected_at "timestamp when server was ejected in usec since epoch"
requests "# requests"
request_bytes "total request bytes"
responses "# responses"
response_bytes "total response bytes"
in_queue "# requests in incoming queue"
in_queue_bytes "current request bytes in incoming queue"
out_queue "# requests in outgoing queue"
out_queue_bytes "current request bytes in outgoing queue"
问题说明:
[2016-06-17 09:12:29.376] nc_redis.c:1092 parsed unsupported command 'keys'
twemproxy代理redis的情况,不支持一些指令。这里错误说的是Keys指令不支持
更多配置说明,参考:
http://blog.itpub.net/20625855/viewspace-1692022/
重要的说明,摘录如下:
1、log level:
推荐编译时候打开日志,使用等级6记录日志信息
2、liveness:
分布式事务,failure将会是常态,为了应对failure,推荐为每一个server pool配置如下:
resilient_pool:
auto_eject_hosts: true
server_retry_timeout: 30000
server_failure_limit: 3
auto_eject_hosts,server_failure_limit:确保dead server会被驱逐出hash环
server_retry_timeout:确保闪断的server不会被标记成dead server
3、timeout:
nutceacker通常需要配置timeout,而不是依赖客户端的超时配置:
resilient_pool_with_timeout:
auto_eject_hosts: true
server_retry_timeout: 30000
server_failure_limit: 3
timeout: 400
默认场景,nutcracker一直等到请求发送到server,配置timeout后,请求
超时后将会返回错误信息( SERVER_ERROR Connection timed out\r\n (memcached)
or -ERR Connection timed out\r\n (redis))
4、 error response:
发现错误信息返回的情况,可以认为是一个客户端的瞬间失效,最好重新发起请求
5、read, writev and mbuf
所有的请求和响应都在mbuf里面,mbuf默认大小是16K(512b-16M),可以使用
-m or -mbuf-size=N来配置,每一个连接都会获得至少一个mbuf,这意味着nutcracker支持的
并发的连接数依赖于mbuf的大小,小的mbuf可以控制更多的连接,大的mbuf可以让我们
读或者写更多的数据导socker buffer。如果并发量很大的场景,推荐使用比较小的mbuf(512 or 1K)
6、mbuf-size=N
每一个客户端连接最好需要一个mbuf,一个服务请求最少是两个连接(client->proxy、proxy->server)
所以最少需要两个mbufs
1000个客户端连接的场景计算:1000*2*mbuf=32M,如果每个连接有10个操作,这个值将会是320M,假设
连接是10000,那么将会消耗3.2G内存!这种场景下最好调小mbuf值比如512b,1000*2*512*10=10M
这个就是当并发量高的场景下使用小的mbuf的原因
7、key长度:
memcached的长度上限是250, redis没有类似限制,但是nutcracker需要key存储在连续的内存里面,而因为
所有的请求和响应都在mbuf中,所以redis key的长度将会受限制于mbuf,也就是说如果你的redis实例如果要
操作超长的key,你必须把mbuf调大
listen:
监听地址和端口(name:port 或者ip:port),也可以用sock文件(/var/run/nutcracker.sock)的绝对路径
hash: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的部分做hash运算。
例如两个key aaaa,xxx:{aaaa}:xxxx;指定{}中间部分做hash运算
他们将被分配到同一server(找不到的场景使用完整的key做hash)
distribution: 数据分配方式:
ketama:一致性hash算法,根据server构造hash ring,为每个阶段分配hash范围
它的优点是一个节点down后,整个集群re-hash,有部分key-range会跟之
前的key-range重合,所以它只能合适做单纯的cache
modula:根据key做hash值取模,根据结果分配到对应的server
这种方式如果集群做re-hash,所有的key值都会目标错乱
random:不管key值的hash结果是啥,随机选取一个server作为操作目标
适合只读场景,需要配合数据加载?
timeout:单位毫秒,等待到server建立连接的时间或者接收server相应过程的等待时间
默认是无限期等待
等待超时报错:SERVER_ERROR Connection timed out
backlog:TCP backlog队列,默认512
preconnect: 在进程启动的时候,twemproxy是否需要预连接到所有的server,默认值是false
redis:使用redis还是memcached协议,默认false(即memcached)
redis_auth: 连接redisserver的验证
server_connections:每一个server能够打开的最大连接值,默认最大是1
auto_eject_host: 当连接一个server失败次数超过server_failure_limit值时,是否把这个
server驱逐出集群,默认是false
server_retry_timeout:单位毫秒,当auto_eject_host打开后,重试被临时驱逐的server之前
的等待时间
server_failure_limit: 当auto_eject_host打开后,驱逐一个server之前重试次数
servers: serverpool中包含的的server的地址、端口和权重的列表(name:port:weight or ip:port:weight)