当前位置: 首页 > news >正文

基于HAProxy的高性能缓存服务器nuster

Nuster是一个基于HAProxy的高性能缓存服务器

https://github.com/jiangwenyu...

介绍

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]

default: none

context: global

控制是否开启缓存。
可以设置data-size来控制缓存数据的内存使用量。可以使用m, M, gG.
默认是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.html
filter cache
cache-rule all ttl 3600
cache-rule path01 ttl 60 if pathA

path01这条规则永远不会执行,因为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

Example

GET http://www.example.com/q?name=X&type=Y

http header:
GET /q?name=X&type=Y HTTP/1.1
Host: www.example.com
ASDF: Z
Cookie: logged_in=yes; user=nuster;

会得到:

  • method: GET
  • scheme: http
  • host: www.example.com
  • path: /q
  • query: name=X&type=Y
  • header_ASDF: Z
  • cookie_user: nuster
  • param_type: Y
  • body: (empty)

所以默认的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会缓存任何状态码。

cache-rule only200
cache-rule 200and404 code 200,404
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

global
    cache on data-size 100m
    #daemon
    ## to debug cache
    #debug
defaults
    retries 3
    option redispatch
    timeout client  30s
    timeout connect 30s
    timeout server  30s
frontend web1
    bind *:8080
    mode http
    acl pathPost path /search
    use_backend app1a if pathPost
    default_backend app1b
backend app1a
    balance roundrobin
    # mode must be http
    mode http

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

    acl pathPost path /search

    # enable cache for this proxy
    filter cache

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

    server s1 10.0.0.10:8080
backend app1b
    balance     roundrobin
    mode http

    filter cache on

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

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

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

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

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

    server s1 10.0.0.10:8080

frontend web2
    bind *:8081
    mode http
    default_backend app2
backend app2
    balance     roundrobin
    mode http

    # disable cache on this proxy
    filter cache off
    cache-rule all

    server s2 10.0.0.11:8080

listen web3
    bind *:8082
    mode http

    filter cache
    cache-rule everything

    server s3 10.0.0.12:8080

相关文章:

  • [20171106]配置客户端连接注意.txt
  • 分享Silverlight/WPF/Windows Phone一周学习导读(07月25日-07月31日)
  • Python类的一般形式和继承
  • ArcGIS 10.5 新功能
  • 局域网内手机播放视频
  • Ubuntu Server 10.10 操作手记
  • JavaScript 基本功--面试宝典
  • Oracle Number用法
  • Linux下随机10字符病毒的清除
  • wbadmin执行备份命令
  • Oracle Study之案例--通过IPCS查看共享内存之“怪现象”
  • DVDROM驱动不能加载的问题
  • 【驱动】linux设备驱动·扫盲
  • 对Context的重新思考
  • 在RHEL5下构建LAMP网站服务平台之架设Discuz!论坛
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Amaple教程】5. 插件
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Docker: 容器互访的三种方式
  • Javascript 原型链
  • mysql 5.6 原生Online DDL解析
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue学习系列(二)vue-cli
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 无服务器化是企业 IT 架构的未来吗?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​configparser --- 配置文件解析器​
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (4) PIVOT 和 UPIVOT 的使用
  • (AngularJS)Angular 控制器之间通信初探
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (分布式缓存)Redis哨兵
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (转)原始图像数据和PDF中的图像数据
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net程序集学习心得
  • .NET企业级应用架构设计系列之技术选型
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ JavaScript ] JSON方法
  • [ NOI 2001 ] 食物链
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [ajaxupload] - 上传文件同时附件参数值
  • [C++]拼图游戏
  • [C语言]编译和链接
  • [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
  • [java后端研发]——文件上传与下载(2种方式)
  • [LeetCode]剑指 Offer 40. 最小的k个数
  • [Linux] Boot分区满了的处理方法 The volume boot has only 0 bytes disk space remaining
  • [Luogu P3527BZOJ 2527][Poi2011]Meteors(整体二分+BIT)