基于HAProxy的高性能緩存服務器nuster

Nuster是一個基于HAProxy的高性能緩存服務器

https://github.com/jiangwenyuan/nuster

介紹

Nuster是一個基于HAProxy的高性能緩存服務器叁鉴。Nuster完全兼容HAProxy,并且利用
HAProxy的ACL功能來提供非常細致的緩存規(guī)則,比如

  • 請求地址為某某時緩存
  • 請求參數(shù)中的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來控制緩存數(shù)據(jù)的內存使用量焦辅〔┱龋可以使用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

定義緩存規(guī)則≥航常可以同時定義多個金吗,但是需要注意順序,匹配則會停止測試趣竣。

acl pathA path /a.html
filter cache
cache-rule all ttl 3600
cache-rule path01 ttl 60 if pathA

path01這條規(guī)則永遠不會執(zhí)行摇庙,因為all會匹配所有的規(guī)則。

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會緩存任何狀態(tài)碼码秉。

cache-rule only200
cache-rule 200and404 code 200,404
cache-rule all code all

if|unless condition

定義ACL條件
詳見HAProxy configuration7. 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小節(jié)

另外可以為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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末转砖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲸伴,更是在濱河造成了極大的恐慌府蔗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汞窗,死亡現(xiàn)場離奇詭異姓赤,居然都是意外死亡,警方通過查閱死者的電腦和手機仲吏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門不铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝌焚,“玉大人,你說我怎么就攤上這事狂男∽劭矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵岖食,是天一觀的道長红碑。 經常有香客問我,道長泡垃,這世上最難降的妖魔是什么析珊? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔑穴,結果婚禮上忠寻,老公的妹妹穿的比我還像新娘。我一直安慰自己存和,他們只是感情好奕剃,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捐腿,像睡著了一般纵朋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茄袖,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天操软,我揣著相機與錄音,去河邊找鬼宪祥。 笑死聂薪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蝗羊。 我是一名探鬼主播藏澳,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耀找!你這毒婦竟也來了翔悠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涯呻,失蹤者是張志新(化名)和其女友劉穎凉驻,沒想到半個月后腻要,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體复罐,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年雄家,在試婚紗的時候發(fā)現(xiàn)自己被綠了效诅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乱投,靈堂內的尸體忽然破棺而出咽笼,到底是詐尸還是另有隱情,我是刑警寧澤戚炫,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布剑刑,位于F島的核電站,受9級特大地震影響双肤,放射性物質發(fā)生泄漏施掏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一茅糜、第九天 我趴在偏房一處隱蔽的房頂上張望七芭。 院中可真熱鬧,春花似錦蔑赘、人聲如沸狸驳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耙箍。三九已至,卻和暖如春峦筒,著一層夾襖步出監(jiān)牢的瞬間究西,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工物喷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卤材,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓峦失,卻偏偏與公主長得像扇丛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尉辑,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理帆精,服務發(fā)現(xiàn),斷路器隧魄,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • =========================================================...
    lavor閱讀 3,488評論 0 5
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc閱讀 2,860評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法卓练,類相關的語法,內部類的語法购啄,繼承相關的語法襟企,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • -1- 表妹今年剛高考完曼振,前兩天她興沖沖跑來問我,“姐蔚龙,你覺得大學里加入哪個學生組織比較好冰评?” 我被問得一臉懵逼,...
    共央君閱讀 5,812評論 104 170