欢迎您来到腾讯云!积分商城

腾讯云腾讯云论坛

 找回密码
 立即注册
忘了密码?

扫一扫,访问微社区

快捷导航
搜索
查看: 396|回复: 0

[行业资讯] 基于HAProxy的高性能缓存服务器nuster

[复制链接]

1

主题

0

好友

70

积分

小白[LV1]

Rank: 1

云币
200
威望
70
发表于 2017-12-26 15:58:57 |显示全部楼层
Nuster是一个基于HAProxy的高性能缓存服务器

https://github.com/jiangwenyuan/nuster
介绍Nuster是一个基于HAProxy的高性能缓存服务器。Nuster完全兼容HAProxy,并且利用
HAProxy的ACL功能来提供非常细致的缓存规则,比如

  • 请求地址为某某时缓存
  • 请求参数中的X为Y时缓存
  • 响应头中的X为Y时缓存
  • 请求速率超过多少时缓存
  • 等等

性能非常快, 单进程模式下是nginx的3倍,多进程下nginx的2倍,varnish的3倍。

详见benchmark

安装

make TARGET=linux2628
make install

具体参照HAProxy README

使用方法global中添加cache on, 然后在backendlisten中添加cache filter和cache rule

指令

cache

syntax: cache on|off [data-size size] [dict-size size] [share on|off]
default: none
context: global
控制是否开启缓存。
可以设置data-size来控制缓存数据的内存使用量。可以使用m, M, g 和 G.
默认是1MB,同时也是最小使用量。只有http内容计算在内,并不包括使用缓存带来的内存开销。

filter cache

syntax: filter cache [on|off]
default: on
context: backend, listen
定义一个cache filter, 另外cache-rule也需要添加。
可以为多个代理添加,并单独设置某个代理的缓存是否开启。
如果定义了多个filter,需要把cache filter放在最后。

cache-rule

syntax:
cache-rule name [key KEY] [ttl TTL] [code CODE] [if|unless condition]
default: none
context: backend, listen
定义缓存规则。可以同时定义多个,但是需要注意顺序,匹配则会停止测试。
acl pathA path /a.htmlfilter cachecache-rule all ttl 3600cache-rule path01 ttl 60 if pathApath01这条规则永远不会执行,因为all会匹配所有的规则。
name定义一个名字。
key KEY定义key,由以下关键字组成:
  • method:       http method, GET/POST...
  • scheme:       http or https
  • host:         the host in the request
  • path:         the URL path of the request
  • query:        the whole query string of the request
  • header_NAME: the value of header NAME
  • cookie_NAME: the value of cookie NAME
  • param_NAME:  the value of query NAME
  • body:         the body of the request
默认key是method.scheme.host.path.query.body
  1. Example
  2. GET <a  target="_blank">http://www.example.com/q?name=X&type=Yhttp</a>
  3. header:
  4. GET /q?name=X&type=Y HTTP/1.1
  5. Host: <a  target="_blank">www.example.com
  6. ASDF:</a> Z
  7. Cookie: logged_in=yes; user=nuster;
  8. 会得到:
  9. <ul><li>method:       GET</li><li>scheme:       http</li><li>host:         <a  target="_blank">www.example.com</a></li><li>path:         /q</li><li>query:        name=X&type=Y</li><li>header_ASDF: Z</li><li>cookie_user: nuster</li><li>param_type:  Y</li><li>body:         (empty)</li></ul>
复制代码
所以默认的key就会得到GEThttpwww.example.com/qname=X&type=Y, 而
key method.scheme.host.path.header_ASDF.cookie_user.param_type则会生成
GEThttpwww.example.com/qZnusterY
一个请求的key能在缓存中找到则返回缓存内容。

ttl TTL定义key的失效时间,可以使用 d, h, m and s。默认3600秒.
如果不希望失效则设为0

code CODE1,CODE2...默认只缓存200的响应,如果需要缓存其他的则可以添加,all会缓存任何状态码。
  1. cache-rule only200
  2. cache-rule 200and404 code 200,404
  3. cache-rule all code all
复制代码


if|unless condition
定义ACL条件
详见HAProxy configuration的7. Using ACLs and fetching samples

FAQ

如何调试?
在global添加debug, 或者带-d启动haproxy
缓存相关的调试信息以[CACHE]开头

如何缓存POST请求?
添加option http-buffer-request
如果自定义了key的话需要使用body关键字
请求body可能不完整,详见HAProxy configuration 的
option http-buffer-request小节
另外可以为post请求单独设置一个后端

Example
  1. global
  2.     cache on data-size 100m
  3.     #daemon
  4.     ## to debug cache
  5.     #debug
  6. defaults
  7.     retries 3
  8.     option redispatch
  9.     timeout client  30s
  10.     timeout connect 30s
  11.     timeout server  30s
  12. frontend web1
  13.     bind *:8080
  14.     mode http
  15.     acl pathPost path /search
  16.     use_backend app1a if pathPost
  17.     default_backend app1b
  18. backend app1a
  19.     balance roundrobin
  20.     # mode must be http
  21.     mode http

  22.     # http-buffer-request must be enabled to cache post request
  23.     option http-buffer-request

  24.     acl pathPost path /search

  25.     # enable cache for this proxy
  26.     filter cache

  27.     # cache /search for 120 seconds. Only works when POST/PUT
  28.     cache-rule rpost ttl 120 if pathPost

  29.     server s1 10.0.0.10:8080
  30. backend app1b
  31.     balance     roundrobin
  32.     mode http

  33.     filter cache on

  34.     # cache /a.jpg, not expire
  35.     acl pathA path /a.jpg
  36.     cache-rule r1 ttl 0 if pathA

  37.     # cache /mypage, key contains cookie[userId], so it will be cached per user
  38.     acl pathB path /mypage
  39.     cache-rule r2 key method.scheme.host.path.query.cookie_userId ttl 60 if pathB

  40.     # cache /a.html if response's header[cache] is yes
  41.     http-request set-var(txn.pathC) path
  42.     acl pathC var(txn.pathC) -m str /a.html
  43.     acl resHdrCache1 res.hdr(cache) yes
  44.     cache-rule r3 if pathC resHdrCache1

  45.     # cache /heavy for 100 seconds if be_conn greater than 10
  46.     acl heavypage path /heavy
  47.     acl tooFast be_conn ge 100
  48.     cache-rule heavy ttl 100 if heavypage tooFast

  49.     # cache all if response's header[asdf] is fdsa
  50.     acl resHdrCache2 res.hdr(asdf)  fdsa
  51.     cache-rule resCache ttl 0 if resHdrCache1

  52.     server s1 10.0.0.10:8080

  53. frontend web2
  54.     bind *:8081
  55.     mode http
  56.     default_backend app2
  57. backend app2
  58.     balance     roundrobin
  59.     mode http

  60.     # disable cache on this proxy
  61.     filter cache off
  62.     cache-rule all

  63.     server s2 10.0.0.11:8080

  64. listen web3
  65.     bind *:8082
  66.     mode http

  67.     filter cache
  68.     cache-rule everything

  69.     server s3 10.0.0.12:8080
复制代码
您需要登录后才可以回帖 登录 | 立即注册
您需要登录后才可以发帖 QQ登录

联系我们|腾讯云平台|积分商城|腾讯云官方论坛    

GMT+8, 2018-5-21 05:44 , Processed in 1.164745 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部